diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..7ade647 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,12 @@ +### Pull request checklist: +- [ ] Issue created + +**ReadMe** +- [ ] Block Diagram +- [ ] Results +- [ ] UserGuide + +**Documentation** +- [ ] Block Diagram +- [ ] Module description +- [ ] Results diff --git a/.github/workflows/linting_all_files.yml b/.github/workflows/linting_all_files.yml new file mode 100644 index 0000000..95e5643 --- /dev/null +++ b/.github/workflows/linting_all_files.yml @@ -0,0 +1,25 @@ +name: Linting All on Pull Request + +on: + pull_request: + types: [closed] + +jobs: + lintAllonPR: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Install Dependencies + run: | + pip install pylint + + - name: Fetch Main + run: | + git fetch origin main + git diff --name-only origin/main..HEAD + + - name: Run pylint on all files + run: | + find . -name "*.py" -exec pylint {} + \ No newline at end of file diff --git a/.github/workflows/linting_modified_files.yml b/.github/workflows/linting_modified_files.yml new file mode 100644 index 0000000..0b34de5 --- /dev/null +++ b/.github/workflows/linting_modified_files.yml @@ -0,0 +1,39 @@ +name: Linting on Pull Request + +on: + pull_request: + types: [opened,synchronize] + +jobs: + lintonPR: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Install Dependencies + run: | + pip install pylint + + - name: Fetch Main + run: | + git fetch origin main + git diff --name-only origin/main..HEAD + + - name: Run pylint on modified files + run: | + set -e + IFS=$'\n' + changed_files=$(git diff --name-only origin/main..HEAD | grep ".py$" || true) + if [ "$changed_files" ]; then + for file in $changed_files; do + if [ -e "$file" ]; then + echo "Linting $file" + pylint "$file" + else + echo "Skipping lint for deleted file: $file" + fi + done + else + echo "No Python files have been changed." + fi \ No newline at end of file diff --git a/.gitignore b/.gitignore index b6e4761..c42b4c7 100644 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,5 @@ dmypy.json # Pyre type checker .pyre/ + +.vscode \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..541333b --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,8 @@ +repos: +- repo: local + hooks: + - id: pylint + name: Pylint + entry: cmd /c "pylint > pylint.log" + files: \.(py)$ + language: system \ No newline at end of file diff --git a/.pylintrc b/.pylintrc new file mode 100644 index 0000000..f902d5a --- /dev/null +++ b/.pylintrc @@ -0,0 +1,7 @@ +[MESSAGES CONTROL] +disable=unsubscriptable-object,E1136, E1137, R,E0401, C3001, E1121, W0201 + +# E0401: Unable to import 'util.utils' (import-error) +# C3001: Lambda expression assigned to a variable. +# Define a function using the "def" keyword instead. (unnecessary-lambda-assignment) +# E1121: Too many positional arguments for method call (too-many-function-args) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md new file mode 100644 index 0000000..1959fd2 --- /dev/null +++ b/CONTRIBUTIONS.md @@ -0,0 +1,140 @@ +# Contributing to Infinite-ISP +Infinite-ISP has an "open innovation" approach, which welcomes anyone with the right skills, time, and interest to contribute generously to executing the ISP framework from the software to the hardware level. It is a community-driven project so you can contribute whether it is: + +- Adding algorithms or code to add features or improvements in the pipeline + +- Reporting a bug/issue +- Fix a bug +- Discussing the current state of the code +- Reviewing other developers' pull requests +- Improve documentation + +## How to Contribute? +If you want to contribute to the project, we recommend you see the repo issues first and find the one that interests you. The pull request process is what we follow to merge any contributions, including bug fixes, new code or algorithm, new tutorials, document amendments, etc. To get started, the following steps must be taken. + +1. Install Git and set up your GitHub account. + +2. Fork the infinite-isp repo and check [issues](https://github.com/xx-isp/infinite-isp/issues) to get started. +3. Create a feature branch from the `main` branch to make changes after choosing a task. +4. See the code guidelines to write your code. +5. Run the test cases to ensure the implemented code runs fine on your local system. +6. Make sure your code lints. +7. Review the pull request process before sending the pull request. + +## Bug Report or Feature Request + +While contributing to our pipeline, we recommend investigating the repo [issues](https://github.com/xx-isp/infinite-isp/issues) first. For this, you are welcome to open an issue on finding any kind of bug or to request a feature inclusion. Just be sure it doesn’t comply with any existing problems or pull requests before sending an issue or new feature request. + +While reporting a bug, ensure it includes all the relevant information, like code snippets, estimators, functions, exceptions, etc., so anyone can reproduce the bug. + +If you want to add a new algorithm or request a new feature to the pipeline, you have to look for the following points: + +1. Techniques that will provide a clear-cut improvement in image quality, code efficiency, or optimization will be considered for inclusion. + +2. Algorithms should be computationally less expensive. + +3. No compromise on quality benchmarks. + +## Pull Request Process +### PR Submission: + +The pull request process for infinite-isp is purely based on merit. For making a good PR, one should read the following guidelines: +1. After setting up the feature branch and adding your code to it, you must ensure it runs perfectly on your system without showing any bugs. + +2. Ensure you have followed the coding guidelines while implementing the algorithm. +3. Your PR should represent one issue at a time. You should have created a distinct feature branch with a separate pull request for each bug or feature request. +4. Squash all the unwanted commits before submitting the PR. +5. Add all the necessary information, like titles, meaningful variable names, comments explaining code lines, eloquent commit status, and relevant documentation. +6. Add running tests and performance tests for the code before sending PR. +7. Avoid adding unnecessary datasets while sending PR. If you want to contribute quality datasets to the project, please generate a separate PR +8. Make sure the modified python files lints. We have implemented code checks for linting through Github Actions and Branch Protection Rules which means we cannot merge code into `main` if there are linting errors. + +### PR Review and Merging + +Two core developers are responsible for a PR review process. For a successful merger, it should be first approved by them. After carefully analyzing and considering the coding requirements, pertinent documentation, and quality assessments, they execute the validation and performance tests. + +Then, if needed, you need to modify the code in response to the review you receive for your pull request. You must still change your branch by adding a new commit for this scenario. Push this commit to GitHub, and the pull request will be automatically updated. + +## Coding Styles +We follow PEP 8 – style guide for python code as we develop this soft ISP in python. The code should be well-commented, organized, and legible. + +### File Structure +Keep in mind the following norms while implementing the code. +- The modules folder should contain a separate python file for each new feature or functionality not currently in the pipeline. + +- A new function should be introduced to the same class for any feature enhancement or updated algorithms for the same modules. +- The helper functions should be put in the utils.py file. +- Follow the same coding pattern (PEP-8) in the modules files to prevent messy formatting or indentation. +- All the file names are written in lowercase for better compatibility. +- The algorithms implementations should be put in modules/, and their interfaces should be put in isp_pipeline.py. +- The relevant parameters should be updated in the config/ file. +- Documentation is written in .pdf files, including all the references, images, and flowcharts, and should be put into infinite-isp/docs/. +- Only English (ASCII) text is allowed for comment and explanation. No other language is allowed to use. +### Naming convention +- All the file names should be written in lowercase. + +- All the class names should start with a capital letter, e.g., AutoWhiteBalance. +- All the variable names should be in lowercase except those named after the author. +- An underscore separates words. +- Try using descriptive variables’ names for better understanding, e.g., start_index, upper_row, red_channel, etc. +Code Commenting +Code comments are an important part of the code for getting an insight into the algorithms, so, + Make sure all the comments are well-defined and comprehendible. + Complete sentences with a period in the end, should be used to clarify the meanings fully. The first letter should be in upper case. To explain any line of code, add an inline comment just before it. Example: + + +```python + # Increment x by 1 + x = x + 1 +``` + +- Keep your code comments short and to the point. Use # for each line to make it easier to read, then format it as a paragraph. + +- Docstrings should be added for public classes explaining what the method does, which is usually a one-liner docstring. +### Functions and Class Interfaces + +- The name of the functions and classes should be descriptive, explaining their purposes. +- All the functions should be well-defined with proper arguments and return values. + +## Code Review Guideline +Here is a checklist to go through while reviewing a code, +1. Evaluate the scope of the code and check its validity. + +2. Check if the code is well written, i.e., following the coding guidelines. +3. Make sure that the code is well-documented with an illustrative explanation. +4. Running the test suite on the code to see if it fits precisely within our standards and quality benchmarks. +5. The code should be readable, clear, and non-redundant. +6. Check its dependencies and compatibility. + +## Code of Conduct + +Since this initiative is community-driven, we expect positive behavior to lead to successful outcomes. We aim to provide a supportive, positive social atmosphere where community members may interact intellectually and exchange interests, skills, and valuable knowledge. +### Our Standards & Responsibilities +This is a civilized public forum where we want to uphold these norms: +1. Be civil and respectful of the topics and the people discussing them, even if you disagree with some of what is being said. + +2. Criticize ideas, not people, so strictly avoid foul language. +3. Provide reasoned counterarguments that improve the conversation. +4. Help us influence the future of this community by choosing to engage in discussions that make this forum an exciting place to be — and avoiding those that do not. +5. When you see bad behavior, don’t reply. It encourages bad conduct by acknowledging it, consumes your energy, and wastes everyone’s time. Just flag it. +6. This is a public forum, and search engines index these discussions. Keep the language, links, and images safe for family and friends. +7. Make the effort to put things in the right place so that we can spend more time discussing and less cleaning up. +8. You may not post anything digital that belongs to someone else without permission. +9. Don’t post spam or otherwise vandalize the forum. Encourage the behavior you want to see in the world. +10. We accept all who wish to participate in our activities, raising an environment where anyone can participate and make a difference. +## Enforcement +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned with this Code of Conduct or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + + + +## License +In short, when you submit code changes, your submissions are understood to be under the same [Apache 2.0 Lisence](LICENSE) that covers the project. Feel free to contact the maintainers if that's a concern. +License. + +## References +1. https://opensource.com/life/16/3/contributor-guidelines-template-and-tips +2. https://pandas.pydata.org/docs/development/contributing_codebase.html#running-the-performance-test-suite +3. https://scikit-learn.org/stable/developers/contributing.html +4. https://github.com/opencv/opencv/wiki/How_to_contribute +5. https://forum.opencv.org/faq/ +6. https://peps.python.org/pep-0008/#comments diff --git a/NOTICE b/NOTICE index f5bc9de..2010a79 100644 --- a/NOTICE +++ b/NOTICE @@ -1,2 +1,2 @@ -Infinite-ISP Algorithm Design -Copyright 2023, 10x-Engineers +infinite-isp +Copyright 2022, xx-isp \ No newline at end of file diff --git a/README.md b/README.md index 9ac3e75..233abdc 100644 --- a/README.md +++ b/README.md @@ -17,18 +17,19 @@ Infinite-ISP Algorithm Design is a collections of camera pipeline modules implem ![](assets/infinite-isp-architecture-initial.png) -ISP pipeline for `infinite-isp v1.0` +ISP pipeline for `Infinite-ISP v1.1` ## Objectives -Many open-source ISPs are available over the internet. Most of them are developed by individual contributors, each having its own strengths. This project aims to centralize all the open-source ISP development to a single place enabling all the ISP developers to have a single platform to contribute. Infinite-isp will not only contain the conventional algorithms but aims to contain state-of-the-art deep learning algorithms as well enabling a clean comparison between the two. This project has no bounds to ideas and is aimed to contain any algorithm that improves the overall results of the pipeline regardless of their complexity. +Many open-source ISPs are available over the internet. Most of them are developed by individual contributors, each having its strengths. This project aims to centralize all the open-source ISP development to a single place enabling all the ISP developers to have a single platform to contribute. InfiniteISP will not only contain the conventional algorithms but aims to contain state-of-the-art deep learning algorithms as well, enabling a clean comparison between the two. This project has no bounds to ideas and is aimed to include any algorithm that improves the overall results of the pipeline regardless of their complexity. + ## Feature Comparison Matrix A comparison of features with the famous openISP. -Infinite-isp also tries to simulate the **3A-Algorithms**. +InfiniteISP also tries to simulate the **3A-Algorithms**. -| Modules | infinite-isp | openISP | +| Modules | infiniteISP | openISP | | ------------- | ------------- | ------------- | | Crop | Bayer pattern safe cropping | ---- | | Dead Pixel Correction | Modified [Yongji's et al, Dynamic Defective Pixel Correction for Image Sensor](https://ieeexplore.ieee.org/document/9194921) | Yes | @@ -41,145 +42,103 @@ Infinite-isp also tries to simulate the **3A-Algorithms**. | White Balance | WB gains from config file | Yes | | CFA Interpolation | [Malwar He Cutler’s](https://www.ipol.im/pub/art/2011/g_mhcd/article.pdf ) demosaicing algo | Yes
- Malvar He Cutler| | **3A - Algorithms** | **AE & AWB** | ---- | -| Auto White Balance | - Gray World
- [Norm 2](https://library.imaging.org/admin/apis/public/api/ist/website/downloadArticle/cic/12/1/art00008)
- [PCA algorithm](https://opg.optica.org/josaa/viewmedia.cfm?uri=josaa-31-5-1049&seq=0) | ---- | +| Auto White Balance | - [Grey World](https://www.sciencedirect.com/science/article/abs/pii/0016003280900587)
- [Norm 2](https://library.imaging.org/admin/apis/public/api/ist/website/downloadArticle/cic/12/1/art00008)
- [PCA algorithm](https://opg.optica.org/josaa/viewmedia.cfm?uri=josaa-31-5-1049&seq=0) | ---- | | Auto Exposure | - [Auto Exposure](https://www.atlantis-press.com/article/25875811.pdf) based on skewness | ---- | | Color Correction Matrix | Calibration / sensor dependent
- 3x3 CCM from config | Yes
- 4x3 CCM | | Gamma Tone Mapping | Gamma LUT in RGB from config file | Yes
- YUV and RGB domain| -| Color Space Conversion | YUV analogue and YCbCr digital
- BT 601
- Bt 709
| Yes
- YUV analogue | +| Color Space Conversion | YCbCr digital
- BT 601
- Bt 709
| Yes
- YUV analogue | | Contrast Enhancement | Modified [contrast limited adaptive histogram equalization](https://arxiv.org/ftp/arxiv/papers/2108/2108.12818.pdf#:~:text=The%20technique%20to%20equalize%20the,a%20linear%20trend%20(CDF)) | ---- | -| Edge Enhancement / Sharpeining | ---- | Yes | -| Noise Reduction | [Non-local means filter](https://www.ipol.im/pub/art/2011/bcm_nlm/article.pdf) | Yes
- NLM filter
- Bilateral noise filter| +| Edge Enhancement / Sharpeining | Simple unsharp masking with strength control | Yes | +| Noise Reduction | [Non-local means filter](https://www.ipol.im/pub/art/2011/bcm_nlm/article.pdf) | Yes
- NLM filter
- Bilateral noise filter| | Hue Saturation Control | ---- | Yes | +|RGB Conversion| Apply inverse conversion from YUV to RGB - same standard as CSC| No| | Scale | - Integer Scaling
- Non-Integer Scaling | ---- | | False Color Suppression | ---- | Yes | | YUV Format | - YUV - 444
- YUV - 422
| ---- | - +2. VIDEO MODE +
Each image in the dataset is considered as video frame in sequence. All images use the same configuration parameters from [configs.yml](config/configs.yml) and 3A Stats calculated on a frame are applied to the next frame. -## Dependencies -The project is compatible with `Python_3.9.12` +After cloning the repository and installing all the dependencies follow the following steps: -The dependencies are listed in the [requirements.txt](requirements.txt) file. +1. Set `DATASET_PATH` to dataset folder. For example if images are in in [in_frames/normal/data](in_frames/normal/data) folder +```python +DATASET_PATH = './in_frames/normal/data' +``` -The project assumes pip package manager as a pre-requisite. +2. If your dataset is present on another git repository you can use it as a submodule by using the following commands in the root directory. In the command, `` is the address of git repository such as `https://github.com//` is the location in your repository where you want to add the submodule and for Infinite ISP `` should be `./in_frames/normal/`. Please keep in mind that your `` should not be `data` because directory [in_frames/normal/data](in_frames/normal/data) already exists. -## How to Run -Follow the following steps to run the pipeline -1. Clone the repo using +```shell +git submodule add +git submodule update --init --recursive +``` -`git clone https://github.com/xx-isp/infinite-isp` -2. Install all the requirements from the requirements file by running +4. After adding git repository as a submodule update `DATASET_PATH` variable in [isp_pipeline_dataset.py](isp_pipeline_dataset.py) to `./in_frames/normal/`. Git does not allow to import a repository’s subfolder using a submodule. You can only add an entire repository and then access the folder. If you want to use images from a subfolder of a submodule modify the `DATASET_PATH` variable in [isp_pipeline_dataset.py](isp_pipeline_dataset.py) or [video_processing.py](video_processing.py) accordingly. -`pip install -r requirements.txt` +```python +DATASET_PATH = './in_frames/normal/' +``` +5. Run `isp_pipeline_dataset.py` or `video_processing.py` +6. The processed images are saved in [out_frames](out_frames/) folder. +## Test Vector Generation +Please refer to the provided [instructions](test_vector_generation/README.md) for generating test vectors for multiple images, considering individual or multiple modules as the Device Under Test (DUT). -## Example -There are a few sample images with tuned configurations already added to the project at [in_frames/normal](in_frames/normal) folder. In order to run any of these, just replace the config file name with any one of the sample configurations provided. For example to run the pipeline on `Indoor1_2592x1536_12bit_RGGB.raw` simply replace the config file name in `isp_pipeline.py` +## Contributing -`config_path = './config/Indoor1-configs.yml'` +Please read the [Contribution Guidelines](docs/CONTRIBUTIONS.md) before making a Pull Request ## Results -Here are the results of this pipeline compared with a market competitve ISP. +Here are the results of this pipeline compared with a market competitive ISP. The outputs of our ISP are displayed on the right, with the underlying ground truths on the left. -           **ground truths**                            **infinite-isp** + +           **ground truths**                            **infiniteISP** ![](assets/Indoor1.png) ![](assets/Outdoor1.png) ![](assets/Outdoor2.png) @@ -190,11 +149,11 @@ A comparison of the above results based on PSNR and SSIM image quality metrics | Images | PSNR | SSIM | |-----------|-------|-------| -| Indoor1 | 21.51 | 0.8624 | -| Outdoor1 | 22.87 | 0.9431 | -| Outdoor2 | 20.54 | 0.8283 | -| Outdoor3 | 19.22 | 0.7867 | -| Outdoor4 | 22.25 | 0.8945 | +| Indoor1 |20.0974 |0.8599 +|Outdoor1 |21.8669 |0.9277 +|Outdoor2 |20.3430 |0.8384 +|Outdoor3 |19.3627 |0.8027 +|Outdoor4 |20.7741 |0.8561 ## User Guide @@ -215,7 +174,7 @@ The config file contains tags for each module implemented in the pipeline. A bri | ----------- | --- | | bayer_pattern | Specifies the bayer patter of the RAW image in lowercase letters
- `bggr`
- `rgbg`
- `rggb`
- `grbg`| | range | Not used | -| bitdep | The bit depth of the raw image | +| bit_depth | The bit depth of the raw image | | width | The width of the input raw image | | height | The height of the input raw image | | hdr | Not used | @@ -224,8 +183,8 @@ The config file contains tags for each module implemented in the pipeline. A bri | crop | Details | | ----------- | --- | -| isEnable | Enables or disables this module. When enabled it ony crops if bayer pattern is not disturbed -| isDebug | Flag to output module debug logs +| is_enable | Enables or disables this module. When enabled it ony crops if bayer pattern is not disturbed +| is_debug | Flag to output module debug logs | new_width | New width of the input RAW image after cropping | new_height | New height of the input RAW image after cropping @@ -233,8 +192,8 @@ The config file contains tags for each module implemented in the pipeline. A bri | dead_pixel_correction | Details | | ----------- | --- | -| isEnable | Enables or disables this module -| isDebug | Flag to output module debug logs +| is_enable | Enables or disables this module +| is_debug | Flag to output module debug logs | dp_threshold | The threshold for tuning the dpc module. The lower the threshold more are the chances of pixels being detected as dead and hence corrected ### HDR Stitching @@ -245,12 +204,12 @@ To be implemented | black_level_correction | Details | | ----------- | --- | -| isEnable | Enables or disables this module +| is_enable | Enables or disables this module | r_offset | Red channel offset | gr_offset | Gr channel offset | gb_offset | Gb channel offset | b_offset | Blue channel offset -| isLinear | Enables or disables linearization. When enabled the BLC offset maps to zero and saturation maps to the highest possible bit range given by the user +| is_linear | Enables or disables linearization. When enabled the BLC offset maps to zero and saturation maps to the highest possible bit range given by the user | r_sat | Red channel saturation level | gr_sat | Gr channel saturation level | gb_sat | Gb channel saturation level @@ -260,15 +219,15 @@ To be implemented | OECF | Details | | ----------- | --- | -| isEnable | Enables or disables this module +| is_enable | Enables or disables this module | r_lut | The look up table for oecf curve. This curve is mostly sensor dependent and is found by calibration using some standard technique ### Digital Gain | digital_gain | Details | | ----------- | --- | -| isEnable | This is a essential module and cannot be disabled -| isDebug | Flag to output module debug logs +| is_enable | This is a essential module and cannot be disabled +| is_debug | Flag to output module debug logs | gain_array | Gains array. User can select any one of the gain listed here. This module works together with AE module | | current_gain | Index for the current gain starting from zero | @@ -280,34 +239,37 @@ To be implemented | bayer_noise_reduction | Details | | ----------- | --- | -| isEnable | When enabled reduces the noise in bayer domain using the user given parameters | +| is_enable | When enabled reduces the noise in bayer domain using the user given parameters | | filt_window | Should be an odd window size -| r_stdDevS | Red channel gaussian kernel strength. The more the strength the more the blurring. Cannot be zero -| r_stdDevR | Red channel range kernel strength. The more the strength the more the edges are preserved. Cannot be zero -| g_stdDevS | Gr and Gb gaussian kernel strength -| g_stdDevR | Gr and Gb range kernel strength -| b_stdDevS | Blue channel gaussian kernel strength -| b_stdDevR | Blue channel range kernel strength +| r_std_dev_s | Red channel gaussian kernel strength. The more the strength the more the blurring. Cannot be zero +| r_std_dev_r | Red channel range kernel strength. The more the strength the more the edges are preserved. Cannot be zero +| g_std_dev_s | Gr and Gb gaussian kernel strength +| g_std_dev_r | Gr and Gb range kernel strength +| b_std_dev_s | Blue channel gaussian kernel strength +| b_std_dev_r | Blue channel range kernel strength ### White balance | white_balance | Details | | ----------- | --- | -| isEnable | Applies user given white balance gains when enabled | -| isAuto | When true enables the 3A - AWB and does'nt use the user given WB gains | +| is_enable | Applies user given white balance gains when enabled | +| is_auto | When true enables the 3A - AWB and does not use the user given WB gains | | r_gain | Red channel gain | | b_gain | Blue channel gain | -### CFA Interpolation (Demosaicing) + --> ### 3A - Auto White Balance (AWB) | auto_white_balance | Details | | ----------- | --- | +| is_debug | Flag to output module debug logs| +| underexposed_pecentage | Set % of dark pixels to exclude before AWB gain calculation| +| overexposed_pecentage | Set % of saturated pixels to exclude before AWB gain calculation| | algorithm | Can select one of the following algos
- `grey_world`
- `norm_2`
- `pca` | | percentage | [0 - 100] - Parameter to select dark-light pixels percentage for pca algorithm | @@ -315,7 +277,7 @@ To be implemented | color_correction_matrix | Details | | ----------- | --- | -| isEnable | When enabled applies the user given 3x3 CCM to the 3D RGB image having rows sum to 1 convention | +| is_enable | When enabled applies the user given 3x3 CCM to the 3D RGB image having rows sum to 1 convention | | corrected_red | Row 1 of CCM | corrected_green | Row 2 of CCM | corrected_blue | Row 3 of CCM @@ -323,14 +285,17 @@ To be implemented ### Gamma Correction | gamma_correction | Details | | ----------- | --- | -| isEnable | When enabled applies tone mapping gamma using the LUT | -| gammaLut | The look up table for gamma curve | +| is_enable | When enabled applies tone mapping gamma using the LUT | +| gamma_lut_8 | The look up table for 8-bit gamma curve | +| gamma_lut_10 | The look up table for 10-bit gamma curve | +| gamma_lut_12 | The look up table for 12-bit gamma curve | +| gamma_lut_14 | The look up table for 14-bit gamma curve | ### 3A - Auto Exposure | auto_exposure | Details |--------------------|----------------------------------------------------------------------------------------------| -| isEnable | When enabled applies the 3A- Auto Exposure algorithm | -| isDebug | Flag to output module debug logs | +| is_enable | When enabled applies the 3A- Auto Exposure algorithm | +| is_debug | Flag to output module debug logs | | center_illuminance | The value of center illuminance for skewness calculation ranges from 0 to 255. Default is 90 | | histogram_skewness | The range of histogram skewness should be between 0 and 1 for correct exposure calculation | @@ -338,63 +303,64 @@ To be implemented | color_space_conversion | Details | |------------------------|-------------------------------------------------------------------------------------| -| isEnable | This is a essential module and cannot be disabled | +| is_enable | This is a essential module and cannot be disabled | | conv_standard | The standard to be used for conversion
- `1` : Bt.709 HD
- `2` : Bt.601/407 | -| conv_type | The conversion type
- `1` : Analogue YUV
- `2` : Digital YCbCr | ### Contrast Enchancement | ldci | Details | |------------|----------------------------------------------------------------------------- | -| isEnable | When enabled local dynamic contrast enhancement is applied to the Y channel | +| is_enable | When enabled local dynamic contrast enhancement is applied to the Y channel | | clip_limit | The clipping limit that controls amount of detail to be enhanced | | wind | Window size for applying filter | ### Edge Enchancement / Sharpening -To be implemented +| Sharpening | Details | +|--------------------|---------------------------------------------------| +| is_enable | When enabled applies the sharpening | +| sharpen_sigma | Define the Standard Deviation of the Gaussian Filter | +| sharpen_strength | Controls the sharpen strength applied on the high frequency components | + ### 2d Noise Reduction | 2d_noise_reduction | Details | |--------------------|---------------------------------------------------| -| isEnable | When enabled applies the non-local mean filtering | -| window_size | Search window size for applying the filter | -| patch_size | Patch window size for applying filter | -| h | Strength of blurring | +| is_enable | When enabled applies the 2D noise reduction | +| algorithm | Can select one of the following algos
- `nlm`
- `ebf` | +| window_size | Search window size for applying non-local means | +| patch_size | Patch size for applying mean filter | +| wts | Smoothening strength parameter | +| wind | Window size for applying entropy based bilateral filter | +| sigma | Range and spatial kernel parameter for entropy based bilateral filter | ### Scaling | scale | Details | |------------------|--------------------------------------------------------------------------------------------------------------------------------------------------- -| isEnable | When enabled down scales the input image -| isDebug | Flag to output module debug logs +| is_enable | When enabled down scales the input image +| is_debug | Flag to output module debug logs | new_width | Down scaled width of the output image | new_height | Down scaled height of the output image -| isHardware | When true applies the hardware friendly techniques for downscaling. This can only be applied to any one of the input sizes 3 input sizes and can downscale to
- `2592x1944` to `1920x1080` or `1280x960` or `1280x720` or `640x480` or `640x360`
- `2592x1536` to `1280x720` or `640x480` or `640x360`
- `1920x1080` to to `1280x720` or `640x480` or `640x360` | -| Algo | Software friendly scaling. Only used when isHardware is disabled
- `Nearest_Neighbor`
- `Bilinear` +| is_hardware | When true applies the hardware friendly techniques for downscaling. This can only be applied to any one of the input sizes 3 input sizes and can downscale to
- `2592x1944` to `1920x1080` or `1280x960` or `1280x720` or `640x480` or `640x360`
- `2592x1536` to `1280x720` or `640x480` or `640x360`
- `1920x1080` to to `1280x720` or `640x480` or `640x360` | +| algorithm | Software friendly scaling. Only used when isHardware is disabled
- `Nearest_Neighbor`
- `Bilinear` | upscale_method | Used only when isHardware enabled. Upscaling method, can be one of the above algos | downscale_method | Used only when isHardware enabled. Downscaling method, can be one of the above algos ### YUV Format | yuv_conversion_format | Details | |---------------------------|--------------------------------------------------------| -| isEnable | Enables or disables this module | +| is_enable | Enables or disables this module | | conv_type | Can convert the YCbCr to YUV
- `444`
- `422` | -### Pre-Gamma -TBD -### Tone-Mapping -TBD -### Jpeg-Compression -TBD ## FAQ -**Why is it named infinite-isp?** +**Why is it named infiniteISP?** -ISPs are hardware dependent. In them algorithms are limited to perform to their best because of hardware limitations. Infinite-isp tends to somewhat remove this limitation and let the algorithms perform to the full potential targeting best results. +ISPs are hardware dependent. In them algorithms are limited to perform to their best because of hardware limitations. InfiniteISP tends to somewhat remove this limitation and let the algorithms perform to the full potential targeting best results. -**Will inifnite-isp also contain algorithms that involve machine learning?** +**Will inifniteISP also contain algorithms that involve machine learning?** Yes definitely this is mainly because it is seen that machine learning models tend to give perform much better results as compared to conventional models. The plan is as follows @@ -404,9 +370,9 @@ Yes definitely this is mainly because it is seen that machine learning models te - `v1.x.x` releases will have all the necessary improvements of these conventional algorithms till release `v2.0` -- From release `v2.0` infinite-isp will start implementing machine learning models for specific algorithms. +- From release `v2.0` infiniteISP will start implementing machine learning models for specific algorithms. -- Release `v3.0` will have infinite-isp having both conventional and deep learning algorithms (not for all pipeline modules but for specific ones) +- Release `v3.0` will have infiniteISP having both conventional and deep learning algorithms (not for all pipeline modules but for specific ones) ## License This project is licensed under Apache 2.0 (see [LICENSE](LICENSE) file). @@ -421,12 +387,3 @@ This project is licensed under Apache 2.0 (see [LICENSE](LICENSE) file). - [Mushfiqulalam - isp](https://github.com/mushfiqulalam/isp) - [Karaimer - A Software Platform for Manipulating the Camera Imaging Pipeline](https://karaimer.github.io/camera-pipeline) - [rawpy](https://github.com/letmaik/rawpy.git) - -## Contact -For any inquiries or feedback, feel free to reach out. - -Email: isp@10xengineers.ai - -Website: http://www.10xengineers.ai - -LinkedIn: https://www.linkedin.com/company/10x-engineers/ diff --git a/assets/Indoor1.png b/assets/Indoor1.png index 1cc7a30..7ba079a 100644 Binary files a/assets/Indoor1.png and b/assets/Indoor1.png differ diff --git a/assets/Outdoor1.png b/assets/Outdoor1.png index c9f242b..5811488 100644 Binary files a/assets/Outdoor1.png and b/assets/Outdoor1.png differ diff --git a/assets/Outdoor2.png b/assets/Outdoor2.png index 6e42725..1784f8f 100644 Binary files a/assets/Outdoor2.png and b/assets/Outdoor2.png differ diff --git a/assets/Outdoor3.png b/assets/Outdoor3.png index 4ff8663..a3c03a4 100644 Binary files a/assets/Outdoor3.png and b/assets/Outdoor3.png differ diff --git a/assets/Outdoor4.png b/assets/Outdoor4.png index 6a14b4c..11b0ef0 100644 Binary files a/assets/Outdoor4.png and b/assets/Outdoor4.png differ diff --git a/assets/infinite-isp-architecture-initial.png b/assets/infinite-isp-architecture-initial.png index 3a9ec4d..e17d4b4 100644 Binary files a/assets/infinite-isp-architecture-initial.png and b/assets/infinite-isp-architecture-initial.png differ diff --git a/config/Indoor1-configs.yml b/config/Indoor1-configs.yml deleted file mode 100644 index 7ffec34..0000000 --- a/config/Indoor1-configs.yml +++ /dev/null @@ -1,150 +0,0 @@ -platform: - filename: "Indoor1_2592x1536_12bit_RGGB.raw" - disable_progress_bar: False - leave_pbar_string: False - -sensor_info: - bayer_pattern: "rggb" - range: 4095 - bitdep: 12 - width: 2592 - height: 1536 - hdr: False - -crop: - isEnable: False - isDebug: False - new_width: 1280 - new_height: 720 - -dead_pixel_correction: - isEnable: True - dp_threshold: 80 - isDebug: True - -hdr_stitching: - isEnable: False - -black_level_correction: - isEnable: True - r_offset: 200 - gr_offset: 200 - gb_offset: 200 - b_offset: 200 - isLinear: False - r_sat: 1023 - gr_sat: 1023 - gb_sat: 1023 - b_sat: 1023 - -OECF: - isEnable: False - # Make sure the LUT has the right bit range i.e. if image is of 10 bit LUT should be from [0 - (2^10)-1] - # LUT here does nothing to the sensor response i.e. a value of 800 maps to 800 and 2000 maps to 2000 - r_lut: [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2094,2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,2480,2481,2482,2483,2484,2485,2486,2487,2488,2489,2490,2491,2492,2493,2494,2495,2496,2497,2498,2499,2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559,2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574,2575,2576,2577,2578,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2601,2602,2603,2604,2605,2606,2607,2608,2609,2610,2611,2612,2613,2614,2615,2616,2617,2618,2619,2620,2621,2622,2623,2624,2625,2626,2627,2628,2629,2630,2631,2632,2633,2634,2635,2636,2637,2638,2639,2640,2641,2642,2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658,2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,2691,2692,2693,2694,2695,2696,2697,2698,2699,2700,2701,2702,2703,2704,2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2729,2730,2731,2732,2733,2734,2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,2751,2752,2753,2754,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,2766,2767,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2780,2781,2782,2783,2784,2785,2786,2787,2788,2789,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,2810,2811,2812,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2857,2858,2859,2860,2861,2862,2863,2864,2865,2866,2867,2868,2869,2870,2871,2872,2873,2874,2875,2876,2877,2878,2879,2880,2881,2882,2883,2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,2962,2963,2964,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020,3021,3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069,3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3113,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174,3175,3176,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,3188,3189,3190,3191,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,3278,3279,3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295,3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327,3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343,3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,3388,3389,3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405,3406,3407,3408,3409,3410,3411,3412,3413,3414,3415,3416,3417,3418,3419,3420,3421,3422,3423,3424,3425,3426,3427,3428,3429,3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443,3444,3445,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3456,3457,3458,3459,3460,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,3512,3513,3514,3515,3516,3517,3518,3519,3520,3521,3522,3523,3524,3525,3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541,3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557,3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573,3574,3575,3576,3577,3578,3579,3580,3581,3582,3583,3584,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695,3696,3697,3698,3699,3700,3701,3702,3703,3704,3705,3706,3707,3708,3709,3710,3711,3712,3713,3714,3715,3716,3717,3718,3719,3720,3721,3722,3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744,3745,3746,3747,3748,3749,3750,3751,3752,3753,3754,3755,3756,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,3767,3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,3779,3780,3781,3782,3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3802,3803,3804,3805,3806,3807,3808,3809,3810,3811,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,3822,3823,3824,3825,3826,3827,3828,3829,3830,3831,3832,3833,3834,3835,3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847,3848,3849,3850,3851,3852,3853,3854,3855,3856,3857,3858,3859,3860,3861,3862,3863,3864,3865,3866,3867,3868,3869,3870,3871,3872,3873,3874,3875,3876,3877,3878,3879,3880,3881,3882,3883,3884,3885,3886,3887,3888,3889,3890,3891,3892,3893,3894,3895,3896,3897,3898,3899,3900,3901,3902,3903,3904,3905,3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,3940,3941,3942,3943,3944,3945,3946,3947,3948,3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,3978,3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,3992,3993,3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,4056,4057,4058,4059,4060,4061,4062,4063,4064,4065,4066,4067,4068,4069,4070,4071,4072,4073,4074,4075,4076,4077,4078,4079,4080,4081,4082,4083,4084,4085,4086,4087,4088,4089,4090,4091,4092,4093,4094,4095] - -digital_gain: - isEnable: True - isDebug: True - # Array of pre-define Gains - gain_array: [1, 2, 4, 6, 8, 10, 12, 16, 32, 64] - # Index of default gain - current_gain: 0 - -lens_shading_correction: - isEnable: False - -bayer_noise_reduction: - isEnable: True - filt_window: 9 - r_stdDevS: 1 - r_stdDevR: 0.1 - g_stdDevS: 1 - g_stdDevR: 0.08 - b_stdDevS: 1 - b_stdDevR: 0.1 - -white_balance: - isEnable: True - # isAuto refers to auto white balance module - isAuto: True - r_gain: 1.768566 - b_gain: 1.641026 - -demosaic: - isEnable: True - -auto_white_balance: - isDebug: True - algorithm: "pca" - # grey_world, norm_2, pca - percentage: 3.5 - -color_correction_matrix: - #Row sum to 1 convention - isEnable: True - - corrected_red: [2.203125, -1.0898, -0.11328] - corrected_green: [-0.29296875, 1.30859375, -0.015625] - corrected_blue: [0.05859, -0.88671875, 1.828125] - - -gamma_correction: - isEnable: True - gammaLut: [0,5,9,13,17,22,25,29,33,37,40,44,47,50,54,57,60,63,66,69,72,75,78,80,83,85,88,90,93,95,97,99,101,103,105,107,109,111,113,115,117,118,120,122,123,125,126,128,129,131,132,134,135,136,138,139,140,141,142,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,162,163,164,165,166,167,167,168,169,170,171,171,172,173,173,174,175,176,176,177,178,179,179,180,181,181,182,183,183,184,185,185,186,187,187,188,188,189,190,190,191,191,192,193,193,194,194,195,195,196,197,197,198,198,199,199,200,200,201,201,202,202,203,203,204,204,205,205,206,206,207,207,208,208,209,209,210,210,211,211,212,212,213,213,214,214,215,215,216,216,217,217,218,218,219,219,220,220,221,221,221,222,222,223,223,224,224,225,225,225,226,226,227,227,228,228,228,229,229,230,230,231,231,231,232,232,233,233,234,234,234,235,235,236,236,237,237,238,238,238,239,239,240,240,241,241,241,242,242,243,243,244,244,244,245,245,246,246,247,247,247,248,248,249,249,250,250,250,251,251,252,252,252,253,253,254,254,255] - - -auto_exposure: - isEnable: True - isDebug: True - center_illuminance: 90 - histogram_skewness: 1 - -color_space_conversion: - isEnable: True - # Bt.709 HD = 1 - # Bt.601/4407 = 2 - conv_standard: 1 - # analog = 1 - # digital = 2 - conv_type: 2 - -ldci: - isEnable: True - clip_limit: 1 - wind: 16 - -sharpen: - isEnable: False - - -2d_noise_reduction: - isEnable: True - window_size: 9 - patch_size: 5 - h: 5 - -scale: - isEnable: False - isDebug: True - new_width: 1920 - new_height: 1080 - isHardware: True - # Nearest_Neighbor # Bilinear - Algo: "Nearest_Neighbor" - upscale_method: "Nearest_Neighbor" - downscale_method: "Bilinear" - -yuv_conversion_format: - # The conversion wont run if csc is false - isEnable: False - conv_type: '444' - -pre_gamma: - isEnable: False - -tone_mapping: - isEnable: False - -jpeg_conversion: - isEnable: False diff --git a/config/Outdoor1-configs.yml b/config/Outdoor1-configs.yml deleted file mode 100644 index a32ad3d..0000000 --- a/config/Outdoor1-configs.yml +++ /dev/null @@ -1,150 +0,0 @@ -platform: - filename: "Outdoor1_2592x1536_12bit_RGGB.raw" - disable_progress_bar: False - leave_pbar_string: False - -sensor_info: - bayer_pattern: "rggb" - range: 4095 - bitdep: 12 - width: 2592 - height: 1536 - hdr: False - -crop: - isEnable: False - isDebug: False - new_width: 1280 - new_height: 720 - -dead_pixel_correction: - isEnable: True - dp_threshold: 80 - isDebug: True - -hdr_stitching: - isEnable: False - -black_level_correction: - isEnable: True - r_offset: 200 - gr_offset: 200 - gb_offset: 200 - b_offset: 200 - isLinear: False - r_sat: 1023 - gr_sat: 1023 - gb_sat: 1023 - b_sat: 1023 - -OECF: - isEnable: False - # Make sure the LUT has the right bit range i.e. if image is of 10 bit LUT should be from [0 - (2^10)-1] - # LUT here does nothing to the sensor response i.e. a value of 800 maps to 800 and 2000 maps to 2000 - r_lut: [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2094,2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,2480,2481,2482,2483,2484,2485,2486,2487,2488,2489,2490,2491,2492,2493,2494,2495,2496,2497,2498,2499,2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559,2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574,2575,2576,2577,2578,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2601,2602,2603,2604,2605,2606,2607,2608,2609,2610,2611,2612,2613,2614,2615,2616,2617,2618,2619,2620,2621,2622,2623,2624,2625,2626,2627,2628,2629,2630,2631,2632,2633,2634,2635,2636,2637,2638,2639,2640,2641,2642,2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658,2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,2691,2692,2693,2694,2695,2696,2697,2698,2699,2700,2701,2702,2703,2704,2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2729,2730,2731,2732,2733,2734,2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,2751,2752,2753,2754,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,2766,2767,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2780,2781,2782,2783,2784,2785,2786,2787,2788,2789,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,2810,2811,2812,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2857,2858,2859,2860,2861,2862,2863,2864,2865,2866,2867,2868,2869,2870,2871,2872,2873,2874,2875,2876,2877,2878,2879,2880,2881,2882,2883,2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,2962,2963,2964,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020,3021,3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069,3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3113,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174,3175,3176,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,3188,3189,3190,3191,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,3278,3279,3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295,3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327,3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343,3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,3388,3389,3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405,3406,3407,3408,3409,3410,3411,3412,3413,3414,3415,3416,3417,3418,3419,3420,3421,3422,3423,3424,3425,3426,3427,3428,3429,3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443,3444,3445,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3456,3457,3458,3459,3460,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,3512,3513,3514,3515,3516,3517,3518,3519,3520,3521,3522,3523,3524,3525,3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541,3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557,3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573,3574,3575,3576,3577,3578,3579,3580,3581,3582,3583,3584,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695,3696,3697,3698,3699,3700,3701,3702,3703,3704,3705,3706,3707,3708,3709,3710,3711,3712,3713,3714,3715,3716,3717,3718,3719,3720,3721,3722,3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744,3745,3746,3747,3748,3749,3750,3751,3752,3753,3754,3755,3756,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,3767,3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,3779,3780,3781,3782,3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3802,3803,3804,3805,3806,3807,3808,3809,3810,3811,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,3822,3823,3824,3825,3826,3827,3828,3829,3830,3831,3832,3833,3834,3835,3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847,3848,3849,3850,3851,3852,3853,3854,3855,3856,3857,3858,3859,3860,3861,3862,3863,3864,3865,3866,3867,3868,3869,3870,3871,3872,3873,3874,3875,3876,3877,3878,3879,3880,3881,3882,3883,3884,3885,3886,3887,3888,3889,3890,3891,3892,3893,3894,3895,3896,3897,3898,3899,3900,3901,3902,3903,3904,3905,3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,3940,3941,3942,3943,3944,3945,3946,3947,3948,3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,3978,3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,3992,3993,3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,4056,4057,4058,4059,4060,4061,4062,4063,4064,4065,4066,4067,4068,4069,4070,4071,4072,4073,4074,4075,4076,4077,4078,4079,4080,4081,4082,4083,4084,4085,4086,4087,4088,4089,4090,4091,4092,4093,4094,4095] - -digital_gain: - isEnable: True - isDebug: True - # Array of pre-define Gains - gain_array: [1, 2, 4, 6, 8, 10, 12, 16, 32, 64] - # Index of default gain - current_gain: 0 - -lens_shading_correction: - isEnable: False - -bayer_noise_reduction: - isEnable: True - filt_window: 9 - r_stdDevS: 1 - r_stdDevR: 0.1 - g_stdDevS: 1 - g_stdDevR: 0.08 - b_stdDevS: 1 - b_stdDevR: 0.1 - -white_balance: - isEnable: True - # isAuto refers to auto white balance module - isAuto: True - r_gain: 1.768566 - b_gain: 1.641026 - -demosaic: - isEnable: True - -auto_white_balance: - isDebug: True - algorithm: "pca" - # grey_world, norm_2, pca - percentage: 3.5 - -color_correction_matrix: - #Row sum to 1 convention - isEnable: True - - corrected_red: [1.67578, -0.59375, -0.08203125] - corrected_green: [-0.2421875, 1.5078125, -0.265625] - corrected_blue: [-0.0078125, -0.44921875, 1.45703125] - -gamma_correction: - isEnable: True - - gammaLut: [0,5,9,13,17,22,25,29,33,37,40,44,47,50,54,57,60,63,66,69,72,75,78,80,83,85,88,90,93,95,97,99,101,103,105,107,109,111,113,115,117,118,120,122,123,125,126,128,129,131,132,134,135,136,138,139,140,141,142,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,162,163,164,165,166,167,167,168,169,170,171,171,172,173,173,174,175,176,176,177,178,179,179,180,181,181,182,183,183,184,185,185,186,187,187,188,188,189,190,190,191,191,192,193,193,194,194,195,195,196,197,197,198,198,199,199,200,200,201,201,202,202,203,203,204,204,205,205,206,206,207,207,208,208,209,209,210,210,211,211,212,212,213,213,214,214,215,215,216,216,217,217,218,218,219,219,220,220,221,221,221,222,222,223,223,224,224,225,225,225,226,226,227,227,228,228,228,229,229,230,230,231,231,231,232,232,233,233,234,234,234,235,235,236,236,237,237,238,238,238,239,239,240,240,241,241,241,242,242,243,243,244,244,244,245,245,246,246,247,247,247,248,248,249,249,250,250,250,251,251,252,252,252,253,253,254,254,255] - - -auto_exposure: - isEnable: True - isDebug: True - center_illuminance: 90 - histogram_skewness: 1 - -color_space_conversion: - isEnable: True - # Bt.709 HD = 1 - # Bt.601/4407 = 2 - conv_standard: 1 - # analog = 1 - # digital = 2 - conv_type: 2 - -ldci: - isEnable: True - clip_limit: 1 - wind: 16 - -sharpen: - isEnable: False - - -2d_noise_reduction: - isEnable: True - window_size: 9 - patch_size: 5 - h: 5 - -scale: - isEnable: False - isDebug: True - new_width: 1920 - new_height: 1080 - isHardware: True - # Nearest_Neighbor # Bilinear - Algo: "Nearest_Neighbor" - upscale_method: "Nearest_Neighbor" - downscale_method: "Bilinear" - -yuv_conversion_format: - # The conversion wont run if csc is false - isEnable: False - conv_type: '444' - -pre_gamma: - isEnable: False - -tone_mapping: - isEnable: False - -jpeg_conversion: - isEnable: False diff --git a/config/Outdoor2-configs.yml b/config/Outdoor2-configs.yml deleted file mode 100644 index f5dde54..0000000 --- a/config/Outdoor2-configs.yml +++ /dev/null @@ -1,150 +0,0 @@ -platform: - filename: "Outdoor2_2592x1536_12bit_RGGB.raw" - disable_progress_bar: False - leave_pbar_string: False - -sensor_info: - bayer_pattern: "rggb" - range: 4095 - bitdep: 12 - width: 2592 - height: 1536 - hdr: False - -crop: - isEnable: False - isDebug: False - new_width: 1280 - new_height: 720 - -dead_pixel_correction: - isEnable: True - dp_threshold: 80 - isDebug: True - -hdr_stitching: - isEnable: False - -black_level_correction: - isEnable: True - r_offset: 200 - gr_offset: 200 - gb_offset: 200 - b_offset: 200 - isLinear: False - r_sat: 1023 - gr_sat: 1023 - gb_sat: 1023 - b_sat: 1023 - -OECF: - isEnable: False - # Make sure the LUT has the right bit range i.e. if image is of 10 bit LUT should be from [0 - (2^10)-1] - # LUT here does nothing to the sensor response i.e. a value of 800 maps to 800 and 2000 maps to 2000 - r_lut: [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2094,2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,2480,2481,2482,2483,2484,2485,2486,2487,2488,2489,2490,2491,2492,2493,2494,2495,2496,2497,2498,2499,2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559,2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574,2575,2576,2577,2578,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2601,2602,2603,2604,2605,2606,2607,2608,2609,2610,2611,2612,2613,2614,2615,2616,2617,2618,2619,2620,2621,2622,2623,2624,2625,2626,2627,2628,2629,2630,2631,2632,2633,2634,2635,2636,2637,2638,2639,2640,2641,2642,2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658,2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,2691,2692,2693,2694,2695,2696,2697,2698,2699,2700,2701,2702,2703,2704,2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2729,2730,2731,2732,2733,2734,2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,2751,2752,2753,2754,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,2766,2767,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2780,2781,2782,2783,2784,2785,2786,2787,2788,2789,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,2810,2811,2812,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2857,2858,2859,2860,2861,2862,2863,2864,2865,2866,2867,2868,2869,2870,2871,2872,2873,2874,2875,2876,2877,2878,2879,2880,2881,2882,2883,2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,2962,2963,2964,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020,3021,3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069,3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3113,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174,3175,3176,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,3188,3189,3190,3191,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,3278,3279,3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295,3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327,3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343,3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,3388,3389,3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405,3406,3407,3408,3409,3410,3411,3412,3413,3414,3415,3416,3417,3418,3419,3420,3421,3422,3423,3424,3425,3426,3427,3428,3429,3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443,3444,3445,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3456,3457,3458,3459,3460,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,3512,3513,3514,3515,3516,3517,3518,3519,3520,3521,3522,3523,3524,3525,3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541,3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557,3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573,3574,3575,3576,3577,3578,3579,3580,3581,3582,3583,3584,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695,3696,3697,3698,3699,3700,3701,3702,3703,3704,3705,3706,3707,3708,3709,3710,3711,3712,3713,3714,3715,3716,3717,3718,3719,3720,3721,3722,3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744,3745,3746,3747,3748,3749,3750,3751,3752,3753,3754,3755,3756,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,3767,3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,3779,3780,3781,3782,3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3802,3803,3804,3805,3806,3807,3808,3809,3810,3811,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,3822,3823,3824,3825,3826,3827,3828,3829,3830,3831,3832,3833,3834,3835,3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847,3848,3849,3850,3851,3852,3853,3854,3855,3856,3857,3858,3859,3860,3861,3862,3863,3864,3865,3866,3867,3868,3869,3870,3871,3872,3873,3874,3875,3876,3877,3878,3879,3880,3881,3882,3883,3884,3885,3886,3887,3888,3889,3890,3891,3892,3893,3894,3895,3896,3897,3898,3899,3900,3901,3902,3903,3904,3905,3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,3940,3941,3942,3943,3944,3945,3946,3947,3948,3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,3978,3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,3992,3993,3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,4056,4057,4058,4059,4060,4061,4062,4063,4064,4065,4066,4067,4068,4069,4070,4071,4072,4073,4074,4075,4076,4077,4078,4079,4080,4081,4082,4083,4084,4085,4086,4087,4088,4089,4090,4091,4092,4093,4094,4095] - -digital_gain: - isEnable: True - isDebug: True - # Array of pre-define Gains - gain_array: [1, 2, 4, 6, 8, 10, 12, 16, 32, 64] - # Index of default gain - current_gain: 0 - -lens_shading_correction: - isEnable: False - -bayer_noise_reduction: - isEnable: True - filt_window: 9 - r_stdDevS: 1 - r_stdDevR: 0.1 - g_stdDevS: 1 - g_stdDevR: 0.08 - b_stdDevS: 1 - b_stdDevR: 0.1 - -white_balance: - isEnable: True - # isAuto refers to auto white balance module - isAuto: True - r_gain: 1.768566 - b_gain: 1.641026 - -demosaic: - isEnable: True - -auto_white_balance: - isDebug: True - algorithm: "pca" - # grey_world, norm_2, pca - percentage: 3.5 - -color_correction_matrix: - #Row sum to 1 convention - isEnable: True - - corrected_red: [1.67578, -0.59375, -0.08203125] - corrected_green: [-0.2421875, 1.5078125, -0.265625] - corrected_blue: [-0.0078125, -0.44921875, 1.45703125] - -gamma_correction: - isEnable: True - - gammaLut: [0,5,9,13,17,22,25,29,33,37,40,44,47,50,54,57,60,63,66,69,72,75,78,80,83,85,88,90,93,95,97,99,101,103,105,107,109,111,113,115,117,118,120,122,123,125,126,128,129,131,132,134,135,136,138,139,140,141,142,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,162,163,164,165,166,167,167,168,169,170,171,171,172,173,173,174,175,176,176,177,178,179,179,180,181,181,182,183,183,184,185,185,186,187,187,188,188,189,190,190,191,191,192,193,193,194,194,195,195,196,197,197,198,198,199,199,200,200,201,201,202,202,203,203,204,204,205,205,206,206,207,207,208,208,209,209,210,210,211,211,212,212,213,213,214,214,215,215,216,216,217,217,218,218,219,219,220,220,221,221,221,222,222,223,223,224,224,225,225,225,226,226,227,227,228,228,228,229,229,230,230,231,231,231,232,232,233,233,234,234,234,235,235,236,236,237,237,238,238,238,239,239,240,240,241,241,241,242,242,243,243,244,244,244,245,245,246,246,247,247,247,248,248,249,249,250,250,250,251,251,252,252,252,253,253,254,254,255] - - -auto_exposure: - isEnable: True - isDebug: True - center_illuminance: 90 - histogram_skewness: 1 - -color_space_conversion: - isEnable: True - # Bt.709 HD = 1 - # Bt.601/4407 = 2 - conv_standard: 1 - # analog = 1 - # digital = 2 - conv_type: 2 - -ldci: - isEnable: True - clip_limit: 1 - wind: 16 - -sharpen: - isEnable: False - - -2d_noise_reduction: - isEnable: True - window_size: 9 - patch_size: 5 - h: 5 - -scale: - isEnable: False - isDebug: True - new_width: 1920 - new_height: 1080 - isHardware: True - # Nearest_Neighbor # Bilinear - Algo: "Nearest_Neighbor" - upscale_method: "Nearest_Neighbor" - downscale_method: "Bilinear" - -yuv_conversion_format: - # The conversion wont run if csc is false - isEnable: False - conv_type: '444' - -pre_gamma: - isEnable: False - -tone_mapping: - isEnable: False - -jpeg_conversion: - isEnable: False diff --git a/config/Outdoor3-configs.yml b/config/Outdoor3-configs.yml deleted file mode 100644 index d6d3580..0000000 --- a/config/Outdoor3-configs.yml +++ /dev/null @@ -1,150 +0,0 @@ -platform: - filename: "Outdoor3_2592x1536_12bit_RGGB.raw" - disable_progress_bar: False - leave_pbar_string: False - -sensor_info: - bayer_pattern: "rggb" - range: 4095 - bitdep: 12 - width: 2592 - height: 1536 - hdr: False - -crop: - isEnable: False - isDebug: False - new_width: 1280 - new_height: 720 - -dead_pixel_correction: - isEnable: True - dp_threshold: 80 - isDebug: True - -hdr_stitching: - isEnable: False - -black_level_correction: - isEnable: True - r_offset: 200 - gr_offset: 200 - gb_offset: 200 - b_offset: 200 - isLinear: False - r_sat: 1023 - gr_sat: 1023 - gb_sat: 1023 - b_sat: 1023 - -OECF: - isEnable: False - # Make sure the LUT has the right bit range i.e. if image is of 10 bit LUT should be from [0 - (2^10)-1] - # LUT here does nothing to the sensor response i.e. a value of 800 maps to 800 and 2000 maps to 2000 - r_lut: [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2094,2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,2480,2481,2482,2483,2484,2485,2486,2487,2488,2489,2490,2491,2492,2493,2494,2495,2496,2497,2498,2499,2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559,2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574,2575,2576,2577,2578,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2601,2602,2603,2604,2605,2606,2607,2608,2609,2610,2611,2612,2613,2614,2615,2616,2617,2618,2619,2620,2621,2622,2623,2624,2625,2626,2627,2628,2629,2630,2631,2632,2633,2634,2635,2636,2637,2638,2639,2640,2641,2642,2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658,2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,2691,2692,2693,2694,2695,2696,2697,2698,2699,2700,2701,2702,2703,2704,2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2729,2730,2731,2732,2733,2734,2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,2751,2752,2753,2754,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,2766,2767,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2780,2781,2782,2783,2784,2785,2786,2787,2788,2789,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,2810,2811,2812,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2857,2858,2859,2860,2861,2862,2863,2864,2865,2866,2867,2868,2869,2870,2871,2872,2873,2874,2875,2876,2877,2878,2879,2880,2881,2882,2883,2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,2962,2963,2964,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020,3021,3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069,3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3113,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174,3175,3176,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,3188,3189,3190,3191,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,3278,3279,3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295,3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327,3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343,3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,3388,3389,3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405,3406,3407,3408,3409,3410,3411,3412,3413,3414,3415,3416,3417,3418,3419,3420,3421,3422,3423,3424,3425,3426,3427,3428,3429,3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443,3444,3445,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3456,3457,3458,3459,3460,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,3512,3513,3514,3515,3516,3517,3518,3519,3520,3521,3522,3523,3524,3525,3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541,3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557,3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573,3574,3575,3576,3577,3578,3579,3580,3581,3582,3583,3584,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695,3696,3697,3698,3699,3700,3701,3702,3703,3704,3705,3706,3707,3708,3709,3710,3711,3712,3713,3714,3715,3716,3717,3718,3719,3720,3721,3722,3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744,3745,3746,3747,3748,3749,3750,3751,3752,3753,3754,3755,3756,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,3767,3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,3779,3780,3781,3782,3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3802,3803,3804,3805,3806,3807,3808,3809,3810,3811,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,3822,3823,3824,3825,3826,3827,3828,3829,3830,3831,3832,3833,3834,3835,3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847,3848,3849,3850,3851,3852,3853,3854,3855,3856,3857,3858,3859,3860,3861,3862,3863,3864,3865,3866,3867,3868,3869,3870,3871,3872,3873,3874,3875,3876,3877,3878,3879,3880,3881,3882,3883,3884,3885,3886,3887,3888,3889,3890,3891,3892,3893,3894,3895,3896,3897,3898,3899,3900,3901,3902,3903,3904,3905,3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,3940,3941,3942,3943,3944,3945,3946,3947,3948,3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,3978,3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,3992,3993,3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,4056,4057,4058,4059,4060,4061,4062,4063,4064,4065,4066,4067,4068,4069,4070,4071,4072,4073,4074,4075,4076,4077,4078,4079,4080,4081,4082,4083,4084,4085,4086,4087,4088,4089,4090,4091,4092,4093,4094,4095] - -digital_gain: - isEnable: True - isDebug: True - # Array of pre-define Gains - gain_array: [1, 2, 4, 6, 8, 10, 12, 16, 32, 64] - # Index of default gain - current_gain: 0 - -lens_shading_correction: - isEnable: False - -bayer_noise_reduction: - isEnable: True - filt_window: 9 - r_stdDevS: 1 - r_stdDevR: 0.1 - g_stdDevS: 1 - g_stdDevR: 0.08 - b_stdDevS: 1 - b_stdDevR: 0.1 - -white_balance: - isEnable: True - # isAuto refers to auto white balance module - isAuto: True - r_gain: 1.768566 - b_gain: 1.641026 - -demosaic: - isEnable: True - -auto_white_balance: - isDebug: True - algorithm: "pca" - # grey_world, norm_2, pca - percentage: 3.5 - -color_correction_matrix: - #Row sum to 1 convention - isEnable: True - - corrected_red: [1.67578, -0.59375, -0.08203125] - corrected_green: [-0.2421875, 1.5078125, -0.265625] - corrected_blue: [-0.0078125, -0.44921875, 1.45703125] - -gamma_correction: - isEnable: True - - gammaLut: [0,5,9,13,17,22,25,29,33,37,40,44,47,50,54,57,60,63,66,69,72,75,78,80,83,85,88,90,93,95,97,99,101,103,105,107,109,111,113,115,117,118,120,122,123,125,126,128,129,131,132,134,135,136,138,139,140,141,142,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,162,163,164,165,166,167,167,168,169,170,171,171,172,173,173,174,175,176,176,177,178,179,179,180,181,181,182,183,183,184,185,185,186,187,187,188,188,189,190,190,191,191,192,193,193,194,194,195,195,196,197,197,198,198,199,199,200,200,201,201,202,202,203,203,204,204,205,205,206,206,207,207,208,208,209,209,210,210,211,211,212,212,213,213,214,214,215,215,216,216,217,217,218,218,219,219,220,220,221,221,221,222,222,223,223,224,224,225,225,225,226,226,227,227,228,228,228,229,229,230,230,231,231,231,232,232,233,233,234,234,234,235,235,236,236,237,237,238,238,238,239,239,240,240,241,241,241,242,242,243,243,244,244,244,245,245,246,246,247,247,247,248,248,249,249,250,250,250,251,251,252,252,252,253,253,254,254,255] - - -auto_exposure: - isEnable: True - isDebug: True - center_illuminance: 90 - histogram_skewness: 1 - -color_space_conversion: - isEnable: True - # Bt.709 HD = 1 - # Bt.601/4407 = 2 - conv_standard: 1 - # analog = 1 - # digital = 2 - conv_type: 2 - -ldci: - isEnable: True - clip_limit: 1 - wind: 16 - -sharpen: - isEnable: False - - -2d_noise_reduction: - isEnable: True - window_size: 9 - patch_size: 5 - h: 5 - -scale: - isEnable: False - isDebug: True - new_width: 1920 - new_height: 1080 - isHardware: True - # Nearest_Neighbor # Bilinear - Algo: "Nearest_Neighbor" - upscale_method: "Nearest_Neighbor" - downscale_method: "Bilinear" - -yuv_conversion_format: - # The conversion wont run if csc is false - isEnable: False - conv_type: '444' - -pre_gamma: - isEnable: False - -tone_mapping: - isEnable: False - -jpeg_conversion: - isEnable: False diff --git a/config/Outdoor4-configs.yml b/config/Outdoor4-configs.yml deleted file mode 100644 index 1e2c7fe..0000000 --- a/config/Outdoor4-configs.yml +++ /dev/null @@ -1,150 +0,0 @@ -platform: - filename: "Outdoor4_2592x1536_12bit_RGGB.raw" - disable_progress_bar: False - leave_pbar_string: False - -sensor_info: - bayer_pattern: "rggb" - range: 4095 - bitdep: 12 - width: 2592 - height: 1536 - hdr: False - -crop: - isEnable: False - isDebug: False - new_width: 1280 - new_height: 720 - -dead_pixel_correction: - isEnable: True - dp_threshold: 80 - isDebug: True - -hdr_stitching: - isEnable: False - -black_level_correction: - isEnable: True - r_offset: 200 - gr_offset: 200 - gb_offset: 200 - b_offset: 200 - isLinear: False - r_sat: 1023 - gr_sat: 1023 - gb_sat: 1023 - b_sat: 1023 - -OECF: - isEnable: False - # Make sure the LUT has the right bit range i.e. if image is of 10 bit LUT should be from [0 - (2^10)-1] - # LUT here does nothing to the sensor response i.e. a value of 800 maps to 800 and 2000 maps to 2000 - r_lut: [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2094,2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,2480,2481,2482,2483,2484,2485,2486,2487,2488,2489,2490,2491,2492,2493,2494,2495,2496,2497,2498,2499,2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559,2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574,2575,2576,2577,2578,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2601,2602,2603,2604,2605,2606,2607,2608,2609,2610,2611,2612,2613,2614,2615,2616,2617,2618,2619,2620,2621,2622,2623,2624,2625,2626,2627,2628,2629,2630,2631,2632,2633,2634,2635,2636,2637,2638,2639,2640,2641,2642,2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658,2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,2691,2692,2693,2694,2695,2696,2697,2698,2699,2700,2701,2702,2703,2704,2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2729,2730,2731,2732,2733,2734,2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,2751,2752,2753,2754,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,2766,2767,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2780,2781,2782,2783,2784,2785,2786,2787,2788,2789,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,2810,2811,2812,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2857,2858,2859,2860,2861,2862,2863,2864,2865,2866,2867,2868,2869,2870,2871,2872,2873,2874,2875,2876,2877,2878,2879,2880,2881,2882,2883,2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,2962,2963,2964,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020,3021,3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069,3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3113,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174,3175,3176,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,3188,3189,3190,3191,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,3278,3279,3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295,3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327,3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343,3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,3388,3389,3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405,3406,3407,3408,3409,3410,3411,3412,3413,3414,3415,3416,3417,3418,3419,3420,3421,3422,3423,3424,3425,3426,3427,3428,3429,3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443,3444,3445,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3456,3457,3458,3459,3460,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,3512,3513,3514,3515,3516,3517,3518,3519,3520,3521,3522,3523,3524,3525,3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541,3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557,3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573,3574,3575,3576,3577,3578,3579,3580,3581,3582,3583,3584,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695,3696,3697,3698,3699,3700,3701,3702,3703,3704,3705,3706,3707,3708,3709,3710,3711,3712,3713,3714,3715,3716,3717,3718,3719,3720,3721,3722,3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744,3745,3746,3747,3748,3749,3750,3751,3752,3753,3754,3755,3756,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,3767,3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,3779,3780,3781,3782,3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3802,3803,3804,3805,3806,3807,3808,3809,3810,3811,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,3822,3823,3824,3825,3826,3827,3828,3829,3830,3831,3832,3833,3834,3835,3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847,3848,3849,3850,3851,3852,3853,3854,3855,3856,3857,3858,3859,3860,3861,3862,3863,3864,3865,3866,3867,3868,3869,3870,3871,3872,3873,3874,3875,3876,3877,3878,3879,3880,3881,3882,3883,3884,3885,3886,3887,3888,3889,3890,3891,3892,3893,3894,3895,3896,3897,3898,3899,3900,3901,3902,3903,3904,3905,3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,3940,3941,3942,3943,3944,3945,3946,3947,3948,3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,3978,3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,3992,3993,3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,4056,4057,4058,4059,4060,4061,4062,4063,4064,4065,4066,4067,4068,4069,4070,4071,4072,4073,4074,4075,4076,4077,4078,4079,4080,4081,4082,4083,4084,4085,4086,4087,4088,4089,4090,4091,4092,4093,4094,4095] - -digital_gain: - isEnable: True - isDebug: True - # Array of pre-define Gains - gain_array: [1, 2, 4, 6, 8, 10, 12, 16, 32, 64] - # Index of default gain - current_gain: 0 - -lens_shading_correction: - isEnable: False - -bayer_noise_reduction: - isEnable: True - filt_window: 9 - r_stdDevS: 1 - r_stdDevR: 0.1 - g_stdDevS: 1 - g_stdDevR: 0.08 - b_stdDevS: 1 - b_stdDevR: 0.1 - -white_balance: - isEnable: True - # isAuto refers to auto white balance module - isAuto: True - r_gain: 1.768566 - b_gain: 1.641026 - -demosaic: - isEnable: True - -auto_white_balance: - isDebug: True - algorithm: "pca" - # grey_world, norm_2, pca - percentage: 3.5 - -color_correction_matrix: - #Row sum to 1 convention - isEnable: True - - corrected_red: [1.67578, -0.59375, -0.08203125] - corrected_green: [-0.2421875, 1.5078125, -0.265625] - corrected_blue: [-0.0078125, -0.44921875, 1.45703125] - -gamma_correction: - isEnable: True - - gammaLut: [0,5,9,13,17,22,25,29,33,37,40,44,47,50,54,57,60,63,66,69,72,75,78,80,83,85,88,90,93,95,97,99,101,103,105,107,109,111,113,115,117,118,120,122,123,125,126,128,129,131,132,134,135,136,138,139,140,141,142,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,162,163,164,165,166,167,167,168,169,170,171,171,172,173,173,174,175,176,176,177,178,179,179,180,181,181,182,183,183,184,185,185,186,187,187,188,188,189,190,190,191,191,192,193,193,194,194,195,195,196,197,197,198,198,199,199,200,200,201,201,202,202,203,203,204,204,205,205,206,206,207,207,208,208,209,209,210,210,211,211,212,212,213,213,214,214,215,215,216,216,217,217,218,218,219,219,220,220,221,221,221,222,222,223,223,224,224,225,225,225,226,226,227,227,228,228,228,229,229,230,230,231,231,231,232,232,233,233,234,234,234,235,235,236,236,237,237,238,238,238,239,239,240,240,241,241,241,242,242,243,243,244,244,244,245,245,246,246,247,247,247,248,248,249,249,250,250,250,251,251,252,252,252,253,253,254,254,255] - - -auto_exposure: - isEnable: True - isDebug: True - center_illuminance: 90 - histogram_skewness: 1 - -color_space_conversion: - isEnable: True - # Bt.709 HD = 1 - # Bt.601/4407 = 2 - conv_standard: 1 - # analog = 1 - # digital = 2 - conv_type: 2 - -ldci: - isEnable: True - clip_limit: 1 - wind: 16 - -sharpen: - isEnable: False - - -2d_noise_reduction: - isEnable: True - window_size: 9 - patch_size: 5 - h: 5 - -scale: - isEnable: False - isDebug: True - new_width: 1920 - new_height: 1080 - isHardware: True - # Nearest_Neighbor # Bilinear - Algo: "Nearest_Neighbor" - upscale_method: "Nearest_Neighbor" - downscale_method: "Bilinear" - -yuv_conversion_format: - # The conversion wont run if csc is false - isEnable: False - conv_type: '444' - -pre_gamma: - isEnable: False - -tone_mapping: - isEnable: False - -jpeg_conversion: - isEnable: False diff --git a/config/configs.yml b/config/configs.yml index 10b2999..3dc9c1a 100644 --- a/config/configs.yml +++ b/config/configs.yml @@ -1,147 +1,170 @@ platform: filename: "ColorChecker_2592x1536_12bits_RGGB.raw" - disable_progress_bar: False - leave_pbar_string: False + disable_progress_bar: false + leave_pbar_string: false + render_3a: false + # npy, png or both + save_format: both sensor_info: bayer_pattern: "rggb" range: 1023 - bitdep: 12 + bit_depth: 12 width: 2592 height: 1536 - hdr: False crop: - isEnable: False - isDebug: False + is_enable: false + is_debug: false new_width: 1280 - new_height: 720 + new_height: 720 + is_save: false dead_pixel_correction: - isEnable: True + is_enable: false dp_threshold: 80 - isDebug: True + is_debug: true + is_save: false -hdr_stitching: - isEnable: False - -black_level_correction: - isEnable: True +black_level_correction: + is_enable: true r_offset: 200 gr_offset: 200 gb_offset: 200 b_offset: 200 - isLinear: False - r_sat: 1023 - gr_sat: 1023 - gb_sat: 1023 - b_sat: 1023 - -OECF: - isEnable: False + is_linear: true + r_sat: 4095 + gr_sat: 4095 + gb_sat: 4095 + b_sat: 4095 + is_save: false + +oecf: + is_enable: false # Make sure the LUT has the right bit range i.e. if image is of 10 bit LUT should be from [0 - (2^10)-1] # LUT here does nothing to the sensor response i.e. a value of 800 maps to 800 and 2000 maps to 2000 r_lut: [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2094,2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,2480,2481,2482,2483,2484,2485,2486,2487,2488,2489,2490,2491,2492,2493,2494,2495,2496,2497,2498,2499,2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559,2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574,2575,2576,2577,2578,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2601,2602,2603,2604,2605,2606,2607,2608,2609,2610,2611,2612,2613,2614,2615,2616,2617,2618,2619,2620,2621,2622,2623,2624,2625,2626,2627,2628,2629,2630,2631,2632,2633,2634,2635,2636,2637,2638,2639,2640,2641,2642,2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658,2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,2691,2692,2693,2694,2695,2696,2697,2698,2699,2700,2701,2702,2703,2704,2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2729,2730,2731,2732,2733,2734,2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,2751,2752,2753,2754,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,2766,2767,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2780,2781,2782,2783,2784,2785,2786,2787,2788,2789,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,2810,2811,2812,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2857,2858,2859,2860,2861,2862,2863,2864,2865,2866,2867,2868,2869,2870,2871,2872,2873,2874,2875,2876,2877,2878,2879,2880,2881,2882,2883,2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,2962,2963,2964,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020,3021,3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069,3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3113,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174,3175,3176,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,3188,3189,3190,3191,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,3278,3279,3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295,3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327,3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343,3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,3388,3389,3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405,3406,3407,3408,3409,3410,3411,3412,3413,3414,3415,3416,3417,3418,3419,3420,3421,3422,3423,3424,3425,3426,3427,3428,3429,3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443,3444,3445,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3456,3457,3458,3459,3460,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,3512,3513,3514,3515,3516,3517,3518,3519,3520,3521,3522,3523,3524,3525,3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541,3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557,3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573,3574,3575,3576,3577,3578,3579,3580,3581,3582,3583,3584,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695,3696,3697,3698,3699,3700,3701,3702,3703,3704,3705,3706,3707,3708,3709,3710,3711,3712,3713,3714,3715,3716,3717,3718,3719,3720,3721,3722,3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744,3745,3746,3747,3748,3749,3750,3751,3752,3753,3754,3755,3756,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,3767,3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,3779,3780,3781,3782,3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3802,3803,3804,3805,3806,3807,3808,3809,3810,3811,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,3822,3823,3824,3825,3826,3827,3828,3829,3830,3831,3832,3833,3834,3835,3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847,3848,3849,3850,3851,3852,3853,3854,3855,3856,3857,3858,3859,3860,3861,3862,3863,3864,3865,3866,3867,3868,3869,3870,3871,3872,3873,3874,3875,3876,3877,3878,3879,3880,3881,3882,3883,3884,3885,3886,3887,3888,3889,3890,3891,3892,3893,3894,3895,3896,3897,3898,3899,3900,3901,3902,3903,3904,3905,3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,3940,3941,3942,3943,3944,3945,3946,3947,3948,3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,3978,3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,3992,3993,3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,4056,4057,4058,4059,4060,4061,4062,4063,4064,4065,4066,4067,4068,4069,4070,4071,4072,4073,4074,4075,4076,4077,4078,4079,4080,4081,4082,4083,4084,4085,4086,4087,4088,4089,4090,4091,4092,4093,4094,4095] + is_save: false digital_gain: - isEnable: True - isDebug: True + is_debug: true + is_auto: true # Array of pre-define Gains gain_array: [1, 2, 4, 6, 8, 10, 12, 16, 32, 64] # Index of default gain current_gain: 0 + ae_feedback: 0 + is_save: false lens_shading_correction: - isEnable: False - -bayer_noise_reduction: - isEnable: False - filt_window: 9 - r_stdDevS: 1 - r_stdDevR: 0.1 - g_stdDevS: 1 - g_stdDevR: 0.08 - b_stdDevS: 1 - b_stdDevR: 0.1 + is_enable: false + is_save: false + +bayer_noise_reduction: + is_enable: true + filter_window: 9 + r_std_dev_s: 1 + r_std_dev_r: 0.1 + g_std_dev_s: 1 + g_std_dev_r: 0.08 + b_std_dev_s: 1 + b_std_dev_r: 0.1 + is_save: false + +auto_white_balance: + is_enable: true + is_debug: true + underexposed_percentage: 5 + overexposed_percentage: 5 + algorithm: "norm_2" + # grey_world, norm_2, pca + percentage: 3.5 # pca white_balance: - isEnable: True - # isAuto refers to auto white balance module - isAuto: True + is_enable: true + # is_auto refers to auto white balance module + is_debug: true + is_auto: true r_gain: 1.24609375 b_gain: 2.80859375 + is_save: false demosaic: - isEnable: True - -auto_white_balance: - isDebug: True - algorithm: "norm_2" - # grey_world, norm_2, pca - percentage: 3.5 + is_save: false color_correction_matrix: #Row sum to 1 convention - isEnable: False + is_enable: true corrected_red: [1.660, -0.527, -0.133] corrected_green: [-0.408, 1.563, -0.082] corrected_blue: [-0.055, -1.641, 2.695] - -gamma_correction: - isEnable: True - gammaLut: [0,5,9,13,17,22,25,29,33,37,40,44,47,50,54,57,60,63,66,69,72,75,78,80,83,85,88,90,93,95,97,99,101,103,105,107,109,111,113,115,117,118,120,122,123,125,126,128,129,131,132,134,135,136,138,139,140,141,142,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,162,163,164,165,166,167,167,168,169,170,171,171,172,173,173,174,175,176,176,177,178,179,179,180,181,181,182,183,183,184,185,185,186,187,187,188,188,189,190,190,191,191,192,193,193,194,194,195,195,196,197,197,198,198,199,199,200,200,201,201,202,202,203,203,204,204,205,205,206,206,207,207,208,208,209,209,210,210,211,211,212,212,213,213,214,214,215,215,216,216,217,217,218,218,219,219,220,220,221,221,221,222,222,223,223,224,224,225,225,225,226,226,227,227,228,228,228,229,229,230,230,231,231,231,232,232,233,233,234,234,234,235,235,236,236,237,237,238,238,238,239,239,240,240,241,241,241,242,242,243,243,244,244,244,245,245,246,246,247,247,247,248,248,249,249,250,250,250,251,251,252,252,252,253,253,254,254,255] + is_save: false + +gamma_correction: + is_enable: true + # 8-bit + gamma_lut_8: [0, 5, 9, 13, 17, 22, 25, 29, 33, 37, 40, 44, 47, 50, 54, 57, 60, 63, 66, 69, 72, 75, 78, 80, 83, 85, 88, 90, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113, 115, 117, 118, 120, 122, 123, 125, 126, 128, 129, 131, 132, 134, 135, 136, 138, 139, 140, 141, 142, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 162, 163, 164, 165, 166, 167, 167, 168, 169, 170, 171, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 179, 179, 180, 181, 181, 182, 183, 183, 184, 185, 185, 186, 187, 187, 188, 188, 189, 190, 190, 191, 191, 192, 193, 193, 194, 194, 195, 195, 196, 197, 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 205, 205, 206, 206, 207, 207, 208, 208, 209, 209, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 216, 217, 217, 218, 218, 219, 219, 220, 220, 221, 221, 221, 222, 222, 223, 223, 224, 224, 225, 225, 225, 226, 226, 227, 227, 228, 228, 228, 229, 229, 230, 230, 231, 231, 231, 232, 232, 233, 233, 234, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240, 241, 241, 241, 242, 242, 243, 243, 244, 244, 244, 245, 245, 246, 246, 247, 247, 247, 248, 248, 249, 249, 250, 250, 250, 251, 251, 252, 252, 252, 253, 253, 254, 254, 255] + # 10-bit + gamma_lut_10: [0, 9, 13, 17, 21, 25, 29, 34, 38, 42, 46, 50, 54, 58, 62, 66, 70, 74, 78, 82, 86, 90, 94, 98, 102, 106, 110, 114, 117, 121, 125, 129, 132, 136, 140, 143, 147, 150, 154, 157, 161, 165, 168, 172, 175, 179, 182, 185, 189, 192, 196, 199, 202, 205, 209, 212, 215, 219, 222, 225, 228, 231, 235, 238, 241, 244, 247, 250, 253, 256, 259, 262, 265, 268, 271, 274, 277, 280, 283, 286, 289, 292, 295, 297, 300, 303, 306, 308, 311, 314, 317, 319, 322, 325, 327, 330, 332, 335, 337, 340, 342, 345, 347, 350, 352, 355, 357, 359, 362, 364, 367, 369, 371, 374, 376, 378, 380, 383, 385, 387, 389, 392, 394, 396, 398, 400, 402, 404, 406, 409, 411, 413, 415, 417, 419, 421, 423, 425, 427, 429, 431, 433, 435, 437, 439, 441, 443, 444, 446, 448, 450, 452, 454, 455, 457, 459, 461, 463, 464, 466, 468, 469, 471, 473, 474, 476, 478, 479, 481, 483, 484, 486, 488, 489, 491, 492, 494, 495, 497, 499, 500, 502, 503, 505, 506, 508, 509, 511, 513, 514, 516, 517, 519, 520, 521, 523, 524, 526, 527, 529, 530, 532, 533, 534, 536, 537, 539, 540, 541, 543, 544, 545, 547, 548, 549, 550, 552, 553, 554, 555, 557, 558, 559, 560, 562, 563, 564, 565, 567, 568, 569, 570, 571, 573, 574, 575, 576, 577, 578, 580, 581, 582, 583, 584, 585, 586, 588, 589, 590, 591, 592, 593, 594, 595, 596, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 633, 634, 635, 636, 637, 638, 639, 640, 641, 641, 642, 643, 644, 645, 646, 647, 648, 649, 649, 650, 651, 652, 653, 654, 655, 655, 656, 657, 658, 659, 660, 660, 661, 662, 663, 664, 665, 665, 666, 667, 668, 669, 670, 670, 671, 672, 673, 674, 674, 675, 676, 677, 678, 678, 679, 680, 681, 681, 682, 683, 683, 684, 685, 686, 686, 687, 688, 689, 689, 690, 691, 692, 692, 693, 694, 695, 695, 696, 697, 697, 698, 699, 700, 700, 701, 702, 703, 703, 704, 705, 705, 706, 707, 708, 708, 709, 710, 710, 711, 712, 713, 713, 714, 715, 715, 716, 717, 717, 718, 719, 719, 720, 721, 722, 722, 723, 724, 724, 725, 726, 726, 727, 728, 728, 729, 730, 731, 731, 732, 733, 733, 734, 734, 735, 736, 736, 737, 738, 738, 739, 740, 740, 741, 742, 742, 743, 744, 744, 745, 745, 746, 747, 747, 748, 749, 749, 750, 751, 751, 752, 753, 753, 754, 754, 755, 756, 756, 757, 757, 758, 759, 759, 760, 761, 761, 762, 762, 763, 763, 764, 765, 765, 766, 766, 767, 768, 768, 769, 769, 770, 771, 771, 772, 772, 773, 774, 774, 775, 775, 776, 776, 777, 777, 778, 779, 779, 780, 780, 781, 782, 782, 783, 783, 784, 784, 785, 785, 786, 787, 787, 788, 788, 789, 789, 790, 791, 791, 792, 792, 793, 793, 794, 794, 795, 795, 796, 797, 797, 797, 798, 799, 799, 800, 800, 801, 801, 802, 802, 803, 803, 804, 805, 805, 806, 806, 806, 807, 808, 808, 809, 809, 810, 810, 811, 811, 812, 812, 813, 813, 814, 814, 815, 815, 816, 816, 817, 817, 818, 818, 819, 819, 820, 821, 821, 821, 822, 823, 823, 824, 824, 825, 825, 826, 826, 827, 827, 828, 828, 829, 829, 830, 830, 831, 831, 832, 832, 833, 833, 834, 834, 835, 835, 836, 836, 837, 837, 838, 838, 839, 839, 839, 840, 841, 841, 842, 842, 842, 843, 843, 844, 845, 845, 845, 846, 846, 847, 847, 848, 848, 849, 849, 850, 850, 851, 851, 852, 852, 853, 853, 854, 854, 855, 855, 856, 856, 857, 857, 858, 858, 859, 859, 860, 860, 861, 861, 862, 862, 863, 863, 864, 864, 865, 865, 866, 866, 867, 867, 868, 868, 868, 869, 870, 870, 870, 871, 871, 872, 872, 873, 873, 874, 874, 875, 875, 876, 876, 877, 877, 878, 878, 879, 879, 880, 880, 881, 881, 881, 882, 882, 883, 883, 884, 884, 885, 885, 886, 886, 887, 887, 887, 888, 888, 889, 889, 890, 890, 891, 891, 892, 892, 892, 893, 893, 894, 894, 895, 895, 896, 896, 896, 897, 897, 898, 898, 899, 899, 900, 900, 900, 901, 901, 902, 902, 903, 903, 903, 904, 904, 905, 905, 906, 906, 906, 907, 907, 908, 908, 909, 909, 910, 910, 910, 911, 911, 912, 912, 913, 913, 913, 914, 914, 915, 915, 916, 916, 916, 917, 917, 918, 918, 919, 919, 919, 920, 920, 921, 921, 922, 922, 922, 923, 923, 924, 924, 925, 925, 925, 926, 926, 927, 927, 928, 928, 928, 929, 929, 930, 930, 931, 931, 931, 932, 932, 933, 933, 934, 934, 934, 935, 935, 936, 936, 936, 937, 937, 938, 938, 939, 939, 939, 940, 940, 941, 941, 942, 942, 943, 943, 943, 944, 944, 945, 945, 946, 946, 947, 947, 947, 948, 948, 949, 949, 950, 950, 951, 951, 951, 952, 952, 953, 953, 954, 954, 955, 955, 956, 956, 956, 957, 957, 958, 958, 959, 959, 960, 960, 961, 961, 961, 962, 962, 963, 963, 964, 964, 964, 965, 965, 966, 966, 967, 967, 968, 968, 968, 969, 969, 970, 970, 971, 971, 971, 972, 972, 973, 973, 974, 974, 975, 975, 975, 976, 976, 977, 977, 977, 978, 978, 979, 979, 980, 980, 980, 981, 981, 982, 982, 983, 983, 983, 984, 984, 985, 985, 986, 986, 986, 987, 987, 988, 988, 988, 989, 989, 990, 990, 990, 991, 991, 992, 992, 993, 993, 994, 994, 994, 995, 995, 996, 996, 997, 997, 997, 998, 998, 999, 999, 999, 1000, 1000, 1001, 1001, 1002, 1002, 1002, 1003, 1003, 1004, 1004, 1004, 1005, 1005, 1006, 1006, 1007, 1007, 1007, 1008, 1008, 1009, 1009, 1010, 1010, 1010, 1011, 1011, 1012, 1012, 1013, 1013, 1013, 1014, 1014, 1015, 1015, 1015, 1016, 1016, 1017, 1017, 1018, 1018, 1018, 1019, 1019, 1020, 1020, 1021, 1021, 1021, 1022, 1022, 1023, 1023] + # 12-bit + gamma_lut_12: [0, 11, 21, 30, 37, 42, 46, 50, 53, 57, 61, 65, 70, 74, 78, 82, 86, 90, 94, 98, 102, 106, 110, 114, 118, 122, 126, 131, 135, 139, 143, 147, 151, 155, 159, 163, 167, 171, 175, 179, 183, 187, 191, 195, 199, 203, 207, 212, 216, 220, 224, 228, 232, 236, 240, 245, 249, 253, 257, 261, 265, 269, 273, 277, 281, 285, 289, 293, 297, 301, 305, 309, 313, 317, 321, 326, 330, 334, 338, 342, 346, 350, 354, 358, 362, 365, 369, 373, 377, 381, 385, 390, 394, 398, 401, 405, 409, 413, 417, 421, 425, 429, 432, 436, 440, 443, 447, 451, 455, 458, 462, 466, 470, 473, 477, 481, 485, 488, 492, 496, 500, 503, 507, 511, 515, 519, 522, 526, 530, 533, 537, 540, 544, 547, 551, 555, 559, 562, 566, 569, 573, 576, 580, 584, 588, 591, 595, 598, 602, 605, 609, 612, 616, 619, 622, 626, 630, 633, 637, 641, 645, 648, 652, 655, 659, 662, 665, 669, 673, 676, 680, 683, 687, 690, 693, 696, 700, 703, 707, 711, 715, 718, 721, 724, 728, 731, 734, 738, 742, 745, 749, 752, 756, 759, 762, 765, 769, 772, 775, 779, 783, 786, 789, 792, 796, 799, 802, 805, 809, 812, 815, 818, 822, 825, 828, 832, 836, 839, 842, 845, 849, 852, 855, 858, 862, 865, 868, 871, 875, 878, 881, 884, 888, 890, 893, 896, 900, 903, 906, 910, 914, 917, 920, 923, 926, 929, 932, 935, 939, 942, 945, 948, 952, 954, 957, 960, 964, 967, 970, 973, 977, 979, 982, 985, 989, 992, 995, 998, 1002, 1005, 1007, 1010, 1014, 1016, 1019, 1022, 1026, 1028, 1031, 1034, 1038, 1040, 1043, 1046, 1050, 1052, 1055, 1058, 1062, 1064, 1067, 1070, 1074, 1076, 1079, 1082, 1086, 1088, 1091, 1094, 1098, 1100, 1103, 1106, 1110, 1112, 1115, 1118, 1121, 1123, 1126, 1129, 1133, 1135, 1138, 1141, 1145, 1147, 1150, 1153, 1156, 1158, 1161, 1163, 1167, 1169, 1172, 1175, 1179, 1181, 1184, 1187, 1190, 1192, 1195, 1198, 1201, 1203, 1206, 1209, 1212, 1214, 1217, 1220, 1223, 1225, 1228, 1231, 1234, 1236, 1239, 1242, 1245, 1247, 1250, 1253, 1256, 1258, 1261, 1264, 1267, 1269, 1271, 1274, 1277, 1279, 1282, 1284, 1288, 1290, 1293, 1296, 1299, 1301, 1303, 1306, 1309, 1311, 1314, 1317, 1320, 1322, 1324, 1327, 1330, 1332, 1335, 1338, 1341, 1343, 1345, 1347, 1350, 1352, 1355, 1358, 1360, 1363, 1365, 1367, 1369, 1372, 1375, 1378, 1380, 1383, 1385, 1387, 1389, 1392, 1395, 1397, 1400, 1403, 1405, 1407, 1409, 1412, 1414, 1417, 1419, 1422, 1424, 1427, 1429, 1431, 1434, 1436, 1438, 1441, 1443, 1446, 1448, 1451, 1453, 1456, 1458, 1461, 1463, 1465, 1467, 1469, 1471, 1474, 1476, 1479, 1481, 1484, 1486, 1488, 1491, 1493, 1495, 1497, 1499, 1502, 1504, 1506, 1509, 1511, 1513, 1515, 1518, 1520, 1522, 1524, 1527, 1529, 1531, 1533, 1535, 1538, 1540, 1542, 1544, 1547, 1549, 1551, 1553, 1556, 1558, 1560, 1563, 1565, 1567, 1569, 1571, 1573, 1575, 1577, 1579, 1582, 1584, 1586, 1588, 1590, 1592, 1594, 1596, 1599, 1601, 1603, 1605, 1607, 1609, 1611, 1613, 1616, 1618, 1620, 1622, 1624, 1626, 1628, 1630, 1633, 1635, 1637, 1639, 1641, 1643, 1645, 1647, 1650, 1652, 1654, 1656, 1658, 1660, 1662, 1664, 1666, 1668, 1670, 1672, 1674, 1676, 1678, 1680, 1682, 1684, 1686, 1688, 1691, 1693, 1695, 1697, 1699, 1701, 1703, 1705, 1707, 1709, 1711, 1713, 1715, 1717, 1719, 1721, 1723, 1725, 1727, 1728, 1730, 1732, 1734, 1736, 1738, 1740, 1742, 1744, 1746, 1748, 1750, 1751, 1753, 1755, 1757, 1759, 1761, 1763, 1765, 1767, 1769, 1771, 1773, 1774, 1776, 1778, 1780, 1782, 1784, 1786, 1788, 1789, 1791, 1793, 1795, 1796, 1798, 1800, 1802, 1803, 1805, 1807, 1809, 1811, 1813, 1815, 1817, 1818, 1820, 1822, 1824, 1825, 1827, 1829, 1831, 1832, 1834, 1836, 1838, 1839, 1841, 1843, 1845, 1847, 1849, 1851, 1853, 1854, 1856, 1857, 1858, 1860, 1862, 1864, 1866, 1868, 1870, 1872, 1874, 1875, 1876, 1878, 1880, 1881, 1883, 1885, 1887, 1888, 1890, 1892, 1893, 1895, 1896, 1898, 1900, 1901, 1903, 1905, 1907, 1908, 1910, 1912, 1913, 1915, 1916, 1918, 1920, 1921, 1923, 1925, 1927, 1928, 1930, 1932, 1933, 1935, 1936, 1938, 1940, 1941, 1943, 1945, 1947, 1948, 1949, 1951, 1952, 1954, 1955, 1957, 1959, 1960, 1962, 1964, 1965, 1967, 1968, 1970, 1972, 1973, 1975, 1977, 1978, 1979, 1981, 1982, 1983, 1985, 1987, 1989, 1990, 1992, 1993, 1995, 1997, 1998, 2000, 2002, 2003, 2005, 2006, 2008, 2009, 2011, 2012, 2014, 2015, 2017, 2018, 2020, 2021, 2023, 2024, 2026, 2027, 2029, 2030, 2032, 2033, 2035, 2036, 2038, 2039, 2041, 2042, 2044, 2046, 2047, 2049, 2051, 2052, 2053, 2055, 2056, 2057, 2059, 2061, 2063, 2064, 2066, 2067, 2069, 2070, 2072, 2073, 2075, 2076, 2077, 2079, 2080, 2081, 2083, 2084, 2086, 2087, 2089, 2090, 2092, 2093, 2095, 2096, 2098, 2099, 2101, 2102, 2104, 2105, 2107, 2108, 2110, 2111, 2112, 2114, 2115, 2116, 2117, 2119, 2121, 2122, 2124, 2125, 2127, 2128, 2129, 2130, 2132, 2133, 2135, 2136, 2138, 2139, 2140, 2142, 2143, 2144, 2145, 2147, 2149, 2150, 2152, 2153, 2155, 2156, 2157, 2159, 2160, 2161, 2162, 2163, 2165, 2166, 2168, 2169, 2171, 2172, 2173, 2175, 2176, 2177, 2178, 2179, 2181, 2182, 2184, 2185, 2187, 2188, 2189, 2191, 2192, 2193, 2194, 2195, 2197, 2198, 2199, 2200, 2202, 2203, 2205, 2206, 2208, 2209, 2210, 2212, 2213, 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2222, 2223, 2225, 2226, 2228, 2229, 2230, 2232, 2233, 2234, 2235, 2237, 2238, 2239, 2240, 2241, 2242, 2243, 2244, 2245, 2247, 2248, 2249, 2250, 2252, 2253, 2255, 2256, 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274, 2276, 2277, 2278, 2279, 2281, 2282, 2283, 2284, 2286, 2287, 2288, 2289, 2291, 2292, 2293, 2295, 2296, 2297, 2297, 2299, 2300, 2301, 2302, 2303, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2314, 2315, 2316, 2318, 2319, 2320, 2320, 2322, 2323, 2324, 2325, 2326, 2328, 2329, 2330, 2332, 2333, 2334, 2334, 2336, 2337, 2338, 2339, 2340, 2342, 2343, 2343, 2345, 2346, 2347, 2348, 2349, 2351, 2352, 2353, 2354, 2355, 2356, 2356, 2358, 2359, 2360, 2361, 2362, 2364, 2365, 2365, 2367, 2368, 2369, 2370, 2371, 2373, 2374, 2374, 2376, 2377, 2378, 2379, 2380, 2382, 2383, 2383, 2385, 2386, 2387, 2388, 2389, 2391, 2392, 2393, 2394, 2395, 2396, 2396, 2398, 2399, 2400, 2401, 2402, 2404, 2405, 2406, 2407, 2408, 2409, 2409, 2411, 2412, 2413, 2414, 2415, 2417, 2418, 2419, 2420, 2421, 2422, 2422, 2424, 2425, 2426, 2426, 2428, 2429, 2430, 2430, 2432, 2433, 2434, 2434, 2436, 2437, 2438, 2439, 2440, 2442, 2443, 2444, 2445, 2446, 2447, 2447, 2449, 2450, 2451, 2451, 2453, 2454, 2455, 2455, 2457, 2458, 2459, 2459, 2461, 2462, 2463, 2463, 2465, 2466, 2467, 2468, 2469, 2470, 2470, 2471, 2472, 2473, 2473, 2474, 2476, 2477, 2478, 2478, 2480, 2481, 2482, 2482, 2484, 2485, 2486, 2486, 2488, 2489, 2490, 2490, 2492, 2493, 2494, 2494, 2496, 2497, 2498, 2498, 2500, 2501, 2502, 2502, 2504, 2505, 2505, 2506, 2507, 2508, 2509, 2509, 2511, 2512, 2512, 2513, 2514, 2515, 2515, 2516, 2517, 2519, 2520, 2520, 2522, 2523, 2524, 2524, 2526, 2527, 2528, 2528, 2530, 2531, 2531, 2532, 2533, 2534, 2535, 2535, 2537, 2538, 2538, 2539, 2540, 2541, 2542, 2542, 2544, 2545, 2545, 2546, 2547, 2548, 2548, 2549, 2550, 2552, 2553, 2553, 2555, 2556, 2556, 2557, 2558, 2559, 2560, 2560, 2562, 2563, 2563, 2564, 2565, 2566, 2566, 2567, 2568, 2570, 2571, 2571, 2573, 2574, 2574, 2575, 2576, 2577, 2577, 2578, 2580, 2581, 2581, 2582, 2583, 2584, 2584, 2585, 2586, 2587, 2587, 2588, 2589, 2591, 2592, 2592, 2594, 2595, 2595, 2596, 2597, 2598, 2598, 2599, 2600, 2601, 2602, 2602, 2604, 2605, 2605, 2606, 2607, 2608, 2608, 2609, 2610, 2612, 2613, 2613, 2615, 2616, 2616, 2617, 2618, 2619, 2619, 2620, 2621, 2622, 2622, 2623, 2624, 2625, 2625, 2626, 2627, 2629, 2630, 2630, 2632, 2633, 2633, 2634, 2635, 2636, 2636, 2637, 2638, 2639, 2639, 2640, 2641, 2642, 2642, 2643, 2645, 2646, 2646, 2647, 2648, 2649, 2649, 2650, 2651, 2653, 2653, 2654, 2655, 2656, 2656, 2657, 2658, 2659, 2659, 2660, 2661, 2662, 2662, 2663, 2665, 2666, 2666, 2667, 2668, 2669, 2669, 2670, 2671, 2672, 2672, 2673, 2674, 2675, 2675, 2676, 2677, 2679, 2679, 2680, 2681, 2682, 2682, 2683, 2684, 2685, 2685, 2686, 2687, 2688, 2688, 2689, 2690, 2691, 2691, 2692, 2693, 2695, 2695, 2696, 2697, 2698, 2698, 2699, 2700, 2701, 2701, 2702, 2703, 2704, 2704, 2705, 2706, 2707, 2707, 2708, 2709, 2711, 2711, 2712, 2713, 2714, 2714, 2714, 2715, 2716, 2716, 2717, 2718, 2720, 2720, 2721, 2722, 2723, 2723, 2724, 2725, 2726, 2726, 2727, 2728, 2729, 2729, 2730, 2731, 2732, 2732, 2733, 2734, 2735, 2735, 2736, 2737, 2738, 2738, 2739, 2740, 2741, 2741, 2742, 2743, 2744, 2744, 2745, 2746, 2747, 2747, 2748, 2749, 2750, 2750, 2751, 2752, 2753, 2753, 2754, 2755, 2756, 2756, 2757, 2758, 2759, 2759, 2760, 2761, 2762, 2762, 2763, 2764, 2765, 2765, 2766, 2767, 2768, 2768, 2769, 2770, 2771, 2771, 2772, 2773, 2774, 2774, 2775, 2776, 2777, 2777, 2778, 2779, 2780, 2780, 2780, 2781, 2782, 2782, 2782, 2783, 2785, 2785, 2786, 2788, 2789, 2789, 2789, 2790, 2791, 2791, 2792, 2793, 2794, 2794, 2795, 2796, 2797, 2797, 2798, 2799, 2800, 2800, 2801, 2802, 2803, 2803, 2804, 2805, 2806, 2806, 2807, 2808, 2809, 2809, 2810, 2811, 2812, 2812, 2812, 2813, 2814, 2814, 2814, 2815, 2817, 2817, 2818, 2820, 2821, 2821, 2821, 2822, 2823, 2823, 2824, 2825, 2826, 2826, 2827, 2828, 2829, 2829, 2830, 2831, 2832, 2832, 2833, 2834, 2835, 2835, 2835, 2836, 2837, 2837, 2838, 2839, 2841, 2841, 2841, 2842, 2843, 2843, 2843, 2845, 2846, 2846, 2847, 2848, 2849, 2849, 2850, 2851, 2852, 2852, 2853, 2854, 2855, 2855, 2855, 2856, 2857, 2857, 2858, 2859, 2860, 2860, 2861, 2862, 2863, 2863, 2864, 2865, 2866, 2866, 2866, 2867, 2868, 2868, 2869, 2870, 2871, 2871, 2872, 2873, 2874, 2874, 2875, 2876, 2877, 2877, 2877, 2878, 2879, 2879, 2880, 2881, 2883, 2883, 2883, 2884, 2885, 2885, 2885, 2887, 2888, 2888, 2889, 2890, 2891, 2891, 2892, 2893, 2894, 2894, 2894, 2895, 2896, 2896, 2897, 2898, 2899, 2899, 2900, 2901, 2902, 2902, 2903, 2904, 2905, 2905, 2905, 2906, 2907, 2907, 2907, 2908, 2910, 2910, 2911, 2912, 2913, 2913, 2913, 2914, 2915, 2915, 2915, 2917, 2918, 2918, 2919, 2920, 2921, 2921, 2922, 2923, 2924, 2924, 2924, 2925, 2926, 2926, 2926, 2927, 2928, 2928, 2929, 2930, 2932, 2932, 2932, 2933, 2934, 2934, 2934, 2935, 2936, 2936, 2937, 2938, 2939, 2939, 2940, 2941, 2942, 2942, 2943, 2944, 2945, 2945, 2945, 2946, 2947, 2947, 2947, 2948, 2950, 2950, 2951, 2952, 2953, 2953, 2953, 2954, 2955, 2955, 2956, 2957, 2958, 2958, 2958, 2959, 2960, 2960, 2961, 2962, 2963, 2963, 2963, 2964, 2965, 2965, 2965, 2966, 2968, 2968, 2969, 2970, 2971, 2971, 2971, 2972, 2973, 2973, 2973, 2974, 2976, 2976, 2977, 2978, 2979, 2979, 2979, 2980, 2981, 2981, 2981, 2982, 2983, 2983, 2983, 2984, 2986, 2986, 2987, 2988, 2989, 2989, 2989, 2990, 2991, 2991, 2992, 2993, 2994, 2994, 2994, 2995, 2996, 2996, 2997, 2998, 2999, 2999, 2999, 3000, 3001, 3001, 3002, 3003, 3004, 3004, 3004, 3005, 3006, 3006, 3006, 3007, 3009, 3009, 3010, 3011, 3012, 3012, 3012, 3013, 3014, 3014, 3014, 3015, 3016, 3016, 3017, 3018, 3019, 3019, 3019, 3020, 3021, 3021, 3022, 3023, 3024, 3024, 3024, 3025, 3026, 3026, 3027, 3028, 3029, 3029, 3029, 3030, 3031, 3031, 3031, 3033, 3034, 3034, 3034, 3035, 3036, 3036, 3036, 3037, 3038, 3038, 3038, 3039, 3041, 3041, 3042, 3043, 3044, 3044, 3044, 3045, 3046, 3046, 3046, 3047, 3048, 3048, 3049, 3050, 3051, 3051, 3051, 3052, 3053, 3053, 3053, 3054, 3055, 3055, 3056, 3057, 3058, 3058, 3058, 3059, 3060, 3060, 3060, 3061, 3062, 3062, 3063, 3064, 3065, 3065, 3065, 3066, 3067, 3067, 3067, 3068, 3069, 3069, 3070, 3071, 3072, 3072, 3072, 3073, 3074, 3074, 3074, 3076, 3077, 3077, 3077, 3078, 3079, 3079, 3079, 3080, 3082, 3082, 3082, 3083, 3084, 3084, 3084, 3085, 3086, 3086, 3086, 3088, 3089, 3089, 3089, 3090, 3091, 3091, 3091, 3092, 3093, 3093, 3093, 3095, 3096, 3096, 3096, 3097, 3098, 3098, 3098, 3099, 3100, 3100, 3100, 3102, 3103, 3103, 3103, 3104, 3105, 3105, 3105, 3106, 3107, 3107, 3107, 3108, 3109, 3109, 3109, 3110, 3111, 3111, 3111, 3112, 3114, 3114, 3114, 3115, 3116, 3116, 3116, 3117, 3118, 3118, 3118, 3119, 3121, 3121, 3121, 3122, 3123, 3123, 3123, 3124, 3125, 3125, 3125, 3126, 3128, 3128, 3128, 3129, 3130, 3130, 3130, 3131, 3132, 3132, 3132, 3133, 3134, 3134, 3134, 3135, 3137, 3137, 3137, 3138, 3139, 3139, 3139, 3140, 3141, 3141, 3141, 3142, 3143, 3143, 3143, 3144, 3145, 3145, 3145, 3146, 3148, 3148, 3148, 3149, 3150, 3150, 3150, 3151, 3152, 3152, 3152, 3153, 3155, 3155, 3155, 3156, 3157, 3157, 3157, 3158, 3159, 3159, 3159, 3160, 3161, 3161, 3162, 3163, 3164, 3163, 3163, 3164, 3165, 3165, 3165, 3166, 3168, 3168, 3168, 3169, 3170, 3170, 3170, 3171, 3172, 3172, 3172, 3173, 3175, 3175, 3175, 3176, 3177, 3177, 3177, 3178, 3179, 3179, 3179, 3180, 3181, 3181, 3181, 3182, 3183, 3183, 3183, 3184, 3185, 3185, 3185, 3186, 3188, 3188, 3188, 3189, 3190, 3189, 3189, 3190, 3191, 3191, 3191, 3192, 3194, 3194, 3194, 3195, 3196, 3196, 3196, 3197, 3198, 3198, 3199, 3200, 3201, 3201, 3201, 3201, 3202, 3201, 3202, 3202, 3204, 3204, 3204, 3205, 3207, 3207, 3207, 3208, 3209, 3209, 3209, 3210, 3211, 3211, 3211, 3212, 3213, 3213, 3213, 3214, 3215, 3215, 3215, 3216, 3217, 3217, 3218, 3219, 3220, 3219, 3219, 3220, 3221, 3221, 3221, 3222, 3224, 3224, 3224, 3225, 3226, 3225, 3225, 3226, 3227, 3227, 3227, 3228, 3230, 3230, 3230, 3231, 3232, 3232, 3232, 3233, 3234, 3234, 3234, 3235, 3236, 3236, 3236, 3237, 3238, 3238, 3238, 3239, 3240, 3240, 3240, 3242, 3243, 3243, 3243, 3243, 3244, 3243, 3244, 3244, 3246, 3246, 3247, 3248, 3249, 3248, 3248, 3249, 3250, 3250, 3250, 3251, 3253, 3253, 3253, 3254, 3255, 3255, 3255, 3256, 3257, 3257, 3257, 3258, 3259, 3259, 3259, 3260, 3261, 3261, 3261, 3262, 3263, 3263, 3263, 3264, 3265, 3265, 3265, 3266, 3267, 3267, 3267, 3268, 3269, 3269, 3269, 3270, 3271, 3271, 3271, 3272, 3273, 3273, 3273, 3274, 3275, 3275, 3275, 3276, 3278, 3278, 3278, 3278, 3279, 3278, 3279, 3279, 3281, 3281, 3281, 3282, 3284, 3284, 3284, 3285, 3286, 3285, 3285, 3286, 3287, 3287, 3287, 3288, 3290, 3290, 3290, 3291, 3292, 3291, 3291, 3292, 3293, 3293, 3293, 3294, 3296, 3296, 3296, 3297, 3298, 3298, 3298, 3299, 3300, 3300, 3300, 3301, 3302, 3302, 3302, 3303, 3304, 3304, 3304, 3305, 3306, 3306, 3306, 3307, 3308, 3308, 3308, 3309, 3310, 3310, 3310, 3311, 3312, 3312, 3312, 3313, 3314, 3314, 3314, 3315, 3316, 3316, 3316, 3317, 3318, 3318, 3318, 3319, 3320, 3320, 3320, 3321, 3322, 3322, 3322, 3323, 3324, 3324, 3324, 3325, 3326, 3326, 3326, 3327, 3328, 3328, 3328, 3329, 3330, 3330, 3330, 3331, 3332, 3332, 3332, 3333, 3334, 3334, 3334, 3335, 3336, 3336, 3336, 3337, 3338, 3338, 3338, 3339, 3340, 3340, 3340, 3341, 3342, 3342, 3342, 3343, 3344, 3344, 3344, 3345, 3346, 3346, 3346, 3347, 3348, 3348, 3348, 3349, 3350, 3350, 3350, 3351, 3352, 3352, 3352, 3353, 3354, 3354, 3354, 3355, 3356, 3356, 3356, 3357, 3358, 3357, 3357, 3358, 3359, 3359, 3359, 3360, 3362, 3362, 3362, 3363, 3364, 3363, 3363, 3364, 3365, 3365, 3365, 3366, 3368, 3368, 3368, 3369, 3370, 3369, 3369, 3370, 3371, 3371, 3371, 3372, 3374, 3373, 3373, 3374, 3375, 3374, 3375, 3375, 3377, 3377, 3377, 3378, 3380, 3379, 3379, 3380, 3381, 3380, 3381, 3381, 3383, 3383, 3383, 3384, 3385, 3385, 3385, 3386, 3387, 3387, 3387, 3388, 3389, 3389, 3389, 3390, 3391, 3391, 3391, 3392, 3393, 3393, 3393, 3394, 3395, 3395, 3395, 3396, 3397, 3397, 3397, 3398, 3399, 3399, 3399, 3400, 3401, 3401, 3401, 3402, 3403, 3403, 3403, 3404, 3405, 3405, 3405, 3406, 3407, 3406, 3406, 3407, 3408, 3408, 3408, 3409, 3411, 3411, 3411, 3412, 3413, 3412, 3412, 3413, 3414, 3414, 3414, 3415, 3417, 3417, 3417, 3418, 3419, 3418, 3418, 3419, 3420, 3419, 3420, 3420, 3422, 3422, 3422, 3423, 3425, 3424, 3424, 3425, 3426, 3425, 3425, 3426, 3428, 3428, 3428, 3429, 3431, 3430, 3430, 3431, 3432, 3431, 3432, 3432, 3434, 3434, 3434, 3435, 3436, 3436, 3436, 3437, 3438, 3438, 3438, 3439, 3440, 3440, 3440, 3441, 3442, 3442, 3442, 3443, 3444, 3444, 3444, 3445, 3446, 3446, 3446, 3447, 3448, 3448, 3448, 3449, 3450, 3450, 3450, 3451, 3452, 3452, 3452, 3453, 3454, 3454, 3454, 3455, 3456, 3456, 3456, 3457, 3458, 3458, 3458, 3459, 3460, 3460, 3460, 3461, 3462, 3462, 3462, 3463, 3464, 3463, 3464, 3464, 3466, 3466, 3466, 3467, 3468, 3467, 3467, 3468, 3469, 3469, 3469, 3470, 3472, 3472, 3472, 3473, 3474, 3473, 3473, 3474, 3475, 3474, 3474, 3475, 3477, 3477, 3477, 3478, 3480, 3479, 3479, 3480, 3481, 3480, 3481, 3481, 3483, 3483, 3483, 3484, 3485, 3485, 3485, 3486, 3487, 3487, 3487, 3488, 3489, 3489, 3489, 3490, 3491, 3491, 3491, 3492, 3493, 3492, 3493, 3493, 3495, 3495, 3495, 3496, 3497, 3496, 3496, 3497, 3498, 3498, 3498, 3499, 3501, 3501, 3501, 3502, 3503, 3502, 3502, 3503, 3504, 3503, 3503, 3504, 3506, 3506, 3506, 3507, 3509, 3508, 3508, 3509, 3510, 3509, 3510, 3510, 3512, 3512, 3512, 3513, 3514, 3513, 3514, 3514, 3516, 3515, 3516, 3516, 3518, 3517, 3518, 3518, 3520, 3519, 3520, 3520, 3522, 3522, 3522, 3523, 3524, 3523, 3523, 3524, 3525, 3524, 3524, 3525, 3527, 3527, 3527, 3528, 3530, 3529, 3529, 3530, 3531, 3530, 3531, 3531, 3533, 3532, 3533, 3533, 3535, 3535, 3535, 3536, 3537, 3536, 3536, 3537, 3538, 3537, 3537, 3538, 3540, 3540, 3540, 3541, 3543, 3542, 3542, 3543, 3544, 3543, 3544, 3544, 3546, 3545, 3546, 3546, 3548, 3548, 3548, 3549, 3550, 3549, 3549, 3550, 3551, 3550, 3551, 3551, 3553, 3552, 3553, 3553, 3555, 3554, 3555, 3555, 3557, 3556, 3557, 3557, 3559, 3559, 3559, 3560, 3561, 3560, 3560, 3561, 3562, 3561, 3562, 3562, 3564, 3563, 3564, 3564, 3566, 3566, 3566, 3567, 3568, 3567, 3567, 3568, 3569, 3568, 3569, 3569, 3571, 3570, 3571, 3571, 3573, 3572, 3573, 3573, 3575, 3574, 3575, 3575, 3577, 3577, 3577, 3578, 3579, 3578, 3578, 3579, 3580, 3579, 3580, 3580, 3582, 3581, 3582, 3582, 3584, 3584, 3584, 3585, 3586, 3585, 3585, 3586, 3587, 3586, 3587, 3587, 3589, 3588, 3589, 3589, 3591, 3590, 3591, 3591, 3593, 3593, 3593, 3594, 3595, 3594, 3594, 3595, 3596, 3595, 3596, 3596, 3598, 3597, 3598, 3598, 3600, 3600, 3600, 3601, 3602, 3601, 3601, 3602, 3603, 3602, 3603, 3603, 3605, 3604, 3605, 3605, 3607, 3606, 3607, 3608, 3609, 3608, 3608, 3609, 3610, 3609, 3610, 3610, 3612, 3612, 3612, 3613, 3614, 3613, 3613, 3614, 3615, 3614, 3615, 3615, 3617, 3616, 3617, 3617, 3619, 3619, 3619, 3620, 3621, 3620, 3620, 3621, 3622, 3622, 3622, 3623, 3625, 3624, 3624, 3625, 3626, 3625, 3625, 3625, 3627, 3627, 3627, 3628, 3630, 3629, 3629, 3630, 3631, 3630, 3630, 3631, 3633, 3632, 3633, 3633, 3635, 3634, 3635, 3636, 3637, 3636, 3636, 3637, 3638, 3637, 3637, 3638, 3640, 3640, 3640, 3641, 3642, 3641, 3641, 3642, 3643, 3642, 3643, 3643, 3645, 3644, 3645, 3645, 3647, 3646, 3647, 3648, 3649, 3648, 3648, 3649, 3650, 3649, 3649, 3650, 3652, 3652, 3652, 3653, 3654, 3653, 3653, 3654, 3655, 3654, 3655, 3655, 3657, 3656, 3657, 3657, 3659, 3658, 3659, 3659, 3661, 3660, 3660, 3661, 3662, 3661, 3661, 3662, 3664, 3663, 3664, 3665, 3666, 3665, 3665, 3666, 3667, 3666, 3667, 3667, 3669, 3668, 3669, 3669, 3671, 3670, 3671, 3671, 3673, 3672, 3672, 3673, 3674, 3673, 3673, 3674, 3676, 3675, 3676, 3677, 3678, 3677, 3677, 3678, 3679, 3678, 3678, 3679, 3681, 3680, 3681, 3682, 3683, 3682, 3682, 3683, 3684, 3683, 3683, 3684, 3686, 3685, 3686, 3686, 3688, 3687, 3688, 3688, 3690, 3689, 3689, 3690, 3691, 3690, 3690, 3691, 3693, 3692, 3693, 3694, 3695, 3694, 3694, 3695, 3696, 3695, 3695, 3696, 3698, 3697, 3698, 3699, 3700, 3699, 3699, 3700, 3701, 3700, 3700, 3701, 3703, 3702, 3703, 3703, 3705, 3704, 3705, 3705, 3707, 3706, 3706, 3707, 3708, 3707, 3707, 3708, 3710, 3709, 3710, 3710, 3712, 3711, 3711, 3712, 3713, 3712, 3712, 3713, 3715, 3714, 3715, 3715, 3717, 3716, 3716, 3717, 3718, 3717, 3717, 3718, 3720, 3719, 3720, 3720, 3722, 3721, 3722, 3722, 3724, 3723, 3723, 3724, 3725, 3724, 3724, 3724, 3726, 3726, 3726, 3727, 3729, 3728, 3728, 3729, 3730, 3729, 3730, 3730, 3732, 3731, 3731, 3731, 3733, 3733, 3733, 3734, 3736, 3735, 3735, 3736, 3737, 3736, 3736, 3736, 3738, 3737, 3737, 3738, 3740, 3739, 3740, 3740, 3742, 3741, 3742, 3742, 3744, 3743, 3743, 3744, 3745, 3744, 3744, 3745, 3747, 3746, 3747, 3747, 3749, 3748, 3749, 3749, 3751, 3750, 3750, 3751, 3752, 3751, 3751, 3752, 3754, 3753, 3754, 3754, 3756, 3755, 3756, 3756, 3758, 3757, 3757, 3758, 3759, 3758, 3758, 3759, 3761, 3760, 3761, 3761, 3763, 3762, 3763, 3763, 3765, 3764, 3764, 3765, 3766, 3765, 3765, 3766, 3768, 3767, 3768, 3768, 3770, 3769, 3770, 3770, 3772, 3771, 3771, 3772, 3773, 3772, 3772, 3773, 3775, 3774, 3775, 3775, 3777, 3776, 3777, 3777, 3779, 3778, 3778, 3779, 3780, 3779, 3779, 3780, 3782, 3781, 3782, 3782, 3784, 3783, 3783, 3784, 3786, 3785, 3786, 3786, 3788, 3787, 3787, 3788, 3789, 3788, 3788, 3789, 3791, 3790, 3791, 3791, 3793, 3792, 3792, 3793, 3795, 3794, 3795, 3795, 3797, 3796, 3796, 3797, 3798, 3797, 3797, 3798, 3800, 3799, 3800, 3800, 3802, 3801, 3801, 3802, 3804, 3803, 3804, 3804, 3806, 3805, 3805, 3806, 3807, 3806, 3806, 3807, 3809, 3808, 3809, 3809, 3811, 3810, 3810, 3811, 3813, 3812, 3813, 3813, 3815, 3814, 3814, 3815, 3816, 3815, 3815, 3816, 3818, 3817, 3818, 3818, 3820, 3819, 3820, 3820, 3822, 3821, 3821, 3822, 3824, 3823, 3824, 3824, 3826, 3825, 3825, 3826, 3827, 3826, 3826, 3827, 3829, 3828, 3829, 3829, 3831, 3830, 3830, 3831, 3833, 3832, 3833, 3833, 3835, 3834, 3834, 3835, 3836, 3835, 3835, 3836, 3838, 3837, 3838, 3838, 3840, 3839, 3839, 3840, 3842, 3841, 3842, 3842, 3844, 3843, 3843, 3844, 3845, 3844, 3844, 3845, 3847, 3846, 3847, 3847, 3849, 3848, 3848, 3849, 3850, 3849, 3849, 3850, 3852, 3851, 3852, 3852, 3854, 3853, 3853, 3854, 3856, 3855, 3856, 3856, 3858, 3857, 3857, 3858, 3859, 3858, 3858, 3859, 3861, 3860, 3861, 3861, 3863, 3862, 3862, 3863, 3865, 3864, 3865, 3865, 3867, 3866, 3866, 3867, 3868, 3867, 3867, 3868, 3870, 3869, 3869, 3870, 3872, 3871, 3872, 3872, 3874, 3873, 3873, 3874, 3875, 3874, 3874, 3875, 3877, 3876, 3877, 3877, 3879, 3878, 3878, 3879, 3881, 3880, 3881, 3881, 3883, 3882, 3882, 3882, 3884, 3883, 3883, 3884, 3886, 3885, 3885, 3886, 3887, 3886, 3886, 3887, 3889, 3888, 3888, 3889, 3891, 3890, 3891, 3891, 3893, 3892, 3892, 3892, 3894, 3893, 3893, 3894, 3896, 3895, 3895, 3896, 3898, 3897, 3898, 3898, 3900, 3899, 3899, 3899, 3901, 3900, 3900, 3901, 3903, 3902, 3902, 3903, 3904, 3903, 3903, 3904, 3906, 3905, 3905, 3906, 3908, 3907, 3908, 3908, 3910, 3909, 3909, 3909, 3911, 3910, 3910, 3911, 3913, 3912, 3912, 3913, 3915, 3914, 3915, 3915, 3917, 3916, 3916, 3916, 3918, 3917, 3917, 3918, 3920, 3919, 3919, 3920, 3921, 3920, 3920, 3921, 3923, 3922, 3922, 3923, 3925, 3924, 3925, 3925, 3927, 3926, 3926, 3926, 3928, 3927, 3927, 3928, 3930, 3929, 3929, 3930, 3932, 3931, 3932, 3932, 3934, 3933, 3933, 3933, 3935, 3934, 3934, 3935, 3937, 3936, 3936, 3936, 3938, 3937, 3937, 3938, 3940, 3939, 3939, 3940, 3942, 3941, 3942, 3942, 3944, 3943, 3943, 3943, 3945, 3944, 3944, 3945, 3947, 3946, 3946, 3947, 3949, 3948, 3949, 3949, 3951, 3950, 3950, 3950, 3952, 3951, 3951, 3952, 3954, 3953, 3953, 3953, 3955, 3954, 3954, 3955, 3957, 3956, 3957, 3957, 3959, 3958, 3958, 3958, 3960, 3959, 3959, 3960, 3962, 3961, 3961, 3961, 3963, 3962, 3962, 3963, 3965, 3964, 3964, 3965, 3967, 3966, 3967, 3967, 3969, 3968, 3968, 3968, 3970, 3969, 3969, 3970, 3972, 3971, 3971, 3972, 3974, 3973, 3974, 3974, 3976, 3975, 3975, 3975, 3977, 3976, 3976, 3977, 3979, 3978, 3978, 3978, 3980, 3979, 3979, 3980, 3982, 3981, 3981, 3982, 3984, 3983, 3983, 3984, 3986, 3985, 3986, 3986, 3988, 3987, 3987, 3987, 3989, 3988, 3988, 3989, 3991, 3990, 3990, 3990, 3992, 3991, 3991, 3992, 3994, 3993, 3993, 3994, 3996, 3995, 3995, 3996, 3998, 3997, 3997, 3997, 3999, 3998, 3998, 3999, 4001, 4000, 4000, 4001, 4003, 4002, 4002, 4003, 4005, 4004, 4004, 4004, 4006, 4005, 4005, 4006, 4008, 4007, 4007, 4007, 4009, 4008, 4008, 4009, 4011, 4010, 4010, 4011, 4013, 4012, 4012, 4013, 4015, 4014, 4014, 4014, 4016, 4015, 4015, 4016, 4018, 4017, 4017, 4017, 4019, 4018, 4018, 4019, 4021, 4020, 4020, 4021, 4023, 4022, 4022, 4023, 4025, 4024, 4024, 4025, 4027, 4026, 4026, 4026, 4028, 4027, 4027, 4028, 4030, 4029, 4029, 4029, 4031, 4030, 4030, 4031, 4033, 4032, 4032, 4033, 4035, 4034, 4034, 4035, 4037, 4036, 4036, 4036, 4038, 4037, 4037, 4038, 4040, 4039, 4039, 4039, 4041, 4040, 4040, 4041, 4043, 4042, 4042, 4043, 4045, 4044, 4044, 4045, 4047, 4046, 4046, 4047, 4049, 4048, 4048, 4048, 4050, 4049, 4049, 4050, 4052, 4051, 4051, 4051, 4053, 4052, 4052, 4053, 4055, 4054, 4054, 4055, 4057, 4056, 4056, 4057, 4059, 4058, 4058, 4058, 4060, 4059, 4059, 4060, 4062, 4061, 4061, 4061, 4062, 4062, 4062, 4063, 4064, 4064, 4064, 4065, 4066, 4066, 4066, 4067, 4068, 4068, 4068, 4069, 4070, 4070, 4070, 4070, 4071, 4071, 4071, 4072, 4073, 4073, 4073, 4073, 4074, 4074, 4074, 4075, 4076, 4076, 4076, 4077, 4078, 4078, 4078, 4079, 4080, 4080, 4080, 4080, 4081, 4081, 4081, 4082, 4083, 4083, 4083, 4083, 4084, 4084, 4084, 4085, 4086, 4086, 4086, 4087, 4088, 4088, 4088, 4089, 4090, 4090, 4091, 4092, 4093, 4093, 4094, 4095] + # 14-bit + gamma_lut_14: [0, 11, 22, 32, 43, 53, 64, 74, 83, 93, 102, 110, 119, 127, 134, 141, 148, 154, 160, 165, 170, 174, 178, 182, 186, 190, 193, 196, 199, 202, 205, 209, 212, 215, 219, 223, 227, 231, 235, 239, 244, 248, 252, 257, 262, 266, 271, 275, 280, 284, 288, 293, 297, 301, 305, 309, 313, 317, 321, 325, 329, 332, 336, 340, 344, 348, 352, 356, 360, 364, 368, 372, 376, 380, 384, 388, 392, 396, 400, 404, 408, 412, 416, 420, 424, 427, 431, 435, 439, 443, 447, 451, 455, 459, 464, 468, 472, 476, 480, 484, 489, 493, 497, 501, 506, 510, 514, 519, 523, 527, 531, 536, 540, 544, 548, 552, 556, 560, 564, 568, 572, 576, 580, 584, 588, 592, 596, 600, 604, 608, 612, 616, 620, 623, 627, 631, 636, 639, 643, 647, 652, 656, 660, 664, 668, 672, 676, 680, 684, 688, 692, 696, 700, 704, 708, 712, 716, 720, 724, 728, 732, 736, 739, 743, 747, 751, 755, 759, 763, 767, 771, 775, 779, 783, 787, 792, 796, 800, 804, 808, 813, 817, 821, 825, 830, 834, 838, 842, 847, 851, 855, 860, 864, 868, 872, 876, 880, 884, 887, 891, 896, 899, 903, 907, 912, 915, 919, 924, 928, 932, 936, 940, 944, 948, 953, 957, 961, 966, 970, 974, 979, 983, 987, 991, 996, 1000, 1004, 1008, 1012, 1016, 1020, 1024, 1028, 1032, 1036, 1040, 1044, 1048, 1052, 1056, 1060, 1064, 1067, 1071, 1075, 1079, 1083, 1087, 1091, 1095, 1099, 1103, 1107, 1111, 1115, 1120, 1124, 1128, 1131, 1135, 1140, 1143, 1147, 1151, 1156, 1159, 1163, 1167, 1172, 1175, 1179, 1184, 1188, 1191, 1195, 1199, 1203, 1207, 1211, 1215, 1219, 1223, 1227, 1231, 1235, 1239, 1243, 1247, 1252, 1256, 1260, 1264, 1268, 1272, 1277, 1281, 1285, 1289, 1294, 1298, 1303, 1307, 1311, 1315, 1320, 1324, 1327, 1332, 1336, 1339, 1343, 1347, 1352, 1355, 1359, 1363, 1368, 1371, 1375, 1379, 1384, 1387, 1391, 1395, 1400, 1403, 1407, 1411, 1416, 1420, 1423, 1428, 1432, 1436, 1440, 1444, 1448, 1451, 1455, 1458, 1462, 1465, 1469, 1473, 1477, 1480, 1484, 1488, 1492, 1495, 1499, 1503, 1508, 1511, 1515, 1520, 1524, 1528, 1532, 1537, 1541, 1545, 1549, 1554, 1559, 1563, 1567, 1571, 1576, 1579, 1583, 1587, 1591, 1594, 1598, 1602, 1606, 1609, 1613, 1616, 1621, 1624, 1628, 1632, 1636, 1639, 1643, 1647, 1651, 1655, 1658, 1663, 1667, 1671, 1675, 1679, 1683, 1687, 1691, 1695, 1700, 1703, 1707, 1711, 1715, 1718, 1722, 1726, 1730, 1733, 1737, 1741, 1745, 1748, 1752, 1756, 1760, 1763, 1766, 1770, 1774, 1778, 1781, 1785, 1789, 1792, 1796, 1800, 1804, 1808, 1811, 1815, 1820, 1823, 1827, 1830, 1834, 1838, 1841, 1845, 1849, 1853, 1856, 1860, 1864, 1868, 1871, 1875, 1880, 1883, 1886, 1890, 1894, 1898, 1901, 1905, 1909, 1912, 1916, 1920, 1924, 1928, 1931, 1935, 1940, 1943, 1946, 1950, 1954, 1958, 1961, 1965, 1969, 1972, 1976, 1980, 1984, 1988, 1991, 1995, 2000, 2003, 2006, 2010, 2014, 2017, 2021, 2025, 2029, 2032, 2036, 2040, 2044, 2048, 2051, 2055, 2060, 2063, 2067, 2070, 2074, 2078, 2081, 2085, 2089, 2093, 2096, 2100, 2105, 2108, 2112, 2116, 2120, 2123, 2126, 2129, 2133, 2136, 2139, 2143, 2147, 2150, 2153, 2157, 2161, 2164, 2168, 2171, 2176, 2179, 2182, 2186, 2190, 2193, 2197, 2201, 2205, 2208, 2212, 2216, 2220, 2224, 2227, 2231, 2236, 2239, 2242, 2245, 2249, 2252, 2255, 2259, 2263, 2266, 2269, 2273, 2277, 2280, 2284, 2287, 2292, 2295, 2298, 2302, 2306, 2309, 2313, 2317, 2321, 2324, 2328, 2332, 2336, 2340, 2343, 2347, 2352, 2355, 2358, 2362, 2365, 2368, 2372, 2375, 2379, 2382, 2386, 2389, 2393, 2396, 2400, 2404, 2408, 2410, 2414, 2417, 2421, 2424, 2427, 2431, 2435, 2438, 2441, 2445, 2449, 2452, 2456, 2460, 2464, 2466, 2470, 2473, 2477, 2480, 2483, 2486, 2490, 2493, 2497, 2501, 2505, 2508, 2511, 2515, 2520, 2523, 2526, 2530, 2534, 2537, 2541, 2545, 2549, 2552, 2556, 2560, 2564, 2568, 2571, 2575, 2580, 2583, 2586, 2589, 2593, 2596, 2600, 2603, 2607, 2610, 2613, 2617, 2621, 2624, 2628, 2631, 2636, 2638, 2641, 2645, 2649, 2652, 2655, 2658, 2662, 2665, 2669, 2673, 2677, 2680, 2683, 2687, 2691, 2694, 2698, 2701, 2705, 2708, 2712, 2715, 2719, 2722, 2726, 2729, 2733, 2737, 2740, 2744, 2747, 2750, 2753, 2756, 2760, 2762, 2765, 2768, 2772, 2775, 2778, 2781, 2785, 2788, 2792, 2795, 2799, 2802, 2806, 2810, 2814, 2817, 2820, 2824, 2829, 2832, 2836, 2840, 2844, 2847, 2851, 2855, 2859, 2862, 2865, 2869, 2872, 2875, 2878, 2881, 2885, 2888, 2891, 2894, 2898, 2901, 2904, 2908, 2911, 2914, 2917, 2920, 2924, 2927, 2930, 2934, 2938, 2941, 2944, 2948, 2952, 2956, 2959, 2963, 2967, 2970, 2974, 2977, 2981, 2984, 2987, 2991, 2995, 2998, 3001, 3005, 3009, 3012, 3016, 3019, 3023, 3026, 3029, 3032, 3036, 3038, 3041, 3045, 3048, 3051, 3054, 3058, 3062, 3064, 3068, 3071, 3075, 3078, 3081, 3085, 3089, 3091, 3095, 3098, 3102, 3105, 3109, 3113, 3117, 3120, 3123, 3127, 3131, 3134, 3137, 3140, 3144, 3147, 3150, 3153, 3157, 3160, 3163, 3166, 3170, 3173, 3176, 3179, 3183, 3186, 3189, 3192, 3196, 3198, 3201, 3205, 3208, 3211, 3214, 3218, 3222, 3225, 3228, 3231, 3235, 3238, 3241, 3244, 3247, 3250, 3253, 3256, 3260, 3263, 3266, 3269, 3273, 3276, 3279, 3283, 3287, 3290, 3293, 3297, 3301, 3303, 3306, 3310, 3314, 3317, 3321, 3324, 3329, 3332, 3335, 3339, 3343, 3346, 3349, 3352, 3356, 3359, 3361, 3365, 3369, 3371, 3374, 3378, 3382, 3385, 3388, 3391, 3395, 3398, 3401, 3404, 3408, 3410, 3413, 3416, 3420, 3423, 3426, 3429, 3434, 3436, 3440, 3443, 3447, 3450, 3453, 3456, 3460, 3462, 3465, 3468, 3472, 3475, 3478, 3481, 3486, 3488, 3492, 3495, 3499, 3502, 3505, 3508, 3512, 3514, 3517, 3521, 3525, 3527, 3530, 3534, 3538, 3541, 3544, 3547, 3551, 3554, 3556, 3559, 3562, 3564, 3567, 3570, 3574, 3576, 3579, 3582, 3586, 3589, 3592, 3595, 3599, 3602, 3605, 3608, 3612, 3615, 3618, 3622, 3626, 3629, 3632, 3636, 3641, 3644, 3647, 3651, 3655, 3658, 3660, 3664, 3667, 3669, 3672, 3675, 3679, 3681, 3684, 3687, 3691, 3693, 3696, 3699, 3703, 3706, 3708, 3711, 3715, 3717, 3720, 3724, 3728, 3730, 3733, 3737, 3741, 3744, 3747, 3751, 3755, 3758, 3761, 3764, 3768, 3770, 3773, 3777, 3781, 3783, 3786, 3790, 3794, 3797, 3800, 3803, 3807, 3809, 3812, 3815, 3819, 3821, 3823, 3826, 3830, 3832, 3835, 3838, 3842, 3845, 3848, 3851, 3855, 3858, 3860, 3864, 3867, 3870, 3873, 3876, 3880, 3883, 3886, 3889, 3894, 3896, 3900, 3903, 3907, 3909, 3912, 3915, 3919, 3921, 3923, 3926, 3930, 3932, 3935, 3938, 3942, 3945, 3948, 3951, 3955, 3958, 3960, 3963, 3967, 3970, 3972, 3976, 3980, 3982, 3985, 3989, 3993, 3996, 3999, 4003, 4007, 4010, 4012, 4015, 4019, 4021, 4023, 4027, 4031, 4033, 4035, 4039, 4043, 4045, 4048, 4051, 4055, 4057, 4060, 4063, 4066, 4068, 4071, 4074, 4078, 4080, 4083, 4086, 4090, 4093, 4096, 4099, 4103, 4105, 4108, 4111, 4114, 4116, 4119, 4122, 4126, 4128, 4131, 4134, 4138, 4141, 4144, 4147, 4151, 4153, 4156, 4159, 4162, 4164, 4167, 4170, 4174, 4176, 4179, 4182, 4186, 4189, 4192, 4195, 4199, 4201, 4204, 4207, 4210, 4212, 4215, 4218, 4222, 4224, 4227, 4230, 4234, 4237, 4240, 4243, 4247, 4249, 4252, 4255, 4258, 4260, 4263, 4266, 4270, 4272, 4275, 4278, 4282, 4285, 4288, 4291, 4295, 4297, 4300, 4303, 4306, 4308, 4311, 4314, 4318, 4320, 4323, 4326, 4330, 4333, 4336, 4339, 4343, 4345, 4348, 4351, 4354, 4356, 4359, 4362, 4366, 4368, 4371, 4374, 4378, 4381, 4384, 4387, 4391, 4393, 4396, 4399, 4403, 4405, 4407, 4410, 4414, 4416, 4419, 4423, 4427, 4429, 4432, 4435, 4439, 4441, 4443, 4446, 4449, 4451, 4453, 4456, 4460, 4462, 4464, 4467, 4471, 4473, 4476, 4479, 4483, 4485, 4487, 4490, 4494, 4496, 4498, 4501, 4505, 4507, 4510, 4514, 4518, 4520, 4523, 4527, 4531, 4533, 4536, 4539, 4543, 4544, 4547, 4550, 4554, 4556, 4559, 4563, 4567, 4569, 4572, 4575, 4579, 4581, 4583, 4586, 4590, 4591, 4594, 4597, 4600, 4602, 4604, 4608, 4611, 4614, 4616, 4619, 4623, 4625, 4627, 4630, 4633, 4634, 4637, 4640, 4643, 4645, 4648, 4651, 4655, 4657, 4660, 4663, 4667, 4669, 4671, 4674, 4678, 4680, 4682, 4686, 4690, 4692, 4695, 4698, 4702, 4705, 4708, 4711, 4715, 4717, 4719, 4722, 4726, 4727, 4729, 4733, 4736, 4738, 4740, 4744, 4747, 4749, 4752, 4755, 4759, 4761, 4763, 4766, 4769, 4771, 4773, 4776, 4780, 4781, 4784, 4787, 4791, 4793, 4796, 4799, 4803, 4805, 4807, 4810, 4813, 4815, 4817, 4820, 4824, 4826, 4828, 4831, 4835, 4837, 4840, 4843, 4847, 4849, 4851, 4854, 4857, 4859, 4861, 4864, 4868, 4869, 4872, 4875, 4879, 4881, 4884, 4887, 4891, 4893, 4895, 4898, 4901, 4903, 4905, 4908, 4912, 4913, 4916, 4919, 4923, 4925, 4928, 4931, 4935, 4937, 4939, 4942, 4945, 4947, 4949, 4952, 4956, 4957, 4960, 4963, 4967, 4969, 4972, 4975, 4979, 4981, 4983, 4986, 4989, 4990, 4993, 4996, 5000, 5001, 5004, 5007, 5011, 5013, 5016, 5019, 5023, 5025, 5027, 5030, 5033, 5035, 5037, 5040, 5044, 5046, 5048, 5051, 5055, 5057, 5060, 5063, 5067, 5068, 5070, 5073, 5076, 5077, 5079, 5082, 5086, 5087, 5089, 5092, 5096, 5098, 5100, 5103, 5107, 5108, 5110, 5113, 5117, 5118, 5120, 5123, 5127, 5129, 5131, 5135, 5139, 5141, 5144, 5147, 5151, 5153, 5155, 5158, 5161, 5163, 5165, 5168, 5172, 5174, 5176, 5180, 5183, 5185, 5188, 5191, 5195, 5196, 5198, 5201, 5204, 5205, 5207, 5210, 5213, 5215, 5217, 5220, 5224, 5226, 5228, 5231, 5235, 5237, 5239, 5241, 5245, 5246, 5249, 5252, 5256, 5257, 5260, 5263, 5267, 5269, 5272, 5275, 5279, 5280, 5282, 5285, 5288, 5289, 5291, 5294, 5297, 5299, 5301, 5304, 5308, 5309, 5312, 5315, 5319, 5321, 5323, 5326, 5329, 5331, 5333, 5336, 5340, 5342, 5344, 5347, 5351, 5353, 5356, 5359, 5363, 5364, 5366, 5368, 5371, 5372, 5374, 5376, 5379, 5380, 5382, 5385, 5389, 5390, 5392, 5395, 5399, 5400, 5402, 5405, 5409, 5410, 5412, 5416, 5419, 5421, 5424, 5427, 5431, 5433, 5436, 5439, 5443, 5444, 5446, 5448, 5451, 5452, 5454, 5456, 5459, 5461, 5462, 5465, 5469, 5470, 5472, 5475, 5479, 5480, 5482, 5485, 5489, 5490, 5492, 5495, 5499, 5501, 5504, 5507, 5511, 5513, 5516, 5519, 5523, 5524, 5526, 5528, 5531, 5532, 5534, 5536, 5539, 5540, 5542, 5545, 5549, 5550, 5552, 5555, 5559, 5560, 5562, 5565, 5568, 5570, 5572, 5575, 5579, 5581, 5583, 5587, 5591, 5593, 5596, 5599, 5603, 5604, 5606, 5608, 5611, 5612, 5614, 5617, 5620, 5621, 5623, 5626, 5629, 5630, 5633, 5635, 5639, 5640, 5642, 5644, 5647, 5648, 5650, 5653, 5657, 5658, 5660, 5663, 5667, 5669, 5672, 5675, 5679, 5680, 5682, 5685, 5688, 5689, 5691, 5694, 5698, 5699, 5701, 5704, 5708, 5710, 5712, 5715, 5719, 5720, 5721, 5724, 5727, 5728, 5729, 5732, 5735, 5736, 5738, 5741, 5745, 5746, 5748, 5751, 5755, 5756, 5758, 5760, 5763, 5764, 5766, 5769, 5773, 5774, 5776, 5779, 5783, 5785, 5788, 5791, 5795, 5796, 5798, 5801, 5804, 5805, 5807, 5810, 5814, 5815, 5817, 5820, 5824, 5826, 5828, 5831, 5835, 5836, 5838, 5840, 5843, 5844, 5846, 5848, 5852, 5853, 5855, 5857, 5861, 5862, 5864, 5867, 5871, 5872, 5873, 5875, 5878, 5879, 5881, 5883, 5887, 5888, 5890, 5893, 5896, 5898, 5900, 5903, 5907, 5908, 5910, 5912, 5916, 5917, 5919, 5922, 5925, 5927, 5929, 5932, 5936, 5938, 5940, 5943, 5947, 5948, 5950, 5952, 5955, 5956, 5958, 5960, 5964, 5965, 5966, 5969, 5973, 5974, 5976, 5979, 5983, 5984, 5985, 5988, 5991, 5991, 5993, 5996, 5999, 6000, 6002, 6005, 6009, 6010, 6012, 6015, 6019, 6020, 6021, 6024, 6027, 6027, 6029, 6032, 6035, 6036, 6038, 6041, 6045, 6046, 6048, 6051, 6055, 6056, 6057, 6060, 6063, 6063, 6065, 6068, 6071, 6072, 6074, 6077, 6081, 6082, 6084, 6087, 6091, 6092, 6093, 6096, 6099, 6099, 6101, 6104, 6107, 6108, 6110, 6113, 6117, 6118, 6120, 6123, 6127, 6128, 6129, 6132, 6135, 6135, 6137, 6140, 6143, 6144, 6146, 6149, 6153, 6154, 6156, 6159, 6163, 6164, 6165, 6168, 6171, 6171, 6173, 6176, 6179, 6180, 6182, 6185, 6189, 6190, 6192, 6195, 6199, 6200, 6201, 6203, 6207, 6207, 6209, 6211, 6215, 6216, 6218, 6221, 6224, 6226, 6228, 6231, 6235, 6236, 6237, 6240, 6243, 6244, 6245, 6248, 6252, 6253, 6254, 6257, 6261, 6262, 6264, 6267, 6271, 6271, 6273, 6275, 6278, 6278, 6279, 6282, 6285, 6286, 6287, 6290, 6293, 6294, 6296, 6299, 6303, 6304, 6305, 6307, 6310, 6311, 6313, 6315, 6319, 6320, 6322, 6325, 6329, 6330, 6332, 6335, 6339, 6339, 6341, 6343, 6346, 6346, 6347, 6350, 6353, 6354, 6355, 6358, 6361, 6363, 6364, 6367, 6371, 6372, 6373, 6375, 6378, 6379, 6381, 6383, 6387, 6388, 6390, 6393, 6397, 6398, 6400, 6403, 6407, 6407, 6409, 6411, 6414, 6414, 6415, 6418, 6421, 6422, 6423, 6426, 6429, 6430, 6432, 6435, 6439, 6440, 6441, 6443, 6446, 6447, 6449, 6451, 6455, 6456, 6458, 6461, 6465, 6466, 6468, 6471, 6475, 6475, 6477, 6479, 6482, 6482, 6483, 6486, 6489, 6490, 6491, 6494, 6497, 6498, 6500, 6503, 6507, 6507, 6509, 6511, 6514, 6515, 6517, 6519, 6523, 6524, 6526, 6529, 6533, 6534, 6536, 6539, 6543, 6543, 6545, 6547, 6550, 6550, 6551, 6554, 6557, 6558, 6559, 6562, 6565, 6566, 6568, 6571, 6575, 6575, 6577, 6579, 6582, 6583, 6584, 6587, 6591, 6592, 6594, 6597, 6600, 6602, 6604, 6607, 6611, 6611, 6613, 6615, 6618, 6618, 6620, 6622, 6625, 6626, 6627, 6630, 6634, 6635, 6637, 6639, 6643, 6643, 6644, 6646, 6649, 6650, 6651, 6653, 6657, 6657, 6659, 6662, 6665, 6666, 6668, 6671, 6675, 6675, 6676, 6679, 6682, 6682, 6683, 6686, 6689, 6690, 6691, 6694, 6698, 6699, 6700, 6703, 6707, 6707, 6708, 6710, 6713, 6713, 6715, 6717, 6720, 6721, 6723, 6725, 6729, 6730, 6732, 6735, 6739, 6739, 6741, 6743, 6746, 6747, 6748, 6751, 6755, 6756, 6758, 6761, 6764, 6766, 6768, 6771, 6775, 6775, 6777, 6779, 6782, 6782, 6783, 6786, 6789, 6790, 6791, 6794, 6798, 6799, 6800, 6803, 6807, 6807, 6808, 6810, 6813, 6814, 6815, 6817, 6821, 6821, 6823, 6826, 6829, 6830, 6832, 6835, 6839, 6839, 6840, 6842, 6845, 6846, 6847, 6849, 6853, 6853, 6855, 6858, 6861, 6862, 6864, 6867, 6871, 6871, 6872, 6875, 6878, 6878, 6879, 6882, 6885, 6886, 6887, 6890, 6894, 6895, 6897, 6899, 6903, 6903, 6904, 6906, 6908, 6908, 6909, 6912, 6915, 6915, 6916, 6919, 6922, 6923, 6925, 6927, 6931, 6931, 6932, 6934, 6937, 6937, 6938, 6941, 6944, 6945, 6946, 6949, 6953, 6954, 6956, 6959, 6963, 6963, 6964, 6967, 6970, 6970, 6971, 6974, 6977, 6978, 6979, 6982, 6986, 6987, 6989, 6991, 6995, 6995, 6996, 6998, 7000, 7000, 7001, 7004, 7007, 7007, 7008, 7011, 7014, 7015, 7017, 7019, 7023, 7023, 7024, 7026, 7029, 7029, 7030, 7033, 7036, 7037, 7038, 7041, 7045, 7046, 7048, 7051, 7055, 7055, 7056, 7059, 7062, 7062, 7063, 7066, 7069, 7070, 7071, 7074, 7078, 7079, 7080, 7083, 7087, 7087, 7088, 7090, 7092, 7092, 7093, 7095, 7099, 7099, 7100, 7103, 7106, 7107, 7108, 7111, 7115, 7115, 7116, 7118, 7121, 7121, 7123, 7125, 7129, 7129, 7131, 7133, 7137, 7138, 7140, 7143, 7147, 7147, 7148, 7150, 7153, 7153, 7154, 7156, 7159, 7159, 7161, 7163, 7166, 7167, 7169, 7171, 7175, 7175, 7176, 7177, 7180, 7180, 7181, 7183, 7187, 7187, 7188, 7191, 7194, 7195, 7197, 7199, 7203, 7203, 7203, 7205, 7208, 7208, 7209, 7211, 7214, 7214, 7216, 7218, 7222, 7223, 7224, 7227, 7231, 7231, 7232, 7234, 7237, 7237, 7239, 7241, 7245, 7245, 7247, 7249, 7253, 7254, 7256, 7259, 7263, 7263, 7264, 7266, 7269, 7269, 7270, 7272, 7275, 7275, 7276, 7279, 7282, 7283, 7285, 7287, 7291, 7291, 7291, 7293, 7296, 7296, 7297, 7299, 7302, 7303, 7304, 7306, 7310, 7311, 7312, 7315, 7319, 7319, 7320, 7321, 7324, 7324, 7325, 7327, 7331, 7331, 7332, 7335, 7338, 7339, 7341, 7343, 7347, 7347, 7347, 7349, 7352, 7352, 7353, 7355, 7358, 7358, 7359, 7362, 7366, 7366, 7368, 7371, 7375, 7375, 7376, 7378, 7381, 7382, 7383, 7385, 7389, 7389, 7391, 7394, 7398, 7399, 7400, 7403, 7407, 7407, 7407, 7409, 7412, 7411, 7412, 7414, 7417, 7417, 7418, 7420, 7423, 7424, 7425, 7427, 7431, 7430, 7431, 7433, 7435, 7435, 7436, 7438, 7441, 7442, 7443, 7446, 7449, 7450, 7452, 7455, 7459, 7459, 7460, 7462, 7465, 7466, 7467, 7470, 7473, 7474, 7475, 7478, 7482, 7483, 7484, 7487, 7491, 7491, 7491, 7493, 7496, 7495, 7496, 7498, 7501, 7501, 7502, 7504, 7507, 7508, 7509, 7511, 7515, 7514, 7515, 7517, 7520, 7519, 7520, 7522, 7526, 7526, 7527, 7530, 7534, 7534, 7536, 7539, 7543, 7543, 7544, 7546, 7548, 7548, 7549, 7552, 7555, 7555, 7556, 7559, 7563, 7563, 7565, 7567, 7571, 7570, 7571, 7573, 7575, 7575, 7575, 7577, 7580, 7580, 7581, 7584, 7587, 7587, 7589, 7591, 7595, 7594, 7595, 7597, 7600, 7599, 7600, 7603, 7606, 7606, 7607, 7610, 7614, 7614, 7616, 7619, 7623, 7623, 7624, 7626, 7628, 7628, 7629, 7632, 7635, 7635, 7636, 7639, 7642, 7643, 7645, 7647, 7651, 7650, 7651, 7653, 7655, 7655, 7655, 7657, 7660, 7660, 7661, 7664, 7667, 7667, 7669, 7671, 7675, 7674, 7675, 7677, 7680, 7679, 7680, 7683, 7686, 7686, 7687, 7690, 7694, 7694, 7696, 7699, 7703, 7703, 7704, 7705, 7708, 7708, 7709, 7712, 7715, 7715, 7716, 7719, 7722, 7723, 7725, 7727, 7731, 7730, 7731, 7732, 7735, 7735, 7735, 7737, 7740, 7740, 7741, 7743, 7747, 7747, 7749, 7751, 7755, 7754, 7755, 7757, 7760, 7760, 7761, 7763, 7766, 7766, 7768, 7770, 7774, 7775, 7776, 7779, 7783, 7782, 7783, 7785, 7787, 7787, 7788, 7790, 7793, 7793, 7794, 7796, 7799, 7800, 7801, 7803, 7807, 7806, 7807, 7808, 7811, 7810, 7811, 7813, 7816, 7816, 7817, 7819, 7822, 7823, 7824, 7827, 7831, 7830, 7831, 7833, 7836, 7836, 7837, 7839, 7843, 7843, 7844, 7847, 7850, 7851, 7852, 7855, 7859, 7858, 7859, 7860, 7863, 7862, 7863, 7865, 7868, 7868, 7869, 7871, 7875, 7875, 7877, 7879, 7883, 7882, 7883, 7885, 7888, 7888, 7889, 7891, 7895, 7895, 7896, 7899, 7902, 7903, 7905, 7907, 7911, 7910, 7910, 7912, 7914, 7913, 7914, 7915, 7918, 7918, 7919, 7921, 7924, 7924, 7925, 7927, 7931, 7930, 7931, 7933, 7935, 7935, 7936, 7938, 7942, 7942, 7943, 7946, 7950, 7951, 7952, 7955, 7959, 7958, 7959, 7961, 7963, 7963, 7963, 7965, 7968, 7968, 7969, 7971, 7975, 7975, 7977, 7979, 7983, 7982, 7983, 7985, 7988, 7987, 7988, 7991, 7994, 7994, 7995, 7998, 8002, 8003, 8004, 8007, 8011, 8010, 8011, 8013, 8015, 8015, 8016, 8018, 8021, 8021, 8021, 8024, 8027, 8027, 8029, 8031, 8035, 8034, 8035, 8036, 8039, 8038, 8039, 8041, 8044, 8044, 8045, 8047, 8051, 8051, 8053, 8055, 8058, 8058, 8059, 8060, 8063, 8062, 8063, 8065, 8068, 8068, 8069, 8071, 8075, 8075, 8077, 8079, 8082, 8082, 8083, 8084, 8087, 8086, 8087, 8089, 8092, 8092, 8093, 8095, 8099, 8099, 8101, 8103, 8106, 8106, 8107, 8108, 8111, 8110, 8111, 8113, 8116, 8116, 8117, 8119, 8123, 8123, 8125, 8127, 8130, 8130, 8131, 8132, 8135, 8134, 8135, 8137, 8140, 8140, 8141, 8143, 8147, 8147, 8149, 8151, 8154, 8154, 8154, 8156, 8158, 8158, 8158, 8160, 8164, 8163, 8164, 8167, 8170, 8171, 8172, 8175, 8178, 8178, 8179, 8181, 8184, 8184, 8185, 8187, 8191, 8191, 8192, 8195, 8198, 8199, 8200, 8203, 8206, 8206, 8206, 8208, 8210, 8209, 8210, 8211, 8214, 8214, 8214, 8216, 8220, 8220, 8221, 8223, 8226, 8226, 8227, 8228, 8231, 8231, 8232, 8234, 8238, 8238, 8239, 8242, 8246, 8246, 8248, 8251, 8254, 8254, 8255, 8257, 8259, 8259, 8259, 8261, 8265, 8264, 8265, 8268, 8271, 8271, 8273, 8275, 8278, 8278, 8279, 8280, 8283, 8282, 8283, 8285, 8288, 8288, 8289, 8292, 8295, 8295, 8297, 8299, 8302, 8302, 8302, 8304, 8306, 8305, 8305, 8307, 8310, 8310, 8310, 8312, 8316, 8316, 8317, 8319, 8322, 8322, 8322, 8324, 8326, 8326, 8326, 8328, 8332, 8331, 8332, 8335, 8338, 8339, 8340, 8343, 8346, 8346, 8347, 8348, 8351, 8350, 8351, 8353, 8356, 8356, 8357, 8359, 8363, 8363, 8365, 8367, 8370, 8370, 8370, 8372, 8375, 8374, 8375, 8377, 8380, 8380, 8381, 8383, 8387, 8387, 8388, 8391, 8394, 8394, 8394, 8396, 8399, 8398, 8399, 8401, 8404, 8404, 8405, 8407, 8411, 8411, 8412, 8415, 8418, 8418, 8419, 8420, 8423, 8422, 8423, 8425, 8428, 8428, 8429, 8432, 8435, 8435, 8437, 8439, 8442, 8442, 8442, 8443, 8446, 8445, 8445, 8447, 8450, 8450, 8450, 8452, 8456, 8456, 8457, 8459, 8462, 8462, 8462, 8464, 8466, 8466, 8466, 8468, 8471, 8471, 8472, 8475, 8478, 8479, 8480, 8483, 8486, 8486, 8487, 8488, 8491, 8491, 8491, 8493, 8497, 8496, 8497, 8500, 8503, 8503, 8505, 8507, 8510, 8510, 8510, 8511, 8514, 8513, 8513, 8515, 8518, 8517, 8518, 8520, 8523, 8524, 8525, 8527, 8530, 8530, 8530, 8532, 8535, 8534, 8535, 8537, 8540, 8540, 8541, 8543, 8547, 8547, 8548, 8551, 8554, 8554, 8554, 8555, 8558, 8557, 8557, 8559, 8562, 8562, 8562, 8564, 8568, 8568, 8569, 8571, 8574, 8574, 8574, 8576, 8578, 8578, 8578, 8580, 8583, 8583, 8584, 8587, 8590, 8591, 8592, 8595, 8598, 8598, 8599, 8600, 8603, 8602, 8603, 8605, 8608, 8608, 8609, 8611, 8615, 8615, 8617, 8619, 8622, 8622, 8622, 8624, 8626, 8625, 8626, 8627, 8630, 8630, 8630, 8633, 8636, 8636, 8637, 8639, 8642, 8642, 8642, 8643, 8645, 8644, 8645, 8646, 8649, 8649, 8650, 8652, 8655, 8655, 8657, 8659, 8662, 8662, 8662, 8664, 8667, 8666, 8667, 8669, 8672, 8672, 8673, 8675, 8679, 8679, 8680, 8683, 8686, 8686, 8686, 8688, 8690, 8689, 8690, 8691, 8694, 8694, 8695, 8697, 8700, 8700, 8701, 8703, 8706, 8706, 8706, 8707, 8709, 8708, 8709, 8710, 8713, 8713, 8713, 8716, 8719, 8719, 8720, 8723, 8726, 8726, 8726, 8728, 8731, 8730, 8730, 8733, 8736, 8736, 8737, 8739, 8743, 8743, 8744, 8747, 8750, 8750, 8750, 8751, 8754, 8753, 8753, 8755, 8758, 8758, 8758, 8761, 8764, 8764, 8765, 8767, 8770, 8770, 8770, 8771, 8774, 8773, 8773, 8775, 8778, 8777, 8778, 8780, 8784, 8784, 8785, 8787, 8790, 8790, 8790, 8791, 8793, 8792, 8793, 8794, 8797, 8797, 8798, 8800, 8803, 8803, 8805, 8807, 8810, 8810, 8810, 8812, 8814, 8814, 8814, 8816, 8820, 8819, 8820, 8823, 8827, 8827, 8828, 8831, 8834, 8834, 8834, 8836, 8838, 8837, 8838, 8840, 8843, 8842, 8843, 8845, 8848, 8848, 8849, 8851, 8854, 8853, 8853, 8854, 8857, 8855, 8855, 8857, 8860, 8859, 8859, 8861, 8864, 8864, 8865, 8867, 8870, 8869, 8869, 8871, 8873, 8872, 8872, 8874, 8877, 8876, 8877, 8879, 8883, 8883, 8884, 8887, 8890, 8890, 8890, 8892, 8895, 8894, 8894, 8897, 8900, 8900, 8901, 8903, 8907, 8907, 8908, 8911, 8914, 8914, 8914, 8915, 8918, 8917, 8917, 8919, 8922, 8922, 8922, 8924, 8928, 8928, 8929, 8931, 8934, 8934, 8934, 8935, 8938, 8937, 8937, 8939, 8942, 8942, 8942, 8944, 8948, 8948, 8949, 8951, 8954, 8953, 8953, 8954, 8957, 8955, 8955, 8957, 8960, 8959, 8959, 8961, 8964, 8964, 8965, 8967, 8970, 8969, 8969, 8971, 8973, 8972, 8973, 8974, 8978, 8977, 8978, 8980, 8983, 8983, 8985, 8987, 8990, 8990, 8990, 8991, 8993, 8992, 8992, 8994, 8997, 8997, 8997, 9000, 9003, 9003, 9004, 9007, 9010, 9010, 9010, 9012, 9015, 9014, 9015, 9017, 9020, 9020, 9021, 9023, 9027, 9027, 9028, 9031, 9034, 9033, 9033, 9035, 9037, 9036, 9036, 9037, 9040, 9039, 9039, 9041, 9045, 9044, 9045, 9047, 9050, 9049, 9049, 9051, 9053, 9052, 9053, 9054, 9058, 9057, 9058, 9060, 9064, 9064, 9065, 9067, 9070, 9069, 9069, 9070, 9073, 9071, 9071, 9073, 9076, 9075, 9075, 9077, 9080, 9080, 9081, 9083, 9086, 9085, 9085, 9087, 9089, 9088, 9088, 9090, 9093, 9093, 9093, 9096, 9099, 9099, 9100, 9103, 9106, 9106, 9106, 9107, 9110, 9109, 9109, 9111, 9114, 9113, 9114, 9116, 9120, 9120, 9121, 9123, 9126, 9125, 9126, 9127, 9129, 9128, 9129, 9131, 9134, 9133, 9134, 9136, 9139, 9139, 9141, 9143, 9146, 9145, 9146, 9147, 9149, 9148, 9149, 9150, 9154, 9153, 9154, 9156, 9159, 9159, 9160, 9163, 9166, 9166, 9166, 9167, 9170, 9169, 9169, 9171, 9174, 9174, 9174, 9176, 9180, 9180, 9181, 9183, 9186, 9185, 9185, 9186, 9188, 9187, 9187, 9189, 9192, 9191, 9191, 9193, 9196, 9196, 9197, 9199, 9202, 9201, 9201, 9203, 9205, 9204, 9205, 9207, 9210, 9209, 9210, 9212, 9216, 9216, 9217, 9219, 9222, 9221, 9221, 9222, 9225, 9223, 9223, 9225, 9228, 9227, 9227, 9229, 9232, 9232, 9233, 9235, 9238, 9237, 9237, 9238, 9241, 9240, 9240, 9242, 9245, 9244, 9245, 9247, 9251, 9251, 9252, 9255, 9258, 9258, 9258, 9259, 9262, 9261, 9261, 9263, 9266, 9266, 9266, 9268, 9272, 9272, 9273, 9275, 9278, 9277, 9277, 9278, 9280, 9279, 9279, 9281, 9284, 9283, 9283, 9285, 9288, 9288, 9289, 9291, 9294, 9293, 9293, 9294, 9297, 9296, 9296, 9298, 9301, 9300, 9301, 9303, 9307, 9307, 9308, 9311, 9314, 9314, 9314, 9315, 9318, 9317, 9317, 9319, 9322, 9322, 9322, 9324, 9328, 9328, 9329, 9331, 9334, 9333, 9333, 9334, 9336, 9335, 9335, 9337, 9339, 9339, 9339, 9341, 9344, 9344, 9345, 9347, 9350, 9349, 9349, 9351, 9353, 9352, 9353, 9354, 9358, 9357, 9358, 9360, 9363, 9363, 9365, 9367, 9370, 9369, 9369, 9370, 9372, 9371, 9371, 9373, 9376, 9375, 9375, 9377, 9380, 9380, 9381, 9383, 9386, 9385, 9385, 9387, 9389, 9388, 9388, 9390, 9393, 9393, 9393, 9396, 9399, 9399, 9400, 9403, 9406, 9405, 9405, 9406, 9409, 9408, 9408, 9409, 9412, 9411, 9412, 9413, 9417, 9416, 9417, 9419, 9422, 9421, 9421, 9422, 9424, 9423, 9422, 9424, 9427, 9426, 9426, 9428, 9432, 9432, 9433, 9435, 9438, 9437, 9437, 9439, 9441, 9440, 9441, 9443, 9446, 9445, 9446, 9448, 9452, 9451, 9453, 9455, 9458, 9457, 9457, 9458, 9460, 9459, 9459, 9461, 9464, 9463, 9463, 9465, 9468, 9468, 9469, 9471, 9474, 9473, 9473, 9475, 9477, 9476, 9476, 9478, 9482, 9481, 9482, 9484, 9487, 9487, 9488, 9491, 9494, 9493, 9493, 9494, 9496, 9495, 9495, 9497, 9500, 9499, 9499, 9501, 9504, 9504, 9505, 9507, 9510, 9509, 9509, 9511, 9513, 9512, 9512, 9514, 9518, 9517, 9518, 9520, 9523, 9523, 9524, 9527, 9530, 9529, 9529, 9530, 9532, 9531, 9531, 9533, 9536, 9535, 9535, 9537, 9540, 9540, 9541, 9543, 9546, 9545, 9545, 9547, 9549, 9548, 9548, 9550, 9553, 9553, 9553, 9556, 9559, 9559, 9560, 9563, 9566, 9565, 9565, 9566, 9569, 9567, 9567, 9569, 9572, 9571, 9571, 9573, 9577, 9576, 9577, 9579, 9582, 9581, 9581, 9582, 9584, 9582, 9582, 9584, 9587, 9586, 9586, 9588, 9592, 9592, 9593, 9595, 9598, 9597, 9597, 9599, 9601, 9600, 9600, 9602, 9605, 9605, 9605, 9608, 9611, 9611, 9612, 9615, 9618, 9617, 9617, 9618, 9621, 9619, 9619, 9621, 9624, 9623, 9623, 9625, 9629, 9628, 9629, 9631, 9634, 9633, 9633, 9634, 9636, 9634, 9634, 9636, 9639, 9638, 9638, 9640, 9644, 9644, 9644, 9647, 9650, 9649, 9649, 9651, 9653, 9652, 9652, 9654, 9657, 9657, 9657, 9660, 9663, 9663, 9664, 9667, 9670, 9669, 9669, 9670, 9673, 9671, 9671, 9673, 9676, 9675, 9675, 9677, 9681, 9680, 9681, 9683, 9686, 9685, 9685, 9686, 9688, 9687, 9687, 9688, 9691, 9690, 9691, 9693, 9696, 9696, 9697, 9699, 9702, 9701, 9701, 9702, 9704, 9703, 9703, 9704, 9707, 9706, 9707, 9709, 9712, 9712, 9713, 9715, 9718, 9717, 9717, 9718, 9720, 9719, 9719, 9721, 9724, 9723, 9723, 9725, 9728, 9728, 9729, 9731, 9734, 9733, 9733, 9734, 9736, 9734, 9734, 9736, 9739, 9738, 9738, 9740, 9744, 9744, 9744, 9747, 9750, 9749, 9749, 9751, 9753, 9752, 9752, 9754, 9757, 9757, 9757, 9760, 9763, 9763, 9764, 9767, 9770, 9769, 9769, 9770, 9773, 9771, 9771, 9773, 9776, 9775, 9775, 9777, 9780, 9780, 9781, 9783, 9786, 9785, 9785, 9786, 9788, 9787, 9787, 9788, 9791, 9790, 9791, 9793, 9796, 9796, 9797, 9799, 9802, 9801, 9801, 9802, 9804, 9803, 9803, 9804, 9807, 9806, 9807, 9809, 9812, 9812, 9813, 9815, 9818, 9817, 9817, 9818, 9820, 9819, 9819, 9820, 9823, 9822, 9823, 9825, 9828, 9828, 9829, 9831, 9834, 9833, 9833, 9834, 9836, 9835, 9835, 9836, 9839, 9838, 9839, 9841, 9844, 9844, 9845, 9847, 9850, 9849, 9849, 9850, 9852, 9851, 9851, 9852, 9855, 9854, 9855, 9857, 9860, 9860, 9861, 9863, 9866, 9865, 9865, 9866, 9868, 9867, 9867, 9869, 9872, 9871, 9871, 9873, 9877, 9876, 9877, 9879, 9882, 9881, 9880, 9881, 9883, 9882, 9881, 9883, 9885, 9884, 9884, 9886, 9889, 9888, 9889, 9891, 9894, 9893, 9892, 9893, 9896, 9894, 9894, 9896, 9899, 9898, 9898, 9900, 9904, 9904, 9905, 9907, 9910, 9909, 9909, 9910, 9912, 9911, 9911, 9912, 9915, 9914, 9915, 9917, 9920, 9920, 9921, 9923, 9926, 9925, 9925, 9926, 9928, 9927, 9927, 9928, 9931, 9930, 9931, 9933, 9936, 9936, 9937, 9939, 9942, 9941, 9941, 9942, 9944, 9943, 9943, 9944, 9947, 9946, 9947, 9949, 9952, 9952, 9953, 9955, 9958, 9957, 9957, 9958, 9960, 9959, 9959, 9960, 9963, 9962, 9963, 9965, 9968, 9968, 9969, 9971, 9974, 9973, 9973, 9974, 9976, 9975, 9975, 9976, 9979, 9978, 9979, 9981, 9984, 9984, 9985, 9987, 9990, 9989, 9989, 9990, 9992, 9991, 9990, 9992, 9995, 9994, 9994, 9997, 10000, 10000, 10001, 10003, 10006, 10005, 10005, 10006, 10008, 10007, 10007, 10009, 10012, 10011, 10011, 10013, 10017, 10016, 10017, 10019, 10022, 10021, 10020, 10021, 10023, 10021, 10021, 10022, 10025, 10024, 10024, 10026, 10029, 10028, 10029, 10031, 10034, 10033, 10032, 10034, 10036, 10035, 10034, 10036, 10039, 10038, 10039, 10041, 10044, 10044, 10045, 10047, 10050, 10049, 10048, 10049, 10051, 10050, 10049, 10051, 10053, 10052, 10052, 10054, 10057, 10056, 10057, 10059, 10062, 10061, 10060, 10061, 10064, 10062, 10062, 10064, 10067, 10066, 10066, 10068, 10072, 10071, 10072, 10075, 10078, 10077, 10077, 10078, 10080, 10079, 10079, 10080, 10083, 10082, 10083, 10085, 10088, 10088, 10089, 10091, 10094, 10093, 10092, 10094, 10096, 10094, 10094, 10096, 10099, 10098, 10098, 10100, 10104, 10104, 10104, 10107, 10110, 10109, 10109, 10110, 10112, 10111, 10111, 10113, 10116, 10115, 10115, 10117, 10120, 10120, 10121, 10123, 10126, 10125, 10124, 10125, 10127, 10125, 10125, 10126, 10129, 10128, 10128, 10130, 10133, 10132, 10133, 10135, 10138, 10137, 10136, 10138, 10140, 10138, 10138, 10140, 10143, 10142, 10143, 10145, 10148, 10148, 10149, 10151, 10154, 10153, 10152, 10153, 10155, 10153, 10153, 10154, 10157, 10156, 10156, 10158, 10161, 10160, 10161, 10163, 10166, 10165, 10164, 10165, 10168, 10166, 10166, 10168, 10171, 10170, 10170, 10173, 10176, 10176, 10177, 10179, 10182, 10181, 10180, 10181, 10183, 10182, 10181, 10183, 10185, 10184, 10184, 10186, 10189, 10188, 10189, 10191, 10194, 10193, 10192, 10193, 10196, 10194, 10194, 10196, 10199, 10198, 10198, 10200, 10204, 10203, 10204, 10207, 10210, 10209, 10209, 10210, 10212, 10211, 10211, 10213, 10216, 10215, 10215, 10217, 10221, 10220, 10221, 10223, 10226, 10225, 10224, 10225, 10227, 10225, 10225, 10226, 10229, 10228, 10228, 10230, 10233, 10232, 10233, 10235, 10238, 10237, 10236, 10237, 10240, 10238, 10238, 10240, 10243, 10242, 10242, 10245, 10248, 10248, 10249, 10251, 10254, 10253, 10252, 10253, 10255, 10253, 10253, 10255, 10257, 10256, 10256, 10258, 10261, 10260, 10261, 10263, 10266, 10265, 10264, 10265, 10268, 10266, 10266, 10267, 10271, 10270, 10270, 10272, 10276, 10275, 10276, 10279, 10282, 10281, 10281, 10282, 10284, 10283, 10283, 10285, 10288, 10287, 10287, 10289, 10292, 10292, 10293, 10295, 10298, 10297, 10296, 10297, 10299, 10297, 10297, 10298, 10301, 10300, 10300, 10302, 10305, 10304, 10305, 10307, 10310, 10309, 10308, 10309, 10312, 10310, 10310, 10312, 10315, 10314, 10314, 10316, 10320, 10320, 10320, 10323, 10326, 10325, 10324, 10325, 10327, 10326, 10325, 10327, 10330, 10328, 10328, 10330, 10333, 10333, 10333, 10335, 10338, 10336, 10336, 10337, 10339, 10337, 10336, 10338, 10341, 10339, 10339, 10341, 10345, 10344, 10345, 10347, 10350, 10349, 10348, 10349, 10352, 10350, 10350, 10352, 10355, 10354, 10354, 10356, 10360, 10359, 10360, 10363, 10366, 10365, 10365, 10366, 10368, 10367, 10367, 10368, 10372, 10370, 10371, 10373, 10376, 10376, 10377, 10379, 10382, 10381, 10380, 10381, 10383, 10382, 10381, 10383, 10386, 10384, 10384, 10386, 10389, 10389, 10389, 10391, 10394, 10392, 10392, 10393, 10395, 10393, 10392, 10394, 10397, 10395, 10395, 10397, 10400, 10400, 10401, 10403, 10406, 10405, 10404, 10405, 10408, 10406, 10406, 10408, 10411, 10410, 10410, 10413, 10416, 10416, 10417, 10419, 10422, 10421, 10420, 10421, 10423, 10421, 10421, 10422, 10425, 10424, 10424, 10426, 10429, 10428, 10429, 10431, 10434, 10433, 10432, 10433, 10435, 10434, 10434, 10435, 10439, 10437, 10438, 10440, 10444, 10443, 10444, 10447, 10450, 10449, 10449, 10450, 10452, 10451, 10451, 10452, 10456, 10454, 10455, 10457, 10460, 10460, 10461, 10463, 10466, 10465, 10464, 10465, 10467, 10465, 10465, 10467, 10469, 10468, 10468, 10470, 10473, 10472, 10473, 10475, 10478, 10476, 10476, 10477, 10479, 10477, 10477, 10478, 10481, 10480, 10480, 10482, 10485, 10484, 10485, 10487, 10490, 10488, 10488, 10489, 10491, 10489, 10488, 10490, 10493, 10491, 10491, 10493, 10497, 10496, 10497, 10499, 10502, 10501, 10500, 10501, 10504, 10502, 10502, 10503, 10507, 10506, 10506, 10508, 10512, 10511, 10512, 10515, 10518, 10517, 10516, 10518, 10520, 10519, 10519, 10520, 10523, 10522, 10523, 10525, 10528, 10528, 10529, 10531, 10534, 10533, 10532, 10533, 10535, 10533, 10533, 10534, 10537, 10536, 10536, 10538, 10541, 10540, 10541, 10543, 10546, 10544, 10544, 10545, 10547, 10545, 10545, 10546, 10549, 10548, 10548, 10550, 10553, 10552, 10553, 10555, 10558, 10556, 10556, 10557, 10559, 10557, 10556, 10558, 10561, 10559, 10559, 10561, 10565, 10564, 10565, 10567, 10570, 10569, 10568, 10569, 10572, 10570, 10570, 10572, 10575, 10574, 10574, 10576, 10580, 10580, 10580, 10583, 10586, 10584, 10584, 10585, 10587, 10585, 10585, 10586, 10589, 10588, 10588, 10589, 10593, 10592, 10593, 10595, 10598, 10597, 10596, 10597, 10600, 10598, 10598, 10600, 10603, 10602, 10602, 10604, 10608, 10607, 10608, 10611, 10614, 10613, 10612, 10613, 10615, 10613, 10613, 10615, 10617, 10616, 10616, 10618, 10621, 10620, 10621, 10623, 10626, 10624, 10624, 10625, 10627, 10625, 10625, 10626, 10629, 10628, 10628, 10630, 10633, 10632, 10633, 10635, 10638, 10636, 10636, 10636, 10639, 10637, 10636, 10638, 10641, 10639, 10639, 10641, 10644, 10644, 10644, 10647, 10650, 10649, 10648, 10649, 10652, 10650, 10650, 10652, 10655, 10654, 10654, 10656, 10660, 10660, 10660, 10663, 10666, 10665, 10664, 10665, 10667, 10665, 10665, 10666, 10669, 10668, 10668, 10670, 10673, 10672, 10673, 10675, 10678, 10676, 10676, 10677, 10679, 10677, 10677, 10678, 10681, 10680, 10680, 10681, 10685, 10684, 10685, 10687, 10690, 10688, 10688, 10688, 10691, 10689, 10688, 10690, 10693, 10691, 10691, 10693, 10696, 10696, 10696, 10699, 10702, 10701, 10700, 10701, 10704, 10702, 10702, 10704, 10707, 10706, 10706, 10708, 10712, 10711, 10712, 10715, 10718, 10716, 10716, 10717, 10719, 10717, 10717, 10718, 10721, 10720, 10720, 10722, 10725, 10724, 10725, 10727, 10730, 10728, 10728, 10729, 10731, 10729, 10728, 10730, 10733, 10731, 10731, 10733, 10737, 10736, 10737, 10739, 10742, 10740, 10740, 10741, 10743, 10741, 10741, 10742, 10745, 10744, 10744, 10746, 10749, 10748, 10749, 10751, 10754, 10752, 10752, 10752, 10755, 10753, 10752, 10754, 10757, 10755, 10755, 10757, 10760, 10760, 10760, 10763, 10766, 10765, 10764, 10765, 10768, 10766, 10766, 10768, 10771, 10770, 10770, 10772, 10776, 10775, 10776, 10779, 10782, 10780, 10780, 10781, 10783, 10781, 10781, 10782, 10785, 10784, 10784, 10786, 10789, 10788, 10789, 10791, 10794, 10792, 10792, 10792, 10795, 10793, 10792, 10794, 10797, 10795, 10795, 10797, 10801, 10800, 10801, 10803, 10806, 10804, 10804, 10805, 10807, 10805, 10805, 10806, 10809, 10808, 10808, 10810, 10813, 10812, 10813, 10815, 10818, 10816, 10816, 10816, 10819, 10817, 10816, 10818, 10821, 10819, 10819, 10821, 10824, 10824, 10824, 10827, 10830, 10828, 10828, 10829, 10832, 10830, 10830, 10832, 10835, 10834, 10834, 10836, 10840, 10839, 10840, 10843, 10846, 10845, 10844, 10845, 10848, 10846, 10845, 10847, 10850, 10848, 10848, 10850, 10854, 10853, 10853, 10855, 10858, 10856, 10855, 10856, 10858, 10855, 10855, 10856, 10858, 10857, 10856, 10858, 10861, 10860, 10861, 10863, 10866, 10864, 10864, 10865, 10867, 10866, 10865, 10867, 10870, 10869, 10870, 10872, 10876, 10875, 10876, 10879, 10882, 10880, 10880, 10881, 10883, 10881, 10881, 10883, 10885, 10884, 10884, 10886, 10889, 10888, 10889, 10891, 10894, 10892, 10892, 10892, 10895, 10893, 10892, 10894, 10897, 10895, 10895, 10897, 10901, 10900, 10901, 10903, 10906, 10904, 10904, 10905, 10907, 10905, 10904, 10906, 10909, 10907, 10907, 10909, 10913, 10912, 10913, 10915, 10918, 10916, 10916, 10917, 10919, 10917, 10916, 10918, 10921, 10919, 10919, 10921, 10925, 10924, 10925, 10927, 10930, 10928, 10928, 10929, 10931, 10929, 10928, 10930, 10933, 10931, 10931, 10933, 10937, 10936, 10937, 10939, 10942, 10940, 10940, 10940, 10943, 10941, 10940, 10942, 10945, 10943, 10943, 10945, 10949, 10948, 10949, 10951, 10954, 10952, 10952, 10952, 10955, 10953, 10952, 10954, 10957, 10955, 10955, 10957, 10961, 10960, 10961, 10963, 10966, 10964, 10964, 10964, 10967, 10965, 10964, 10966, 10969, 10967, 10967, 10969, 10973, 10972, 10973, 10975, 10978, 10976, 10976, 10976, 10979, 10977, 10976, 10978, 10981, 10979, 10979, 10981, 10985, 10984, 10985, 10987, 10990, 10988, 10988, 10988, 10991, 10989, 10988, 10990, 10993, 10991, 10991, 10993, 10997, 10996, 10997, 10999, 11002, 11000, 11000, 11000, 11003, 11001, 11000, 11002, 11005, 11003, 11003, 11005, 11009, 11008, 11009, 11011, 11014, 11012, 11012, 11012, 11015, 11013, 11012, 11014, 11017, 11015, 11015, 11017, 11021, 11020, 11021, 11023, 11026, 11024, 11024, 11024, 11027, 11025, 11024, 11026, 11029, 11027, 11027, 11029, 11033, 11032, 11033, 11035, 11038, 11036, 11036, 11036, 11039, 11037, 11036, 11038, 11041, 11039, 11039, 11041, 11045, 11044, 11045, 11047, 11050, 11048, 11048, 11048, 11051, 11049, 11048, 11050, 11053, 11051, 11051, 11053, 11057, 11056, 11057, 11059, 11062, 11060, 11060, 11060, 11063, 11061, 11060, 11062, 11065, 11063, 11063, 11065, 11069, 11068, 11069, 11071, 11074, 11072, 11072, 11072, 11075, 11073, 11072, 11074, 11077, 11075, 11075, 11077, 11081, 11080, 11080, 11083, 11086, 11084, 11084, 11084, 11087, 11085, 11084, 11086, 11089, 11087, 11087, 11089, 11093, 11092, 11093, 11095, 11098, 11096, 11095, 11096, 11099, 11097, 11096, 11098, 11101, 11099, 11099, 11101, 11105, 11104, 11104, 11107, 11110, 11108, 11108, 11109, 11111, 11109, 11109, 11110, 11113, 11112, 11112, 11114, 11117, 11116, 11117, 11119, 11122, 11120, 11119, 11120, 11122, 11120, 11119, 11120, 11123, 11121, 11121, 11123, 11126, 11125, 11125, 11127, 11130, 11128, 11127, 11128, 11130, 11128, 11127, 11129, 11132, 11130, 11130, 11132, 11136, 11135, 11136, 11138, 11142, 11140, 11140, 11141, 11144, 11142, 11142, 11144, 11147, 11146, 11146, 11149, 11152, 11152, 11152, 11155, 11158, 11156, 11155, 11156, 11158, 11156, 11155, 11156, 11159, 11157, 11157, 11159, 11162, 11161, 11161, 11163, 11166, 11164, 11163, 11164, 11166, 11164, 11164, 11165, 11168, 11167, 11167, 11169, 11172, 11172, 11172, 11175, 11178, 11176, 11176, 11176, 11179, 11177, 11176, 11178, 11181, 11179, 11179, 11181, 11185, 11184, 11184, 11187, 11190, 11188, 11187, 11188, 11191, 11189, 11188, 11190, 11193, 11191, 11191, 11193, 11197, 11196, 11196, 11199, 11202, 11200, 11199, 11200, 11203, 11201, 11200, 11202, 11205, 11203, 11203, 11205, 11209, 11208, 11208, 11211, 11214, 11212, 11211, 11212, 11215, 11213, 11212, 11214, 11217, 11215, 11215, 11217, 11221, 11220, 11220, 11223, 11226, 11224, 11223, 11224, 11227, 11225, 11224, 11226, 11229, 11227, 11227, 11229, 11233, 11232, 11232, 11235, 11238, 11236, 11236, 11237, 11239, 11237, 11237, 11238, 11241, 11240, 11240, 11242, 11245, 11244, 11245, 11247, 11250, 11248, 11247, 11248, 11250, 11248, 11247, 11248, 11251, 11249, 11249, 11250, 11254, 11253, 11253, 11255, 11258, 11256, 11255, 11256, 11258, 11256, 11255, 11257, 11260, 11258, 11258, 11260, 11264, 11263, 11264, 11266, 11270, 11268, 11268, 11269, 11272, 11270, 11270, 11272, 11275, 11274, 11274, 11276, 11280, 11280, 11280, 11283, 11286, 11284, 11283, 11284, 11286, 11284, 11283, 11284, 11287, 11285, 11285, 11287, 11290, 11289, 11289, 11291, 11294, 11292, 11291, 11292, 11294, 11292, 11292, 11293, 11296, 11295, 11295, 11297, 11300, 11300, 11300, 11303, 11306, 11304, 11303, 11304, 11307, 11305, 11304, 11306, 11309, 11307, 11307, 11309, 11313, 11312, 11312, 11315, 11318, 11316, 11315, 11316, 11318, 11316, 11316, 11317, 11321, 11319, 11319, 11321, 11324, 11324, 11324, 11327, 11330, 11328, 11328, 11329, 11331, 11329, 11329, 11330, 11333, 11332, 11332, 11334, 11337, 11336, 11337, 11339, 11342, 11340, 11339, 11339, 11341, 11339, 11338, 11339, 11342, 11340, 11340, 11342, 11345, 11344, 11344, 11347, 11350, 11348, 11348, 11349, 11351, 11350, 11349, 11351, 11355, 11353, 11354, 11356, 11360, 11359, 11360, 11362, 11366, 11364, 11363, 11364, 11366, 11364, 11363, 11364, 11367, 11365, 11365, 11367, 11370, 11369, 11369, 11371, 11374, 11372, 11371, 11372, 11374, 11372, 11371, 11373, 11376, 11375, 11375, 11377, 11380, 11379, 11380, 11382, 11386, 11384, 11383, 11384, 11387, 11385, 11384, 11386, 11389, 11387, 11387, 11389, 11393, 11392, 11392, 11395, 11398, 11396, 11395, 11396, 11398, 11396, 11396, 11397, 11400, 11399, 11399, 11401, 11404, 11404, 11404, 11407, 11410, 11408, 11407, 11408, 11411, 11409, 11408, 11410, 11413, 11412, 11411, 11413, 11417, 11416, 11417, 11419, 11422, 11420, 11419, 11420, 11422, 11419, 11419, 11420, 11423, 11421, 11420, 11422, 11425, 11424, 11425, 11427, 11430, 11428, 11427, 11428, 11430, 11428, 11428, 11429, 11432, 11431, 11431, 11433, 11436, 11436, 11436, 11438, 11442, 11440, 11439, 11440, 11443, 11441, 11440, 11442, 11445, 11443, 11443, 11445, 11449, 11448, 11448, 11451, 11454, 11452, 11451, 11452, 11455, 11453, 11452, 11454, 11457, 11455, 11455, 11457, 11461, 11460, 11461, 11463, 11466, 11464, 11463, 11464, 11466, 11463, 11463, 11464, 11467, 11465, 11464, 11466, 11469, 11468, 11469, 11471, 11474, 11472, 11471, 11472, 11474, 11472, 11472, 11473, 11476, 11475, 11475, 11477, 11480, 11480, 11480, 11482, 11486, 11484, 11483, 11484, 11487, 11484, 11484, 11485, 11489, 11487, 11487, 11489, 11492, 11492, 11492, 11494, 11498, 11496, 11495, 11496, 11499, 11497, 11496, 11498, 11501, 11500, 11500, 11501, 11505, 11504, 11505, 11507, 11510, 11508, 11507, 11507, 11509, 11507, 11506, 11507, 11510, 11508, 11508, 11510, 11513, 11512, 11512, 11515, 11518, 11516, 11516, 11517, 11519, 11518, 11517, 11519, 11523, 11521, 11522, 11524, 11528, 11527, 11528, 11530, 11534, 11532, 11531, 11532, 11534, 11532, 11531, 11532, 11535, 11533, 11533, 11535, 11538, 11537, 11537, 11539, 11542, 11540, 11539, 11540, 11542, 11540, 11539, 11541, 11544, 11542, 11542, 11544, 11548, 11547, 11548, 11550, 11554, 11552, 11551, 11552, 11555, 11552, 11552, 11554, 11557, 11555, 11555, 11557, 11561, 11560, 11560, 11562, 11566, 11564, 11563, 11564, 11567, 11565, 11564, 11566, 11569, 11567, 11567, 11569, 11573, 11572, 11572, 11575, 11578, 11576, 11575, 11576, 11578, 11575, 11574, 11576, 11579, 11577, 11576, 11578, 11581, 11580, 11581, 11583, 11586, 11584, 11583, 11584, 11586, 11584, 11583, 11585, 11588, 11587, 11587, 11589, 11592, 11591, 11592, 11594, 11598, 11596, 11595, 11596, 11599, 11596, 11596, 11597, 11601, 11599, 11599, 11601, 11604, 11604, 11604, 11606, 11610, 11608, 11607, 11608, 11611, 11609, 11608, 11610, 11613, 11611, 11611, 11613, 11617, 11616, 11616, 11619, 11622, 11620, 11619, 11620, 11622, 11619, 11618, 11620, 11623, 11621, 11620, 11622, 11625, 11624, 11625, 11627, 11630, 11628, 11627, 11628, 11630, 11628, 11627, 11629, 11632, 11630, 11630, 11632, 11636, 11635, 11636, 11638, 11642, 11640, 11639, 11640, 11643, 11641, 11640, 11642, 11645, 11643, 11643, 11645, 11649, 11648, 11648, 11651, 11654, 11652, 11651, 11651, 11654, 11651, 11650, 11652, 11655, 11653, 11652, 11654, 11657, 11656, 11657, 11659, 11662, 11660, 11659, 11660, 11662, 11660, 11659, 11661, 11664, 11663, 11662, 11665, 11668, 11667, 11668, 11670, 11674, 11672, 11671, 11672, 11674, 11672, 11672, 11673, 11677, 11675, 11675, 11677, 11680, 11680, 11680, 11682, 11686, 11684, 11683, 11684, 11687, 11685, 11684, 11686, 11689, 11687, 11687, 11689, 11693, 11692, 11692, 11695, 11698, 11696, 11695, 11696, 11698, 11696, 11695, 11696, 11699, 11697, 11697, 11699, 11702, 11701, 11701, 11703, 11706, 11704, 11702, 11703, 11705, 11702, 11701, 11703, 11706, 11704, 11703, 11705, 11709, 11708, 11708, 11710, 11714, 11712, 11711, 11713, 11715, 11713, 11713, 11715, 11718, 11717, 11717, 11720, 11724, 11723, 11724, 11726, 11730, 11728, 11727, 11728, 11730, 11728, 11727, 11729, 11731, 11730, 11729, 11731, 11734, 11733, 11733, 11735, 11738, 11736, 11734, 11735, 11737, 11735, 11734, 11735, 11738, 11736, 11736, 11738, 11741, 11740, 11740, 11743, 11746, 11744, 11743, 11744, 11746, 11744, 11744, 11745, 11748, 11747, 11747, 11749, 11752, 11751, 11752, 11754, 11758, 11756, 11755, 11756, 11758, 11756, 11756, 11757, 11760, 11759, 11759, 11761, 11764, 11764, 11764, 11766, 11770, 11768, 11767, 11768, 11771, 11769, 11768, 11770, 11773, 11771, 11771, 11773, 11777, 11776, 11776, 11779, 11782, 11780, 11779, 11779, 11782, 11779, 11778, 11780, 11782, 11781, 11780, 11782, 11785, 11784, 11785, 11787, 11790, 11788, 11787, 11788, 11790, 11788, 11787, 11789, 11792, 11790, 11790, 11792, 11796, 11795, 11796, 11798, 11802, 11800, 11799, 11800, 11803, 11801, 11800, 11802, 11805, 11803, 11803, 11805, 11809, 11808, 11808, 11811, 11814, 11812, 11811, 11811, 11813, 11811, 11810, 11811, 11814, 11812, 11812, 11814, 11817, 11816, 11816, 11819, 11822, 11820, 11819, 11820, 11822, 11820, 11820, 11821, 11824, 11823, 11823, 11825, 11829, 11828, 11828, 11830, 11834, 11832, 11831, 11831, 11834, 11831, 11830, 11832, 11834, 11833, 11832, 11834, 11837, 11836, 11836, 11839, 11842, 11840, 11839, 11840, 11842, 11840, 11840, 11841, 11844, 11843, 11843, 11845, 11848, 11848, 11848, 11850, 11854, 11852, 11851, 11851, 11854, 11851, 11850, 11852, 11855, 11853, 11852, 11854, 11857, 11856, 11857, 11859, 11862, 11860, 11859, 11860, 11862, 11860, 11859, 11861, 11864, 11862, 11862, 11864, 11868, 11867, 11868, 11870, 11874, 11872, 11871, 11872, 11875, 11873, 11872, 11874, 11877, 11875, 11875, 11877, 11881, 11880, 11880, 11883, 11886, 11884, 11883, 11883, 11885, 11883, 11882, 11884, 11886, 11884, 11884, 11886, 11889, 11888, 11888, 11891, 11894, 11892, 11891, 11892, 11894, 11892, 11891, 11893, 11896, 11894, 11894, 11896, 11900, 11899, 11900, 11902, 11906, 11904, 11903, 11904, 11907, 11905, 11904, 11906, 11909, 11907, 11907, 11909, 11913, 11912, 11912, 11914, 11918, 11916, 11915, 11916, 11918, 11915, 11915, 11916, 11919, 11917, 11917, 11918, 11922, 11920, 11921, 11923, 11926, 11924, 11922, 11923, 11925, 11923, 11922, 11923, 11926, 11924, 11924, 11926, 11929, 11928, 11928, 11930, 11934, 11932, 11931, 11932, 11934, 11932, 11931, 11933, 11936, 11934, 11934, 11936, 11940, 11939, 11940, 11942, 11946, 11944, 11943, 11944, 11947, 11945, 11944, 11946, 11949, 11947, 11947, 11949, 11953, 11952, 11952, 11955, 11958, 11956, 11955, 11955, 11957, 11955, 11954, 11955, 11958, 11956, 11956, 11958, 11961, 11960, 11960, 11962, 11966, 11964, 11963, 11964, 11966, 11964, 11964, 11965, 11968, 11967, 11967, 11969, 11972, 11972, 11972, 11974, 11978, 11976, 11975, 11975, 11977, 11975, 11974, 11975, 11978, 11976, 11976, 11978, 11981, 11980, 11980, 11982, 11986, 11984, 11983, 11984, 11986, 11984, 11984, 11985, 11988, 11987, 11987, 11989, 11992, 11992, 11992, 11994, 11998, 11996, 11995, 11995, 11997, 11995, 11994, 11995, 11998, 11996, 11996, 11998, 12001, 12000, 12000, 12002, 12006, 12004, 12003, 12004, 12006, 12004, 12004, 12005, 12008, 12007, 12007, 12009, 12012, 12012, 12012, 12014, 12018, 12016, 12015, 12015, 12018, 12015, 12014, 12016, 12019, 12017, 12016, 12018, 12021, 12020, 12020, 12023, 12026, 12024, 12023, 12024, 12026, 12024, 12023, 12025, 12028, 12026, 12026, 12028, 12032, 12031, 12032, 12034, 12038, 12036, 12035, 12036, 12039, 12036, 12036, 12038, 12041, 12039, 12039, 12041, 12045, 12044, 12044, 12046, 12050, 12048, 12047, 12047, 12050, 12047, 12047, 12048, 12051, 12049, 12048, 12050, 12054, 12052, 12053, 12055, 12058, 12055, 12054, 12055, 12057, 12054, 12054, 12055, 12058, 12056, 12055, 12057, 12061, 12060, 12060, 12062, 12066, 12064, 12063, 12064, 12066, 12064, 12064, 12065, 12068, 12067, 12067, 12069, 12073, 12072, 12072, 12074, 12078, 12076, 12075, 12075, 12077, 12075, 12074, 12075, 12078, 12076, 12076, 12078, 12081, 12080, 12080, 12082, 12086, 12084, 12083, 12084, 12086, 12084, 12083, 12085, 12088, 12087, 12087, 12089, 12092, 12092, 12092, 12094, 12098, 12096, 12095, 12095, 12097, 12095, 12094, 12095, 12098, 12096, 12096, 12098, 12101, 12100, 12100, 12102, 12106, 12104, 12103, 12104, 12106, 12104, 12103, 12105, 12108, 12107, 12107, 12109, 12112, 12112, 12112, 12114, 12118, 12116, 12115, 12115, 12117, 12115, 12114, 12115, 12118, 12116, 12116, 12118, 12121, 12120, 12120, 12122, 12126, 12124, 12123, 12124, 12126, 12124, 12123, 12125, 12128, 12126, 12126, 12129, 12132, 12131, 12132, 12134, 12138, 12136, 12135, 12136, 12138, 12135, 12135, 12136, 12139, 12137, 12137, 12138, 12142, 12140, 12141, 12143, 12146, 12143, 12142, 12143, 12145, 12142, 12142, 12143, 12146, 12144, 12144, 12145, 12149, 12148, 12148, 12150, 12154, 12152, 12151, 12152, 12154, 12152, 12151, 12153, 12156, 12154, 12154, 12156, 12160, 12159, 12160, 12162, 12166, 12164, 12163, 12164, 12167, 12164, 12164, 12165, 12169, 12167, 12167, 12169, 12173, 12172, 12172, 12174, 12178, 12176, 12175, 12175, 12178, 12175, 12174, 12176, 12179, 12177, 12176, 12178, 12182, 12180, 12181, 12183, 12186, 12183, 12182, 12183, 12185, 12182, 12181, 12183, 12186, 12184, 12183, 12185, 12189, 12188, 12188, 12190, 12194, 12192, 12191, 12192, 12194, 12192, 12191, 12193, 12196, 12195, 12195, 12197, 12200, 12199, 12200, 12202, 12206, 12204, 12203, 12203, 12206, 12203, 12203, 12204, 12207, 12205, 12204, 12206, 12210, 12208, 12209, 12211, 12214, 12211, 12210, 12211, 12213, 12210, 12209, 12211, 12214, 12212, 12211, 12213, 12217, 12216, 12216, 12218, 12222, 12220, 12219, 12220, 12222, 12220, 12219, 12221, 12224, 12223, 12222, 12225, 12228, 12227, 12228, 12230, 12234, 12232, 12231, 12231, 12234, 12231, 12230, 12232, 12235, 12233, 12232, 12234, 12238, 12236, 12237, 12239, 12242, 12239, 12238, 12239, 12241, 12238, 12237, 12239, 12242, 12240, 12239, 12241, 12245, 12244, 12244, 12246, 12250, 12248, 12247, 12248, 12250, 12248, 12247, 12249, 12252, 12251, 12250, 12253, 12256, 12255, 12256, 12258, 12262, 12260, 12259, 12259, 12262, 12259, 12258, 12260, 12263, 12261, 12260, 12262, 12266, 12264, 12265, 12267, 12270, 12267, 12266, 12267, 12269, 12266, 12265, 12267, 12270, 12268, 12267, 12269, 12273, 12272, 12272, 12274, 12278, 12276, 12275, 12276, 12278, 12276, 12275, 12277, 12280, 12279, 12279, 12281, 12284, 12284, 12284, 12286, 12290, 12288, 12286, 12287, 12289, 12287, 12286, 12287, 12290, 12288, 12288, 12290, 12293, 12292, 12292, 12294, 12298, 12296, 12295, 12296, 12298, 12296, 12295, 12297, 12300, 12299, 12298, 12301, 12304, 12303, 12304, 12306, 12310, 12308, 12306, 12307, 12309, 12307, 12306, 12307, 12310, 12308, 12308, 12310, 12313, 12312, 12312, 12314, 12318, 12316, 12315, 12316, 12318, 12316, 12315, 12317, 12320, 12318, 12318, 12320, 12324, 12323, 12324, 12326, 12330, 12328, 12327, 12327, 12330, 12327, 12326, 12328, 12331, 12329, 12328, 12330, 12334, 12332, 12333, 12335, 12338, 12335, 12334, 12335, 12337, 12334, 12333, 12335, 12338, 12336, 12335, 12337, 12341, 12340, 12340, 12342, 12346, 12344, 12343, 12344, 12346, 12344, 12343, 12345, 12348, 12346, 12346, 12349, 12352, 12351, 12352, 12354, 12358, 12356, 12355, 12355, 12358, 12355, 12354, 12356, 12359, 12357, 12356, 12358, 12362, 12360, 12361, 12363, 12366, 12363, 12362, 12363, 12365, 12362, 12361, 12363, 12366, 12364, 12363, 12365, 12369, 12368, 12368, 12370, 12374, 12372, 12371, 12372, 12374, 12372, 12371, 12373, 12376, 12374, 12374, 12376, 12380, 12379, 12380, 12382, 12386, 12384, 12383, 12383, 12386, 12383, 12382, 12384, 12387, 12385, 12384, 12386, 12390, 12388, 12388, 12391, 12394, 12391, 12390, 12391, 12393, 12390, 12389, 12391, 12394, 12392, 12391, 12393, 12397, 12396, 12396, 12398, 12402, 12400, 12399, 12400, 12402, 12400, 12399, 12401, 12404, 12402, 12402, 12404, 12408, 12407, 12408, 12410, 12414, 12412, 12411, 12411, 12414, 12411, 12410, 12412, 12415, 12413, 12412, 12414, 12417, 12416, 12416, 12418, 12422, 12419, 12418, 12419, 12421, 12418, 12418, 12419, 12422, 12420, 12420, 12421, 12425, 12424, 12424, 12426, 12430, 12427, 12426, 12427, 12429, 12427, 12426, 12427, 12430, 12428, 12428, 12430, 12433, 12432, 12432, 12434, 12438, 12435, 12434, 12435, 12437, 12434, 12433, 12435, 12438, 12436, 12435, 12437, 12441, 12440, 12440, 12442, 12446, 12444, 12443, 12444, 12446, 12444, 12443, 12445, 12448, 12446, 12446, 12448, 12452, 12451, 12452, 12454, 12458, 12456, 12455, 12455, 12458, 12455, 12454, 12456, 12459, 12457, 12456, 12458, 12462, 12460, 12460, 12462, 12466, 12463, 12462, 12463, 12465, 12462, 12461, 12463, 12466, 12464, 12463, 12465, 12469, 12468, 12468, 12470, 12474, 12472, 12471, 12472, 12474, 12472, 12471, 12473, 12476, 12474, 12474, 12476, 12480, 12479, 12480, 12482, 12486, 12484, 12483, 12483, 12486, 12483, 12482, 12484, 12487, 12485, 12484, 12486, 12490, 12488, 12488, 12490, 12494, 12491, 12490, 12491, 12493, 12490, 12489, 12491, 12494, 12492, 12491, 12493, 12497, 12496, 12496, 12498, 12502, 12500, 12499, 12500, 12502, 12500, 12499, 12501, 12504, 12502, 12502, 12504, 12508, 12507, 12508, 12510, 12514, 12511, 12510, 12511, 12513, 12511, 12510, 12512, 12515, 12512, 12512, 12514, 12517, 12516, 12516, 12518, 12522, 12519, 12518, 12519, 12521, 12519, 12518, 12519, 12522, 12520, 12520, 12522, 12525, 12524, 12524, 12526, 12530, 12527, 12526, 12527, 12529, 12526, 12525, 12527, 12530, 12528, 12527, 12529, 12533, 12532, 12532, 12534, 12538, 12536, 12535, 12536, 12538, 12536, 12535, 12537, 12540, 12538, 12538, 12540, 12544, 12543, 12544, 12546, 12550, 12547, 12546, 12547, 12550, 12547, 12546, 12548, 12551, 12548, 12548, 12550, 12553, 12552, 12552, 12554, 12558, 12555, 12554, 12555, 12557, 12554, 12554, 12555, 12558, 12556, 12556, 12557, 12561, 12560, 12560, 12562, 12566, 12563, 12562, 12563, 12565, 12563, 12562, 12563, 12566, 12564, 12564, 12566, 12569, 12568, 12568, 12570, 12574, 12571, 12570, 12571, 12573, 12570, 12569, 12571, 12574, 12572, 12571, 12573, 12577, 12576, 12576, 12578, 12582, 12580, 12579, 12580, 12582, 12580, 12579, 12581, 12584, 12582, 12582, 12584, 12588, 12587, 12588, 12590, 12594, 12591, 12590, 12591, 12594, 12591, 12590, 12592, 12595, 12593, 12592, 12594, 12597, 12596, 12596, 12598, 12602, 12599, 12598, 12599, 12601, 12598, 12597, 12598, 12602, 12599, 12599, 12601, 12605, 12603, 12604, 12606, 12610, 12608, 12607, 12608, 12610, 12608, 12607, 12609, 12612, 12610, 12610, 12612, 12616, 12615, 12616, 12618, 12622, 12619, 12618, 12619, 12621, 12619, 12618, 12619, 12622, 12620, 12620, 12622, 12625, 12624, 12624, 12626, 12630, 12627, 12626, 12627, 12629, 12627, 12626, 12627, 12630, 12628, 12628, 12630, 12633, 12632, 12632, 12634, 12638, 12635, 12634, 12635, 12637, 12634, 12633, 12634, 12637, 12635, 12635, 12637, 12641, 12639, 12640, 12642, 12646, 12644, 12643, 12644, 12646, 12644, 12644, 12645, 12649, 12647, 12647, 12649, 12653, 12652, 12652, 12654, 12658, 12655, 12654, 12654, 12656, 12653, 12652, 12653, 12656, 12654, 12653, 12655, 12658, 12656, 12656, 12658, 12662, 12659, 12658, 12659, 12661, 12659, 12658, 12660, 12663, 12662, 12662, 12664, 12668, 12667, 12668, 12670, 12674, 12672, 12671, 12671, 12674, 12671, 12670, 12672, 12675, 12673, 12672, 12674, 12678, 12676, 12676, 12678, 12682, 12679, 12678, 12679, 12681, 12678, 12677, 12678, 12681, 12679, 12679, 12681, 12685, 12683, 12684, 12686, 12690, 12687, 12687, 12687, 12690, 12688, 12687, 12689, 12692, 12690, 12690, 12692, 12696, 12695, 12696, 12698, 12702, 12699, 12698, 12699, 12701, 12699, 12698, 12699, 12702, 12700, 12700, 12702, 12705, 12704, 12704, 12706, 12710, 12707, 12706, 12707, 12709, 12706, 12705, 12707, 12710, 12708, 12707, 12709, 12713, 12712, 12712, 12714, 12718, 12715, 12714, 12715, 12717, 12714, 12714, 12715, 12718, 12716, 12716, 12717, 12721, 12720, 12720, 12722, 12726, 12723, 12722, 12723, 12725, 12723, 12722, 12723, 12726, 12724, 12724, 12726, 12729, 12728, 12728, 12730, 12734, 12731, 12730, 12731, 12733, 12730, 12729, 12731, 12734, 12732, 12731, 12733, 12737, 12735, 12736, 12738, 12742, 12739, 12738, 12739, 12742, 12739, 12739, 12740, 12744, 12742, 12742, 12744, 12748, 12747, 12748, 12750, 12754, 12751, 12751, 12751, 12754, 12751, 12750, 12752, 12755, 12753, 12752, 12754, 12758, 12756, 12757, 12758, 12762, 12759, 12757, 12758, 12760, 12757, 12756, 12757, 12759, 12757, 12756, 12758, 12761, 12760, 12760, 12762, 12766, 12763, 12762, 12763, 12766, 12763, 12763, 12764, 12768, 12766, 12766, 12768, 12772, 12771, 12772, 12774, 12778, 12775, 12774, 12775, 12778, 12775, 12774, 12776, 12779, 12777, 12776, 12778, 12782, 12780, 12780, 12782, 12786, 12783, 12782, 12782, 12785, 12782, 12781, 12782, 12785, 12783, 12783, 12785, 12788, 12787, 12788, 12790, 12794, 12791, 12791, 12792, 12794, 12792, 12791, 12793, 12796, 12795, 12795, 12797, 12801, 12799, 12800, 12802, 12806, 12803, 12802, 12803, 12805, 12802, 12801, 12802, 12805, 12802, 12801, 12803, 12806, 12805, 12805, 12807, 12810, 12807, 12806, 12806, 12808, 12806, 12805, 12806, 12809, 12807, 12807, 12809, 12812, 12811, 12812, 12814, 12818, 12815, 12815, 12816, 12818, 12816, 12815, 12817, 12820, 12818, 12818, 12820, 12824, 12823, 12824, 12826, 12830, 12827, 12826, 12827, 12829, 12827, 12826, 12827, 12830, 12828, 12828, 12830, 12833, 12832, 12832, 12834, 12838, 12835, 12834, 12835, 12837, 12834, 12833, 12835, 12838, 12836, 12835, 12837, 12841, 12840, 12840, 12842, 12846, 12843, 12842, 12843, 12845, 12842, 12841, 12843, 12846, 12844, 12843, 12845, 12849, 12848, 12848, 12850, 12854, 12851, 12850, 12851, 12853, 12850, 12850, 12851, 12854, 12852, 12852, 12853, 12857, 12856, 12856, 12858, 12862, 12859, 12858, 12858, 12861, 12858, 12857, 12858, 12861, 12859, 12859, 12861, 12864, 12863, 12864, 12866, 12870, 12867, 12867, 12868, 12870, 12868, 12867, 12869, 12873, 12871, 12871, 12873, 12877, 12876, 12876, 12878, 12882, 12879, 12878, 12878, 12880, 12877, 12876, 12877, 12880, 12878, 12877, 12878, 12882, 12880, 12880, 12882, 12886, 12883, 12882, 12883, 12885, 12883, 12882, 12884, 12887, 12885, 12885, 12888, 12892, 12891, 12891, 12894, 12898, 12895, 12895, 12895, 12898, 12895, 12895, 12896, 12899, 12897, 12897, 12898, 12902, 12900, 12901, 12902, 12906, 12903, 12901, 12902, 12904, 12901, 12899, 12901, 12903, 12901, 12900, 12902, 12905, 12904, 12904, 12906, 12910, 12907, 12906, 12907, 12910, 12907, 12906, 12908, 12912, 12910, 12910, 12912, 12916, 12915, 12915, 12918, 12922, 12919, 12918, 12919, 12921, 12919, 12918, 12919, 12923, 12920, 12920, 12922, 12925, 12924, 12924, 12926, 12930, 12927, 12926, 12927, 12929, 12926, 12925, 12927, 12930, 12928, 12927, 12929, 12933, 12932, 12932, 12934, 12938, 12935, 12934, 12935, 12937, 12934, 12933, 12935, 12938, 12936, 12935, 12937, 12941, 12940, 12940, 12942, 12946, 12943, 12942, 12943, 12945, 12942, 12942, 12943, 12946, 12944, 12944, 12945, 12949, 12948, 12948, 12950, 12954, 12951, 12950, 12950, 12953, 12950, 12949, 12950, 12953, 12951, 12951, 12953, 12956, 12955, 12956, 12958, 12962, 12959, 12958, 12960, 12962, 12960, 12959, 12961, 12964, 12962, 12962, 12965, 12968, 12967, 12968, 12970, 12974, 12971, 12970, 12970, 12973, 12970, 12969, 12970, 12973, 12970, 12969, 12971, 12974, 12973, 12973, 12974, 12978, 12975, 12973, 12974, 12976, 12973, 12972, 12974, 12977, 12975, 12974, 12976, 12980, 12979, 12979, 12982, 12986, 12983, 12983, 12984, 12986, 12984, 12983, 12985, 12989, 12987, 12987, 12989, 12993, 12992, 12992, 12994, 12998, 12995, 12994, 12994, 12996, 12993, 12992, 12993, 12996, 12993, 12993, 12994, 12998, 12996, 12996, 12998, 13002, 12999, 12998, 12999, 13001, 12999, 12998, 13000, 13003, 13001, 13001, 13004, 13008, 13007, 13007, 13010, 13014, 13011, 13010, 13011, 13013, 13011, 13010, 13011, 13014, 13012, 13012, 13014, 13017, 13016, 13016, 13018, 13022, 13019, 13018, 13019, 13021, 13018, 13017, 13019, 13022, 13020, 13019, 13021, 13025, 13024, 13024, 13026, 13030, 13027, 13026, 13027, 13029, 13026, 13025, 13027, 13030, 13028, 13027, 13029, 13033, 13032, 13032, 13034, 13038, 13035, 13034, 13035, 13037, 13034, 13033, 13035, 13038, 13036, 13035, 13037, 13041, 13040, 13040, 13042, 13046, 13043, 13042, 13043, 13045, 13042, 13041, 13043, 13046, 13044, 13043, 13045, 13049, 13048, 13048, 13050, 13054, 13051, 13050, 13051, 13053, 13050, 13049, 13051, 13054, 13052, 13051, 13053, 13057, 13056, 13056, 13058, 13062, 13059, 13058, 13059, 13061, 13058, 13057, 13059, 13062, 13060, 13059, 13061, 13065, 13064, 13064, 13066, 13070, 13067, 13066, 13067, 13069, 13066, 13065, 13067, 13070, 13068, 13067, 13069, 13073, 13072, 13072, 13074, 13078, 13075, 13074, 13075, 13077, 13074, 13073, 13075, 13078, 13076, 13075, 13077, 13081, 13080, 13080, 13082, 13086, 13083, 13082, 13083, 13085, 13082, 13081, 13083, 13086, 13084, 13083, 13085, 13089, 13088, 13088, 13090, 13094, 13091, 13090, 13090, 13093, 13090, 13089, 13090, 13093, 13091, 13091, 13093, 13096, 13095, 13096, 13098, 13102, 13099, 13098, 13099, 13102, 13100, 13099, 13101, 13104, 13102, 13102, 13104, 13108, 13107, 13108, 13110, 13114, 13111, 13110, 13110, 13112, 13110, 13108, 13110, 13112, 13110, 13109, 13111, 13114, 13113, 13112, 13114, 13118, 13115, 13113, 13114, 13116, 13113, 13112, 13114, 13117, 13115, 13114, 13116, 13120, 13119, 13119, 13122, 13126, 13123, 13122, 13123, 13126, 13123, 13123, 13124, 13128, 13126, 13126, 13128, 13132, 13131, 13131, 13134, 13138, 13135, 13134, 13135, 13138, 13135, 13134, 13136, 13139, 13137, 13136, 13138, 13142, 13140, 13140, 13142, 13146, 13143, 13141, 13142, 13144, 13141, 13139, 13140, 13143, 13141, 13140, 13142, 13145, 13144, 13144, 13146, 13150, 13147, 13146, 13147, 13149, 13147, 13146, 13148, 13151, 13149, 13149, 13152, 13156, 13155, 13155, 13158, 13162, 13159, 13158, 13159, 13162, 13159, 13158, 13160, 13163, 13161, 13160, 13162, 13166, 13164, 13164, 13166, 13170, 13167, 13165, 13166, 13168, 13165, 13163, 13164, 13167, 13165, 13164, 13166, 13169, 13168, 13168, 13170, 13174, 13171, 13170, 13171, 13173, 13171, 13170, 13172, 13175, 13174, 13173, 13176, 13180, 13179, 13179, 13182, 13186, 13183, 13182, 13183, 13185, 13183, 13182, 13183, 13186, 13184, 13184, 13186, 13189, 13188, 13188, 13190, 13194, 13191, 13190, 13190, 13193, 13190, 13189, 13190, 13194, 13191, 13191, 13193, 13197, 13195, 13196, 13198, 13202, 13199, 13198, 13199, 13201, 13198, 13197, 13199, 13202, 13200, 13199, 13201, 13205, 13204, 13204, 13206, 13210, 13207, 13206, 13207, 13209, 13206, 13205, 13207, 13210, 13208, 13207, 13209, 13213, 13212, 13212, 13214, 13218, 13215, 13214, 13215, 13217, 13214, 13213, 13215, 13218, 13216, 13215, 13217, 13221, 13220, 13220, 13222, 13226, 13223, 13222, 13223, 13225, 13222, 13221, 13223, 13226, 13224, 13223, 13225, 13229, 13228, 13228, 13230, 13234, 13231, 13230, 13231, 13233, 13230, 13229, 13231, 13234, 13232, 13231, 13233, 13237, 13236, 13236, 13238, 13242, 13239, 13238, 13239, 13241, 13238, 13237, 13239, 13242, 13240, 13239, 13241, 13245, 13244, 13244, 13246, 13250, 13247, 13246, 13247, 13249, 13246, 13245, 13247, 13250, 13248, 13247, 13249, 13253, 13252, 13252, 13254, 13258, 13255, 13254, 13255, 13257, 13254, 13253, 13255, 13258, 13256, 13255, 13257, 13261, 13260, 13260, 13262, 13266, 13263, 13262, 13263, 13265, 13262, 13261, 13263, 13266, 13264, 13263, 13265, 13269, 13268, 13268, 13270, 13274, 13271, 13270, 13271, 13273, 13270, 13269, 13271, 13274, 13272, 13271, 13273, 13277, 13276, 13276, 13278, 13282, 13279, 13278, 13279, 13281, 13278, 13277, 13279, 13282, 13280, 13279, 13281, 13285, 13284, 13284, 13286, 13290, 13287, 13286, 13287, 13289, 13286, 13285, 13287, 13290, 13288, 13287, 13289, 13293, 13292, 13292, 13294, 13298, 13295, 13294, 13295, 13297, 13294, 13293, 13295, 13298, 13296, 13295, 13297, 13301, 13300, 13300, 13302, 13306, 13303, 13302, 13303, 13305, 13302, 13301, 13303, 13306, 13304, 13303, 13305, 13309, 13308, 13308, 13310, 13314, 13311, 13310, 13310, 13313, 13310, 13309, 13311, 13314, 13312, 13311, 13313, 13317, 13315, 13316, 13318, 13322, 13319, 13318, 13318, 13321, 13318, 13317, 13319, 13322, 13320, 13319, 13321, 13325, 13323, 13324, 13326, 13330, 13327, 13326, 13326, 13329, 13326, 13325, 13327, 13330, 13328, 13327, 13329, 13333, 13331, 13332, 13334, 13338, 13335, 13334, 13334, 13337, 13334, 13333, 13335, 13338, 13336, 13335, 13337, 13341, 13339, 13340, 13342, 13346, 13343, 13342, 13342, 13345, 13342, 13341, 13343, 13346, 13344, 13343, 13345, 13349, 13347, 13348, 13350, 13354, 13351, 13350, 13350, 13353, 13350, 13349, 13351, 13354, 13352, 13351, 13353, 13357, 13355, 13356, 13358, 13362, 13359, 13358, 13358, 13361, 13358, 13357, 13359, 13362, 13360, 13359, 13361, 13365, 13363, 13364, 13366, 13370, 13367, 13366, 13366, 13369, 13366, 13365, 13367, 13370, 13368, 13367, 13369, 13373, 13371, 13372, 13374, 13378, 13375, 13374, 13374, 13377, 13374, 13373, 13375, 13378, 13376, 13375, 13377, 13381, 13379, 13380, 13382, 13386, 13383, 13382, 13382, 13385, 13382, 13381, 13382, 13386, 13383, 13383, 13385, 13389, 13387, 13388, 13390, 13394, 13391, 13390, 13390, 13393, 13390, 13389, 13390, 13394, 13391, 13391, 13393, 13397, 13395, 13396, 13398, 13402, 13399, 13398, 13398, 13401, 13398, 13397, 13398, 13402, 13399, 13399, 13401, 13405, 13403, 13404, 13406, 13410, 13407, 13406, 13406, 13409, 13406, 13405, 13407, 13410, 13408, 13407, 13409, 13413, 13411, 13412, 13414, 13417, 13415, 13414, 13414, 13417, 13414, 13413, 13414, 13418, 13415, 13415, 13417, 13421, 13419, 13420, 13422, 13425, 13423, 13422, 13423, 13425, 13422, 13422, 13423, 13426, 13424, 13424, 13426, 13429, 13428, 13428, 13430, 13433, 13431, 13429, 13430, 13432, 13429, 13427, 13428, 13431, 13429, 13428, 13430, 13433, 13432, 13432, 13434, 13437, 13435, 13434, 13435, 13437, 13435, 13434, 13436, 13439, 13437, 13437, 13439, 13443, 13442, 13443, 13446, 13449, 13447, 13446, 13447, 13450, 13447, 13446, 13448, 13451, 13449, 13448, 13450, 13454, 13452, 13452, 13454, 13457, 13455, 13453, 13453, 13455, 13452, 13451, 13452, 13455, 13453, 13452, 13454, 13457, 13456, 13456, 13458, 13461, 13459, 13458, 13459, 13461, 13459, 13458, 13460, 13463, 13461, 13461, 13463, 13467, 13466, 13467, 13470, 13473, 13471, 13470, 13471, 13474, 13471, 13470, 13472, 13475, 13473, 13472, 13474, 13478, 13476, 13476, 13478, 13481, 13479, 13477, 13477, 13479, 13476, 13475, 13476, 13479, 13476, 13476, 13477, 13481, 13480, 13480, 13482, 13485, 13483, 13482, 13483, 13486, 13483, 13482, 13484, 13488, 13486, 13486, 13488, 13492, 13491, 13491, 13494, 13497, 13495, 13494, 13494, 13496, 13493, 13492, 13493, 13496, 13494, 13493, 13495, 13498, 13496, 13496, 13498, 13501, 13499, 13497, 13498, 13500, 13497, 13496, 13497, 13500, 13498, 13498, 13500, 13504, 13503, 13503, 13506, 13509, 13507, 13506, 13507, 13510, 13508, 13507, 13509, 13512, 13510, 13510, 13512, 13516, 13515, 13516, 13518, 13521, 13519, 13518, 13518, 13520, 13517, 13516, 13517, 13520, 13518, 13517, 13518, 13522, 13520, 13520, 13522, 13525, 13523, 13521, 13522, 13524, 13521, 13520, 13522, 13525, 13523, 13522, 13524, 13528, 13527, 13528, 13530, 13533, 13531, 13530, 13530, 13533, 13530, 13529, 13531, 13534, 13532, 13531, 13533, 13537, 13535, 13536, 13538, 13541, 13539, 13538, 13538, 13541, 13538, 13537, 13538, 13542, 13539, 13539, 13541, 13545, 13543, 13544, 13546, 13549, 13547, 13546, 13546, 13549, 13546, 13545, 13546, 13550, 13547, 13547, 13549, 13553, 13551, 13552, 13554, 13557, 13555, 13554, 13554, 13557, 13554, 13553, 13554, 13558, 13555, 13555, 13557, 13561, 13559, 13560, 13562, 13565, 13563, 13562, 13562, 13565, 13562, 13561, 13562, 13566, 13563, 13563, 13565, 13569, 13567, 13568, 13570, 13573, 13571, 13570, 13570, 13573, 13570, 13569, 13570, 13574, 13571, 13571, 13573, 13577, 13575, 13576, 13578, 13581, 13579, 13578, 13578, 13581, 13578, 13577, 13578, 13582, 13579, 13579, 13581, 13585, 13583, 13584, 13586, 13589, 13587, 13586, 13586, 13589, 13586, 13585, 13586, 13590, 13587, 13587, 13589, 13593, 13591, 13592, 13594, 13597, 13595, 13594, 13594, 13597, 13594, 13593, 13594, 13598, 13595, 13595, 13597, 13601, 13599, 13600, 13602, 13605, 13603, 13602, 13602, 13605, 13602, 13601, 13602, 13606, 13603, 13603, 13605, 13609, 13607, 13608, 13610, 13613, 13611, 13610, 13610, 13613, 13610, 13609, 13610, 13613, 13611, 13611, 13613, 13617, 13615, 13616, 13618, 13621, 13619, 13618, 13619, 13621, 13618, 13617, 13619, 13622, 13620, 13619, 13621, 13625, 13624, 13624, 13626, 13629, 13627, 13625, 13626, 13628, 13624, 13623, 13624, 13627, 13625, 13624, 13626, 13629, 13628, 13628, 13630, 13633, 13631, 13630, 13631, 13633, 13630, 13630, 13631, 13635, 13633, 13633, 13635, 13639, 13638, 13639, 13642, 13645, 13643, 13642, 13643, 13646, 13643, 13642, 13643, 13647, 13644, 13644, 13646, 13650, 13648, 13648, 13650, 13653, 13651, 13649, 13649, 13651, 13648, 13647, 13648, 13651, 13648, 13648, 13649, 13653, 13652, 13652, 13654, 13657, 13655, 13654, 13655, 13657, 13655, 13654, 13655, 13659, 13657, 13657, 13659, 13663, 13662, 13663, 13666, 13669, 13667, 13666, 13667, 13669, 13667, 13666, 13667, 13671, 13668, 13668, 13670, 13673, 13672, 13672, 13674, 13677, 13675, 13673, 13674, 13676, 13673, 13671, 13673, 13676, 13673, 13672, 13674, 13678, 13676, 13676, 13678, 13681, 13679, 13677, 13678, 13680, 13677, 13676, 13677, 13681, 13678, 13678, 13680, 13684, 13683, 13683, 13686, 13689, 13687, 13686, 13687, 13690, 13687, 13687, 13689, 13692, 13690, 13690, 13692, 13696, 13695, 13695, 13698, 13701, 13699, 13697, 13698, 13700, 13697, 13696, 13697, 13700, 13698, 13697, 13698, 13702, 13700, 13700, 13702, 13705, 13703, 13701, 13702, 13704, 13701, 13700, 13701, 13704, 13702, 13702, 13704, 13708, 13707, 13707, 13710, 13713, 13711, 13710, 13711, 13714, 13711, 13711, 13713, 13716, 13714, 13714, 13716, 13720, 13719, 13719, 13722, 13725, 13723, 13721, 13722, 13724, 13721, 13720, 13721, 13724, 13721, 13721, 13722, 13726, 13724, 13724, 13726, 13729, 13727, 13725, 13726, 13728, 13725, 13724, 13726, 13729, 13727, 13726, 13728, 13732, 13731, 13731, 13734, 13737, 13735, 13734, 13734, 13737, 13734, 13733, 13734, 13738, 13735, 13735, 13737, 13741, 13739, 13740, 13742, 13745, 13743, 13742, 13742, 13745, 13742, 13741, 13742, 13746, 13743, 13743, 13745, 13749, 13747, 13748, 13750, 13753, 13751, 13750, 13750, 13753, 13750, 13749, 13750, 13754, 13751, 13751, 13753, 13757, 13755, 13756, 13758, 13761, 13759, 13758, 13758, 13761, 13758, 13757, 13758, 13762, 13759, 13759, 13761, 13765, 13763, 13764, 13766, 13769, 13767, 13766, 13766, 13769, 13766, 13765, 13766, 13770, 13767, 13767, 13769, 13773, 13771, 13772, 13774, 13777, 13775, 13774, 13774, 13777, 13774, 13773, 13774, 13778, 13775, 13775, 13777, 13781, 13779, 13780, 13782, 13785, 13783, 13782, 13782, 13785, 13782, 13781, 13782, 13786, 13783, 13783, 13785, 13789, 13787, 13788, 13790, 13793, 13791, 13790, 13790, 13793, 13790, 13789, 13790, 13794, 13791, 13791, 13793, 13797, 13795, 13796, 13798, 13801, 13799, 13798, 13798, 13801, 13798, 13797, 13798, 13802, 13799, 13799, 13801, 13805, 13803, 13804, 13806, 13809, 13807, 13806, 13806, 13809, 13806, 13805, 13806, 13810, 13807, 13807, 13809, 13813, 13811, 13812, 13814, 13817, 13815, 13814, 13814, 13817, 13814, 13813, 13814, 13818, 13815, 13815, 13817, 13821, 13819, 13820, 13822, 13825, 13823, 13822, 13822, 13825, 13822, 13821, 13822, 13826, 13823, 13823, 13825, 13829, 13827, 13828, 13830, 13833, 13831, 13830, 13830, 13833, 13830, 13829, 13830, 13834, 13831, 13831, 13833, 13837, 13835, 13836, 13838, 13841, 13839, 13838, 13838, 13841, 13838, 13837, 13838, 13842, 13839, 13839, 13841, 13845, 13843, 13844, 13846, 13849, 13847, 13846, 13846, 13849, 13846, 13845, 13846, 13850, 13847, 13847, 13849, 13853, 13851, 13852, 13854, 13857, 13855, 13853, 13854, 13857, 13854, 13853, 13854, 13857, 13855, 13855, 13857, 13860, 13859, 13859, 13862, 13865, 13863, 13862, 13862, 13865, 13862, 13861, 13863, 13866, 13864, 13863, 13865, 13869, 13868, 13868, 13870, 13873, 13871, 13869, 13869, 13871, 13868, 13867, 13868, 13871, 13868, 13868, 13869, 13873, 13872, 13872, 13874, 13877, 13875, 13874, 13874, 13877, 13874, 13874, 13875, 13879, 13877, 13877, 13879, 13883, 13882, 13883, 13886, 13889, 13887, 13886, 13887, 13889, 13887, 13886, 13887, 13890, 13888, 13888, 13890, 13893, 13892, 13892, 13894, 13897, 13895, 13893, 13894, 13896, 13893, 13891, 13892, 13895, 13893, 13892, 13894, 13898, 13896, 13896, 13898, 13901, 13899, 13897, 13898, 13900, 13897, 13896, 13897, 13900, 13898, 13898, 13900, 13904, 13903, 13903, 13906, 13909, 13907, 13906, 13907, 13910, 13907, 13907, 13908, 13912, 13910, 13910, 13912, 13916, 13915, 13915, 13918, 13921, 13919, 13917, 13918, 13920, 13917, 13916, 13917, 13920, 13917, 13916, 13918, 13922, 13920, 13920, 13922, 13925, 13923, 13921, 13922, 13924, 13921, 13920, 13922, 13925, 13923, 13922, 13924, 13928, 13927, 13927, 13930, 13933, 13931, 13930, 13930, 13933, 13930, 13929, 13930, 13934, 13931, 13931, 13933, 13937, 13935, 13936, 13938, 13941, 13939, 13937, 13938, 13941, 13938, 13937, 13938, 13941, 13939, 13939, 13941, 13945, 13943, 13943, 13946, 13949, 13947, 13945, 13946, 13949, 13946, 13945, 13946, 13949, 13947, 13947, 13949, 13953, 13951, 13951, 13954, 13957, 13955, 13953, 13954, 13957, 13954, 13953, 13954, 13957, 13955, 13955, 13957, 13961, 13959, 13959, 13962, 13965, 13963, 13961, 13962, 13965, 13962, 13961, 13962, 13965, 13963, 13963, 13965, 13969, 13967, 13967, 13970, 13973, 13971, 13969, 13970, 13972, 13970, 13968, 13970, 13973, 13971, 13970, 13973, 13976, 13975, 13975, 13978, 13981, 13979, 13978, 13978, 13981, 13978, 13977, 13979, 13982, 13980, 13979, 13981, 13985, 13984, 13984, 13986, 13989, 13987, 13985, 13985, 13987, 13984, 13983, 13984, 13987, 13984, 13984, 13985, 13989, 13987, 13988, 13990, 13993, 13991, 13990, 13990, 13993, 13990, 13990, 13991, 13995, 13993, 13993, 13995, 13999, 13998, 13999, 14001, 14005, 14003, 14002, 14003, 14005, 14002, 14002, 14003, 14006, 14004, 14004, 14005, 14009, 14008, 14008, 14010, 14013, 14011, 14009, 14009, 14012, 14008, 14007, 14008, 14011, 14009, 14008, 14010, 14013, 14012, 14012, 14014, 14017, 14015, 14013, 14014, 14016, 14013, 14012, 14013, 14016, 14014, 14014, 14016, 14020, 14019, 14019, 14021, 14025, 14023, 14022, 14023, 14026, 14023, 14023, 14024, 14028, 14026, 14026, 14028, 14032, 14031, 14031, 14034, 14037, 14035, 14033, 14034, 14036, 14033, 14032, 14033, 14036, 14033, 14032, 14034, 14038, 14036, 14036, 14038, 14041, 14039, 14037, 14038, 14040, 14037, 14036, 14037, 14041, 14039, 14038, 14040, 14044, 14043, 14043, 14046, 14049, 14047, 14045, 14046, 14049, 14046, 14045, 14046, 14050, 14047, 14047, 14049, 14053, 14051, 14051, 14054, 14057, 14055, 14053, 14054, 14057, 14054, 14053, 14054, 14057, 14055, 14055, 14057, 14061, 14059, 14059, 14062, 14065, 14063, 14061, 14062, 14065, 14062, 14061, 14062, 14065, 14063, 14063, 14065, 14069, 14067, 14067, 14070, 14073, 14071, 14069, 14070, 14073, 14070, 14069, 14070, 14073, 14071, 14071, 14073, 14077, 14075, 14075, 14078, 14081, 14079, 14077, 14078, 14080, 14077, 14076, 14078, 14081, 14079, 14078, 14080, 14084, 14083, 14083, 14086, 14089, 14087, 14085, 14086, 14089, 14086, 14085, 14086, 14090, 14087, 14087, 14089, 14093, 14091, 14092, 14094, 14097, 14095, 14093, 14094, 14096, 14093, 14091, 14092, 14096, 14093, 14092, 14094, 14098, 14096, 14096, 14098, 14101, 14098, 14097, 14097, 14100, 14097, 14096, 14097, 14100, 14098, 14098, 14100, 14104, 14102, 14103, 14105, 14109, 14107, 14106, 14107, 14110, 14107, 14106, 14108, 14112, 14110, 14110, 14112, 14116, 14115, 14115, 14118, 14121, 14119, 14117, 14118, 14120, 14117, 14116, 14117, 14120, 14117, 14116, 14118, 14122, 14120, 14120, 14122, 14125, 14123, 14121, 14122, 14124, 14121, 14120, 14121, 14125, 14122, 14122, 14124, 14128, 14127, 14127, 14130, 14133, 14131, 14129, 14130, 14133, 14130, 14129, 14130, 14133, 14131, 14131, 14133, 14137, 14135, 14135, 14138, 14141, 14139, 14137, 14138, 14141, 14138, 14137, 14138, 14142, 14139, 14139, 14141, 14145, 14143, 14144, 14146, 14149, 14147, 14145, 14145, 14148, 14144, 14143, 14144, 14148, 14145, 14144, 14146, 14150, 14148, 14148, 14150, 14153, 14150, 14149, 14149, 14152, 14149, 14148, 14149, 14152, 14150, 14150, 14152, 14156, 14154, 14155, 14157, 14161, 14159, 14158, 14159, 14162, 14159, 14158, 14160, 14164, 14162, 14162, 14164, 14168, 14167, 14167, 14170, 14173, 14171, 14169, 14170, 14172, 14169, 14167, 14169, 14172, 14169, 14168, 14170, 14174, 14172, 14172, 14174, 14177, 14174, 14173, 14174, 14176, 14173, 14172, 14173, 14177, 14174, 14174, 14176, 14180, 14179, 14179, 14182, 14185, 14183, 14181, 14182, 14185, 14182, 14181, 14182, 14185, 14183, 14183, 14185, 14188, 14187, 14187, 14190, 14193, 14191, 14189, 14190, 14193, 14190, 14189, 14190, 14194, 14191, 14191, 14193, 14197, 14195, 14196, 14198, 14201, 14198, 14197, 14197, 14200, 14196, 14195, 14196, 14199, 14197, 14196, 14198, 14201, 14200, 14200, 14202, 14205, 14203, 14201, 14202, 14204, 14201, 14200, 14201, 14205, 14203, 14202, 14204, 14208, 14207, 14207, 14210, 14213, 14211, 14209, 14210, 14213, 14210, 14209, 14210, 14213, 14211, 14211, 14213, 14217, 14215, 14215, 14218, 14221, 14219, 14217, 14218, 14220, 14217, 14216, 14218, 14221, 14219, 14218, 14220, 14224, 14223, 14223, 14226, 14229, 14227, 14225, 14226, 14228, 14225, 14224, 14226, 14229, 14227, 14226, 14228, 14232, 14231, 14231, 14234, 14237, 14235, 14233, 14234, 14237, 14234, 14233, 14234, 14238, 14235, 14235, 14237, 14241, 14239, 14240, 14242, 14245, 14242, 14241, 14241, 14244, 14240, 14239, 14240, 14243, 14241, 14240, 14242, 14245, 14244, 14244, 14246, 14249, 14246, 14245, 14246, 14248, 14245, 14244, 14245, 14249, 14247, 14246, 14248, 14252, 14251, 14251, 14254, 14257, 14255, 14253, 14254, 14256, 14253, 14252, 14254, 14257, 14255, 14254, 14256, 14260, 14259, 14259, 14262, 14265, 14263, 14261, 14262, 14265, 14262, 14261, 14262, 14266, 14263, 14263, 14265, 14269, 14267, 14268, 14270, 14273, 14270, 14269, 14269, 14272, 14268, 14267, 14268, 14271, 14269, 14268, 14270, 14273, 14272, 14272, 14274, 14277, 14274, 14273, 14274, 14276, 14273, 14272, 14273, 14277, 14274, 14274, 14276, 14280, 14279, 14279, 14282, 14285, 14283, 14281, 14282, 14285, 14282, 14281, 14282, 14285, 14283, 14283, 14285, 14289, 14287, 14287, 14290, 14293, 14291, 14289, 14290, 14292, 14289, 14288, 14290, 14293, 14291, 14290, 14292, 14296, 14295, 14295, 14298, 14301, 14299, 14297, 14298, 14300, 14297, 14296, 14298, 14301, 14299, 14298, 14300, 14304, 14303, 14303, 14306, 14309, 14307, 14305, 14306, 14309, 14306, 14305, 14306, 14310, 14307, 14307, 14309, 14313, 14311, 14312, 14314, 14317, 14314, 14313, 14313, 14316, 14312, 14311, 14312, 14315, 14313, 14312, 14314, 14317, 14316, 14316, 14318, 14321, 14318, 14317, 14318, 14320, 14317, 14316, 14317, 14321, 14318, 14318, 14320, 14324, 14323, 14323, 14326, 14329, 14327, 14325, 14326, 14328, 14325, 14324, 14326, 14329, 14327, 14326, 14328, 14332, 14331, 14331, 14334, 14337, 14335, 14333, 14334, 14337, 14334, 14333, 14334, 14338, 14335, 14335, 14337, 14341, 14339, 14339, 14342, 14345, 14342, 14341, 14341, 14344, 14340, 14339, 14340, 14343, 14341, 14340, 14342, 14345, 14344, 14344, 14346, 14349, 14346, 14345, 14346, 14348, 14345, 14344, 14345, 14349, 14346, 14346, 14348, 14352, 14351, 14351, 14354, 14357, 14355, 14353, 14354, 14357, 14354, 14353, 14354, 14357, 14355, 14354, 14357, 14361, 14359, 14359, 14362, 14365, 14363, 14361, 14362, 14364, 14361, 14360, 14362, 14365, 14363, 14362, 14364, 14368, 14367, 14367, 14370, 14373, 14371, 14369, 14370, 14373, 14370, 14369, 14370, 14374, 14371, 14371, 14373, 14377, 14375, 14375, 14378, 14381, 14378, 14377, 14377, 14380, 14376, 14375, 14376, 14379, 14377, 14376, 14378, 14381, 14380, 14380, 14382, 14385, 14382, 14381, 14382, 14384, 14381, 14380, 14381, 14385, 14382, 14382, 14384, 14388, 14387, 14387, 14390, 14393, 14391, 14389, 14390, 14392, 14389, 14388, 14390, 14393, 14391, 14390, 14392, 14396, 14395, 14395, 14398, 14401, 14399, 14397, 14398, 14401, 14398, 14397, 14398, 14402, 14399, 14399, 14401, 14405, 14403, 14403, 14406, 14409, 14406, 14405, 14405, 14407, 14404, 14403, 14404, 14407, 14405, 14404, 14406, 14409, 14408, 14408, 14410, 14413, 14410, 14409, 14410, 14412, 14409, 14408, 14409, 14413, 14410, 14410, 14412, 14416, 14415, 14415, 14418, 14421, 14419, 14417, 14418, 14420, 14417, 14416, 14418, 14421, 14419, 14418, 14420, 14424, 14423, 14423, 14426, 14429, 14427, 14425, 14426, 14429, 14426, 14425, 14426, 14430, 14427, 14427, 14429, 14433, 14431, 14431, 14434, 14437, 14434, 14433, 14433, 14436, 14432, 14431, 14432, 14435, 14433, 14432, 14434, 14437, 14436, 14436, 14438, 14441, 14438, 14437, 14438, 14440, 14437, 14436, 14437, 14441, 14438, 14438, 14440, 14444, 14443, 14443, 14445, 14449, 14447, 14445, 14446, 14449, 14446, 14445, 14446, 14450, 14447, 14447, 14449, 14453, 14451, 14451, 14454, 14457, 14454, 14453, 14453, 14455, 14452, 14451, 14452, 14455, 14452, 14452, 14453, 14457, 14456, 14456, 14458, 14461, 14458, 14457, 14458, 14460, 14457, 14456, 14457, 14461, 14458, 14458, 14460, 14464, 14463, 14463, 14466, 14469, 14467, 14465, 14466, 14468, 14465, 14464, 14466, 14469, 14467, 14466, 14468, 14472, 14471, 14471, 14474, 14477, 14475, 14473, 14474, 14477, 14474, 14473, 14474, 14478, 14475, 14475, 14477, 14481, 14479, 14479, 14482, 14485, 14482, 14481, 14481, 14483, 14480, 14478, 14480, 14483, 14480, 14479, 14481, 14485, 14483, 14483, 14486, 14489, 14487, 14485, 14486, 14489, 14486, 14485, 14487, 14491, 14489, 14489, 14491, 14495, 14494, 14495, 14497, 14501, 14499, 14497, 14498, 14500, 14497, 14496, 14497, 14500, 14498, 14497, 14498, 14502, 14500, 14500, 14502, 14505, 14502, 14500, 14501, 14503, 14499, 14498, 14499, 14502, 14499, 14499, 14500, 14504, 14503, 14503, 14505, 14509, 14507, 14506, 14506, 14509, 14507, 14506, 14508, 14511, 14509, 14509, 14511, 14516, 14514, 14515, 14517, 14521, 14519, 14517, 14518, 14520, 14517, 14515, 14517, 14520, 14517, 14516, 14518, 14522, 14520, 14520, 14522, 14525, 14522, 14521, 14521, 14524, 14521, 14520, 14521, 14525, 14522, 14522, 14524, 14528, 14527, 14527, 14529, 14533, 14531, 14529, 14530, 14532, 14529, 14528, 14530, 14533, 14531, 14530, 14532, 14536, 14535, 14535, 14537, 14541, 14539, 14537, 14538, 14541, 14538, 14537, 14538, 14542, 14539, 14539, 14541, 14545, 14543, 14543, 14546, 14549, 14546, 14545, 14545, 14547, 14544, 14543, 14544, 14547, 14544, 14544, 14545, 14549, 14548, 14548, 14550, 14553, 14550, 14549, 14549, 14552, 14549, 14548, 14549, 14553, 14550, 14550, 14552, 14556, 14555, 14555, 14557, 14561, 14559, 14557, 14558, 14561, 14558, 14557, 14558, 14562, 14559, 14559, 14561, 14565, 14563, 14563, 14566, 14569, 14566, 14565, 14565, 14567, 14564, 14563, 14564, 14567, 14564, 14564, 14565, 14569, 14567, 14567, 14570, 14573, 14570, 14569, 14570, 14572, 14569, 14568, 14569, 14573, 14570, 14570, 14572, 14576, 14575, 14575, 14577, 14581, 14579, 14577, 14578, 14580, 14577, 14576, 14578, 14581, 14579, 14578, 14580, 14584, 14583, 14583, 14585, 14589, 14587, 14585, 14586, 14589, 14586, 14585, 14586, 14590, 14587, 14587, 14589, 14593, 14591, 14591, 14594, 14597, 14594, 14593, 14593, 14595, 14592, 14591, 14592, 14595, 14592, 14592, 14593, 14597, 14595, 14596, 14598, 14601, 14598, 14597, 14597, 14600, 14597, 14596, 14597, 14601, 14598, 14598, 14600, 14604, 14603, 14603, 14605, 14609, 14607, 14605, 14606, 14609, 14606, 14605, 14606, 14610, 14607, 14607, 14609, 14613, 14611, 14611, 14614, 14617, 14614, 14613, 14613, 14615, 14612, 14611, 14612, 14615, 14612, 14612, 14613, 14617, 14615, 14615, 14618, 14621, 14618, 14617, 14617, 14620, 14617, 14616, 14617, 14621, 14618, 14618, 14620, 14624, 14623, 14623, 14625, 14629, 14627, 14625, 14626, 14628, 14625, 14624, 14626, 14629, 14627, 14626, 14628, 14632, 14631, 14631, 14633, 14637, 14635, 14633, 14634, 14637, 14634, 14633, 14634, 14638, 14635, 14635, 14637, 14641, 14639, 14639, 14642, 14645, 14642, 14641, 14641, 14643, 14640, 14639, 14640, 14643, 14640, 14640, 14641, 14645, 14643, 14643, 14646, 14649, 14646, 14645, 14645, 14648, 14645, 14644, 14645, 14649, 14646, 14646, 14648, 14652, 14651, 14651, 14653, 14657, 14655, 14653, 14654, 14657, 14654, 14653, 14654, 14658, 14655, 14655, 14657, 14661, 14659, 14659, 14662, 14665, 14662, 14661, 14661, 14663, 14660, 14659, 14660, 14663, 14660, 14660, 14661, 14665, 14663, 14663, 14666, 14669, 14666, 14665, 14665, 14668, 14665, 14664, 14665, 14669, 14666, 14666, 14668, 14672, 14671, 14671, 14673, 14677, 14674, 14673, 14674, 14676, 14673, 14672, 14674, 14677, 14675, 14674, 14676, 14680, 14679, 14679, 14681, 14685, 14683, 14681, 14682, 14685, 14681, 14680, 14682, 14686, 14683, 14683, 14685, 14689, 14687, 14687, 14690, 14693, 14690, 14689, 14689, 14691, 14688, 14687, 14688, 14691, 14688, 14688, 14689, 14693, 14691, 14691, 14694, 14697, 14694, 14693, 14693, 14696, 14693, 14692, 14693, 14697, 14694, 14694, 14696, 14700, 14698, 14699, 14701, 14705, 14703, 14701, 14702, 14705, 14702, 14701, 14702, 14706, 14703, 14703, 14705, 14709, 14707, 14707, 14710, 14713, 14710, 14709, 14709, 14711, 14708, 14707, 14708, 14711, 14708, 14708, 14709, 14713, 14711, 14711, 14714, 14717, 14714, 14713, 14713, 14716, 14713, 14712, 14713, 14717, 14714, 14714, 14716, 14720, 14718, 14719, 14721, 14725, 14723, 14721, 14722, 14725, 14722, 14721, 14722, 14726, 14723, 14723, 14725, 14729, 14727, 14727, 14730, 14733, 14730, 14729, 14729, 14731, 14728, 14727, 14728, 14731, 14728, 14727, 14729, 14733, 14731, 14731, 14734, 14737, 14734, 14733, 14733, 14736, 14733, 14732, 14733, 14737, 14734, 14734, 14736, 14740, 14739, 14739, 14741, 14745, 14742, 14741, 14742, 14744, 14741, 14740, 14742, 14745, 14743, 14742, 14744, 14748, 14747, 14747, 14749, 14753, 14750, 14749, 14750, 14753, 14749, 14748, 14750, 14753, 14751, 14750, 14753, 14757, 14755, 14755, 14758, 14761, 14758, 14757, 14757, 14759, 14756, 14755, 14756, 14759, 14756, 14756, 14757, 14761, 14759, 14759, 14762, 14765, 14762, 14761, 14761, 14764, 14761, 14759, 14761, 14764, 14762, 14762, 14764, 14768, 14766, 14767, 14769, 14773, 14771, 14769, 14770, 14773, 14770, 14769, 14770, 14774, 14771, 14771, 14773, 14777, 14775, 14775, 14778, 14781, 14778, 14777, 14777, 14779, 14776, 14775, 14776, 14779, 14776, 14775, 14777, 14781, 14779, 14779, 14782, 14785, 14782, 14781, 14781, 14784, 14781, 14779, 14781, 14784, 14782, 14782, 14784, 14788, 14786, 14787, 14789, 14793, 14791, 14789, 14790, 14793, 14790, 14789, 14790, 14794, 14791, 14791, 14793, 14797, 14795, 14795, 14798, 14801, 14798, 14797, 14797, 14799, 14796, 14795, 14796, 14799, 14796, 14795, 14797, 14801, 14799, 14799, 14802, 14805, 14802, 14801, 14801, 14804, 14801, 14800, 14801, 14805, 14802, 14802, 14804, 14808, 14807, 14807, 14809, 14813, 14810, 14809, 14810, 14812, 14809, 14808, 14810, 14813, 14811, 14810, 14812, 14816, 14815, 14815, 14817, 14821, 14818, 14817, 14818, 14820, 14817, 14816, 14818, 14821, 14819, 14818, 14821, 14825, 14823, 14823, 14826, 14829, 14826, 14825, 14825, 14827, 14824, 14823, 14824, 14827, 14824, 14823, 14825, 14829, 14827, 14827, 14830, 14833, 14830, 14829, 14829, 14832, 14829, 14827, 14829, 14832, 14830, 14829, 14832, 14836, 14834, 14835, 14837, 14841, 14838, 14837, 14838, 14841, 14838, 14836, 14838, 14842, 14839, 14839, 14841, 14845, 14843, 14843, 14846, 14849, 14846, 14845, 14845, 14847, 14844, 14843, 14844, 14847, 14844, 14843, 14845, 14849, 14847, 14847, 14850, 14853, 14850, 14849, 14849, 14852, 14849, 14847, 14849, 14852, 14850, 14849, 14852, 14856, 14854, 14855, 14857, 14861, 14858, 14857, 14858, 14861, 14858, 14856, 14858, 14862, 14859, 14859, 14861, 14865, 14863, 14863, 14866, 14869, 14866, 14865, 14865, 14867, 14864, 14863, 14864, 14867, 14864, 14863, 14865, 14869, 14867, 14867, 14870, 14873, 14870, 14869, 14869, 14872, 14869, 14868, 14869, 14873, 14870, 14870, 14872, 14876, 14875, 14875, 14877, 14881, 14878, 14877, 14878, 14880, 14877, 14876, 14878, 14881, 14879, 14878, 14880, 14884, 14883, 14883, 14885, 14889, 14886, 14885, 14886, 14888, 14885, 14884, 14886, 14889, 14887, 14886, 14888, 14892, 14891, 14891, 14893, 14897, 14894, 14893, 14893, 14896, 14892, 14891, 14892, 14896, 14893, 14892, 14894, 14898, 14896, 14896, 14898, 14901, 14898, 14896, 14896, 14899, 14895, 14894, 14895, 14898, 14895, 14894, 14896, 14900, 14899, 14899, 14901, 14905, 14903, 14901, 14902, 14905, 14902, 14901, 14903, 14907, 14905, 14905, 14907, 14912, 14910, 14911, 14913, 14917, 14914, 14913, 14913, 14916, 14912, 14911, 14912, 14915, 14913, 14912, 14913, 14917, 14915, 14915, 14918, 14921, 14918, 14917, 14917, 14920, 14917, 14916, 14917, 14921, 14918, 14918, 14920, 14924, 14923, 14923, 14925, 14929, 14926, 14924, 14925, 14927, 14924, 14922, 14923, 14927, 14924, 14923, 14925, 14929, 14927, 14927, 14929, 14933, 14930, 14929, 14930, 14933, 14930, 14929, 14931, 14935, 14933, 14932, 14935, 14939, 14938, 14939, 14941, 14945, 14942, 14941, 14942, 14944, 14941, 14939, 14941, 14944, 14941, 14940, 14942, 14946, 14944, 14944, 14946, 14949, 14946, 14944, 14945, 14947, 14943, 14942, 14943, 14946, 14944, 14943, 14945, 14949, 14947, 14947, 14949, 14953, 14950, 14949, 14949, 14952, 14949, 14948, 14949, 14953, 14950, 14950, 14952, 14956, 14955, 14955, 14957, 14961, 14958, 14957, 14958, 14960, 14957, 14956, 14957, 14961, 14958, 14958, 14960, 14964, 14963, 14963, 14965, 14969, 14966, 14965, 14966, 14968, 14965, 14964, 14966, 14969, 14967, 14966, 14968, 14973, 14971, 14971, 14973, 14977, 14974, 14972, 14973, 14975, 14972, 14970, 14972, 14975, 14972, 14971, 14973, 14977, 14975, 14975, 14978, 14981, 14978, 14977, 14977, 14980, 14977, 14975, 14977, 14981, 14978, 14978, 14980, 14984, 14982, 14983, 14985, 14989, 14986, 14985, 14986, 14988, 14985, 14984, 14985, 14989, 14986, 14986, 14988, 14992, 14991, 14991, 14993, 14997, 14994, 14993, 14994, 14996, 14993, 14992, 14994, 14997, 14995, 14994, 14996, 15001, 14999, 14999, 15001, 15005, 15002, 15000, 15001, 15003, 15000, 14998, 15000, 15003, 15000, 14999, 15001, 15005, 15003, 15003, 15006, 15009, 15006, 15005, 15005, 15008, 15005, 15003, 15005, 15009, 15006, 15006, 15008, 15012, 15010, 15011, 15013, 15017, 15014, 15013, 15014, 15016, 15013, 15012, 15013, 15017, 15014, 15014, 15016, 15020, 15019, 15019, 15021, 15025, 15022, 15021, 15022, 15024, 15021, 15020, 15022, 15025, 15023, 15022, 15024, 15029, 15027, 15027, 15029, 15033, 15030, 15028, 15029, 15031, 15028, 15026, 15028, 15031, 15028, 15027, 15029, 15033, 15031, 15031, 15033, 15037, 15034, 15033, 15033, 15036, 15033, 15031, 15033, 15037, 15034, 15033, 15036, 15040, 15038, 15039, 15041, 15045, 15042, 15041, 15042, 15044, 15041, 15040, 15041, 15045, 15042, 15042, 15044, 15048, 15047, 15047, 15049, 15053, 15050, 15049, 15050, 15052, 15049, 15048, 15050, 15053, 15051, 15050, 15052, 15057, 15055, 15055, 15057, 15061, 15058, 15056, 15057, 15059, 15056, 15054, 15056, 15059, 15056, 15055, 15057, 15061, 15059, 15059, 15061, 15065, 15062, 15061, 15061, 15064, 15061, 15059, 15061, 15065, 15062, 15061, 15064, 15068, 15066, 15067, 15069, 15073, 15070, 15069, 15070, 15072, 15069, 15068, 15069, 15073, 15070, 15070, 15072, 15076, 15075, 15075, 15077, 15081, 15078, 15077, 15078, 15080, 15077, 15076, 15078, 15081, 15079, 15078, 15080, 15084, 15083, 15083, 15085, 15089, 15086, 15084, 15085, 15087, 15084, 15082, 15084, 15087, 15084, 15083, 15085, 15089, 15087, 15087, 15089, 15093, 15090, 15089, 15089, 15092, 15089, 15087, 15089, 15093, 15090, 15089, 15092, 15096, 15094, 15095, 15097, 15101, 15098, 15097, 15098, 15100, 15097, 15096, 15097, 15101, 15098, 15098, 15100, 15104, 15103, 15103, 15105, 15109, 15106, 15105, 15106, 15108, 15105, 15104, 15106, 15109, 15107, 15106, 15108, 15112, 15111, 15111, 15113, 15117, 15114, 15112, 15113, 15115, 15112, 15110, 15112, 15115, 15112, 15111, 15113, 15117, 15115, 15115, 15117, 15121, 15118, 15117, 15117, 15120, 15116, 15115, 15117, 15120, 15118, 15117, 15120, 15124, 15122, 15123, 15125, 15129, 15126, 15125, 15126, 15128, 15125, 15124, 15125, 15129, 15126, 15126, 15128, 15132, 15131, 15131, 15133, 15137, 15134, 15133, 15133, 15136, 15133, 15132, 15133, 15137, 15134, 15134, 15136, 15140, 15138, 15139, 15141, 15145, 15142, 15141, 15142, 15144, 15141, 15140, 15142, 15145, 15143, 15142, 15144, 15148, 15147, 15147, 15149, 15153, 15150, 15148, 15149, 15151, 15148, 15146, 15148, 15151, 15148, 15147, 15149, 15153, 15151, 15151, 15153, 15157, 15154, 15153, 15153, 15156, 15152, 15151, 15153, 15156, 15154, 15153, 15156, 15160, 15158, 15159, 15161, 15165, 15162, 15161, 15162, 15164, 15161, 15160, 15161, 15165, 15162, 15162, 15164, 15168, 15167, 15167, 15169, 15173, 15170, 15169, 15169, 15172, 15169, 15168, 15169, 15173, 15170, 15170, 15172, 15176, 15174, 15175, 15177, 15181, 15178, 15177, 15178, 15180, 15177, 15176, 15178, 15181, 15179, 15178, 15180, 15184, 15183, 15183, 15185, 15189, 15186, 15184, 15185, 15187, 15184, 15182, 15184, 15187, 15184, 15183, 15185, 15189, 15187, 15187, 15189, 15193, 15190, 15189, 15189, 15192, 15188, 15187, 15189, 15192, 15190, 15189, 15192, 15196, 15194, 15195, 15197, 15201, 15198, 15197, 15198, 15200, 15197, 15196, 15197, 15201, 15198, 15198, 15200, 15204, 15203, 15203, 15205, 15209, 15206, 15205, 15205, 15208, 15205, 15204, 15205, 15209, 15206, 15206, 15208, 15212, 15210, 15211, 15213, 15217, 15214, 15213, 15214, 15216, 15213, 15212, 15214, 15217, 15215, 15214, 15216, 15220, 15219, 15219, 15221, 15225, 15222, 15220, 15221, 15223, 15220, 15218, 15220, 15223, 15220, 15219, 15221, 15225, 15223, 15223, 15225, 15229, 15226, 15225, 15225, 15228, 15224, 15223, 15225, 15228, 15226, 15225, 15228, 15232, 15230, 15231, 15233, 15237, 15234, 15233, 15234, 15236, 15233, 15232, 15233, 15237, 15234, 15234, 15236, 15240, 15239, 15239, 15241, 15245, 15242, 15241, 15241, 15244, 15241, 15240, 15241, 15245, 15242, 15242, 15244, 15248, 15246, 15247, 15249, 15253, 15250, 15249, 15250, 15252, 15249, 15248, 15250, 15253, 15251, 15250, 15252, 15256, 15255, 15255, 15257, 15261, 15258, 15256, 15257, 15259, 15256, 15254, 15256, 15259, 15256, 15255, 15257, 15261, 15259, 15259, 15261, 15265, 15262, 15260, 15261, 15264, 15260, 15259, 15261, 15264, 15262, 15261, 15263, 15268, 15266, 15267, 15269, 15273, 15270, 15269, 15270, 15272, 15269, 15268, 15269, 15273, 15270, 15270, 15272, 15276, 15275, 15275, 15277, 15281, 15278, 15277, 15277, 15280, 15277, 15276, 15277, 15281, 15278, 15278, 15280, 15284, 15282, 15283, 15285, 15289, 15286, 15285, 15285, 15288, 15285, 15284, 15285, 15289, 15286, 15286, 15288, 15292, 15290, 15291, 15293, 15297, 15294, 15293, 15294, 15296, 15293, 15292, 15294, 15297, 15295, 15294, 15296, 15300, 15299, 15299, 15301, 15305, 15302, 15300, 15301, 15303, 15300, 15298, 15299, 15303, 15300, 15299, 15301, 15305, 15303, 15303, 15305, 15309, 15306, 15304, 15305, 15308, 15304, 15303, 15305, 15308, 15306, 15305, 15307, 15312, 15310, 15311, 15313, 15317, 15314, 15313, 15314, 15316, 15313, 15312, 15313, 15317, 15314, 15314, 15316, 15320, 15319, 15319, 15321, 15325, 15322, 15321, 15321, 15324, 15321, 15319, 15321, 15325, 15322, 15321, 15324, 15328, 15326, 15327, 15329, 15333, 15330, 15329, 15330, 15332, 15329, 15328, 15330, 15333, 15331, 15330, 15332, 15336, 15335, 15335, 15337, 15341, 15338, 15336, 15337, 15339, 15336, 15334, 15335, 15339, 15336, 15335, 15337, 15341, 15339, 15339, 15341, 15345, 15342, 15340, 15341, 15344, 15340, 15339, 15341, 15344, 15342, 15341, 15343, 15348, 15346, 15347, 15349, 15353, 15350, 15349, 15350, 15352, 15349, 15348, 15349, 15353, 15350, 15350, 15352, 15356, 15355, 15355, 15357, 15361, 15358, 15357, 15357, 15360, 15357, 15355, 15357, 15361, 15358, 15357, 15360, 15364, 15362, 15363, 15365, 15369, 15366, 15365, 15366, 15368, 15365, 15364, 15366, 15369, 15367, 15366, 15368, 15372, 15371, 15371, 15373, 15377, 15374, 15372, 15373, 15375, 15372, 15370, 15371, 15375, 15372, 15371, 15373, 15377, 15375, 15375, 15377, 15381, 15378, 15376, 15377, 15380, 15376, 15375, 15377, 15380, 15378, 15377, 15379, 15384, 15382, 15382, 15385, 15389, 15386, 15385, 15386, 15388, 15385, 15384, 15386, 15389, 15387, 15386, 15388, 15392, 15391, 15391, 15393, 15397, 15394, 15392, 15393, 15395, 15392, 15390, 15391, 15395, 15392, 15391, 15393, 15397, 15395, 15395, 15397, 15401, 15398, 15396, 15397, 15400, 15396, 15395, 15397, 15400, 15398, 15397, 15399, 15404, 15402, 15403, 15405, 15409, 15406, 15405, 15406, 15408, 15405, 15404, 15405, 15409, 15406, 15406, 15408, 15412, 15410, 15411, 15413, 15417, 15414, 15413, 15413, 15416, 15413, 15411, 15413, 15417, 15414, 15413, 15416, 15420, 15418, 15419, 15421, 15425, 15422, 15421, 15422, 15424, 15421, 15420, 15422, 15425, 15423, 15422, 15424, 15428, 15427, 15427, 15429, 15433, 15430, 15428, 15429, 15431, 15428, 15426, 15427, 15431, 15428, 15427, 15429, 15433, 15431, 15431, 15433, 15437, 15434, 15432, 15433, 15436, 15432, 15431, 15433, 15436, 15434, 15433, 15435, 15440, 15438, 15439, 15441, 15445, 15442, 15441, 15441, 15444, 15441, 15440, 15441, 15445, 15442, 15442, 15444, 15448, 15446, 15447, 15449, 15453, 15450, 15449, 15449, 15452, 15449, 15447, 15449, 15453, 15450, 15449, 15452, 15456, 15454, 15455, 15457, 15461, 15458, 15457, 15458, 15460, 15457, 15456, 15458, 15461, 15459, 15458, 15460, 15464, 15463, 15463, 15465, 15469, 15466, 15464, 15465, 15467, 15464, 15462, 15463, 15467, 15464, 15463, 15465, 15469, 15467, 15467, 15469, 15473, 15470, 15468, 15469, 15472, 15468, 15467, 15469, 15472, 15470, 15469, 15471, 15476, 15474, 15475, 15477, 15481, 15478, 15477, 15477, 15480, 15477, 15476, 15477, 15481, 15478, 15478, 15480, 15484, 15482, 15483, 15485, 15489, 15486, 15485, 15486, 15488, 15485, 15484, 15485, 15489, 15487, 15486, 15488, 15492, 15491, 15491, 15493, 15497, 15494, 15492, 15493, 15495, 15492, 15490, 15491, 15495, 15492, 15491, 15493, 15497, 15495, 15495, 15497, 15501, 15498, 15496, 15497, 15500, 15496, 15495, 15497, 15500, 15498, 15497, 15499, 15504, 15502, 15502, 15505, 15509, 15506, 15505, 15505, 15508, 15505, 15504, 15505, 15509, 15506, 15506, 15508, 15512, 15510, 15511, 15513, 15517, 15514, 15513, 15513, 15516, 15513, 15511, 15513, 15517, 15514, 15513, 15516, 15520, 15518, 15519, 15521, 15525, 15522, 15521, 15522, 15524, 15521, 15520, 15521, 15525, 15523, 15522, 15524, 15528, 15527, 15527, 15529, 15533, 15530, 15528, 15529, 15531, 15527, 15526, 15527, 15531, 15528, 15527, 15529, 15533, 15531, 15531, 15533, 15537, 15534, 15532, 15533, 15536, 15533, 15531, 15533, 15537, 15534, 15534, 15536, 15540, 15538, 15539, 15541, 15545, 15542, 15540, 15541, 15543, 15540, 15538, 15539, 15543, 15540, 15539, 15541, 15545, 15543, 15543, 15545, 15549, 15546, 15544, 15545, 15548, 15544, 15543, 15545, 15548, 15546, 15545, 15547, 15552, 15550, 15550, 15553, 15557, 15554, 15553, 15553, 15556, 15553, 15551, 15553, 15557, 15554, 15553, 15556, 15560, 15558, 15559, 15561, 15565, 15562, 15561, 15561, 15564, 15561, 15560, 15561, 15565, 15562, 15562, 15564, 15568, 15567, 15567, 15569, 15573, 15570, 15568, 15569, 15571, 15567, 15566, 15567, 15571, 15568, 15567, 15569, 15573, 15571, 15571, 15573, 15577, 15574, 15572, 15573, 15576, 15572, 15571, 15573, 15576, 15574, 15573, 15575, 15580, 15578, 15578, 15581, 15585, 15582, 15581, 15581, 15584, 15581, 15579, 15581, 15585, 15582, 15581, 15584, 15588, 15586, 15587, 15589, 15593, 15590, 15589, 15589, 15592, 15589, 15588, 15589, 15593, 15590, 15590, 15592, 15596, 15595, 15595, 15597, 15601, 15598, 15596, 15597, 15599, 15595, 15594, 15595, 15599, 15596, 15595, 15597, 15601, 15599, 15599, 15601, 15605, 15602, 15600, 15601, 15604, 15601, 15599, 15601, 15605, 15602, 15601, 15604, 15608, 15606, 15607, 15609, 15613, 15610, 15608, 15609, 15611, 15608, 15606, 15607, 15611, 15608, 15607, 15609, 15613, 15611, 15611, 15613, 15617, 15614, 15612, 15613, 15616, 15612, 15611, 15613, 15616, 15614, 15613, 15615, 15620, 15618, 15618, 15621, 15625, 15622, 15621, 15621, 15624, 15621, 15619, 15621, 15625, 15622, 15621, 15624, 15628, 15626, 15627, 15629, 15633, 15630, 15629, 15629, 15632, 15629, 15628, 15629, 15633, 15630, 15630, 15632, 15636, 15635, 15635, 15637, 15641, 15638, 15636, 15637, 15639, 15635, 15634, 15635, 15639, 15636, 15635, 15637, 15641, 15639, 15639, 15641, 15645, 15642, 15640, 15641, 15644, 15640, 15639, 15641, 15644, 15642, 15641, 15643, 15648, 15646, 15646, 15649, 15653, 15650, 15649, 15649, 15652, 15649, 15647, 15649, 15653, 15650, 15649, 15652, 15656, 15654, 15654, 15657, 15661, 15658, 15657, 15657, 15660, 15657, 15656, 15657, 15661, 15658, 15658, 15660, 15664, 15663, 15663, 15665, 15669, 15666, 15664, 15665, 15667, 15663, 15662, 15663, 15667, 15664, 15663, 15665, 15669, 15667, 15667, 15669, 15673, 15670, 15668, 15669, 15672, 15668, 15667, 15669, 15673, 15670, 15669, 15672, 15676, 15674, 15675, 15677, 15681, 15678, 15676, 15677, 15679, 15676, 15674, 15675, 15679, 15676, 15675, 15677, 15681, 15679, 15679, 15681, 15685, 15682, 15680, 15681, 15684, 15680, 15679, 15681, 15684, 15682, 15681, 15683, 15688, 15686, 15686, 15689, 15693, 15690, 15689, 15689, 15692, 15689, 15687, 15689, 15693, 15690, 15689, 15692, 15696, 15694, 15694, 15697, 15701, 15698, 15697, 15697, 15700, 15697, 15696, 15697, 15701, 15698, 15698, 15700, 15704, 15703, 15703, 15705, 15709, 15706, 15704, 15705, 15707, 15703, 15702, 15703, 15707, 15704, 15703, 15705, 15709, 15707, 15707, 15709, 15713, 15710, 15708, 15709, 15712, 15708, 15707, 15709, 15712, 15710, 15709, 15711, 15716, 15714, 15714, 15717, 15721, 15718, 15717, 15717, 15720, 15717, 15715, 15717, 15721, 15718, 15717, 15720, 15724, 15722, 15722, 15725, 15729, 15726, 15725, 15725, 15728, 15725, 15724, 15725, 15729, 15726, 15726, 15728, 15732, 15731, 15731, 15733, 15737, 15734, 15732, 15733, 15735, 15731, 15730, 15731, 15734, 15732, 15731, 15733, 15737, 15735, 15735, 15737, 15741, 15738, 15736, 15737, 15740, 15736, 15735, 15737, 15741, 15738, 15737, 15740, 15744, 15742, 15743, 15745, 15749, 15746, 15744, 15745, 15747, 15743, 15742, 15743, 15747, 15744, 15743, 15745, 15749, 15747, 15747, 15749, 15753, 15750, 15748, 15749, 15751, 15748, 15747, 15748, 15752, 15749, 15749, 15751, 15756, 15754, 15754, 15757, 15761, 15758, 15757, 15757, 15760, 15757, 15755, 15757, 15761, 15758, 15757, 15759, 15764, 15762, 15762, 15765, 15769, 15766, 15765, 15765, 15768, 15765, 15764, 15765, 15769, 15766, 15766, 15768, 15772, 15771, 15771, 15773, 15777, 15774, 15772, 15773, 15775, 15771, 15770, 15771, 15775, 15772, 15771, 15773, 15777, 15775, 15775, 15777, 15781, 15778, 15776, 15777, 15779, 15776, 15775, 15776, 15780, 15777, 15777, 15779, 15784, 15782, 15782, 15785, 15789, 15786, 15784, 15785, 15788, 15785, 15783, 15785, 15789, 15786, 15785, 15787, 15792, 15790, 15790, 15793, 15797, 15794, 15793, 15793, 15796, 15793, 15792, 15793, 15797, 15794, 15794, 15796, 15800, 15799, 15799, 15801, 15805, 15802, 15800, 15800, 15803, 15799, 15798, 15799, 15802, 15799, 15799, 15801, 15805, 15803, 15803, 15805, 15809, 15806, 15804, 15805, 15808, 15804, 15803, 15805, 15809, 15806, 15805, 15808, 15812, 15810, 15811, 15813, 15817, 15814, 15812, 15813, 15815, 15811, 15810, 15811, 15815, 15812, 15811, 15813, 15817, 15815, 15815, 15817, 15821, 15818, 15816, 15817, 15819, 15816, 15815, 15816, 15820, 15817, 15817, 15819, 15823, 15822, 15822, 15825, 15829, 15826, 15825, 15825, 15828, 15825, 15824, 15825, 15829, 15826, 15826, 15828, 15832, 15831, 15831, 15833, 15837, 15834, 15832, 15832, 15835, 15831, 15830, 15831, 15834, 15831, 15831, 15832, 15837, 15835, 15835, 15837, 15841, 15838, 15836, 15837, 15840, 15836, 15835, 15837, 15841, 15838, 15837, 15840, 15844, 15842, 15843, 15845, 15849, 15846, 15844, 15845, 15847, 15843, 15842, 15843, 15847, 15844, 15843, 15845, 15849, 15847, 15847, 15849, 15853, 15850, 15848, 15849, 15851, 15848, 15847, 15848, 15852, 15849, 15849, 15851, 15856, 15854, 15854, 15857, 15861, 15858, 15856, 15857, 15860, 15856, 15855, 15857, 15861, 15858, 15857, 15859, 15864, 15862, 15862, 15865, 15869, 15866, 15865, 15865, 15868, 15865, 15864, 15865, 15869, 15866, 15866, 15868, 15872, 15870, 15871, 15873, 15877, 15874, 15872, 15873, 15875, 15871, 15870, 15871, 15875, 15872, 15871, 15873, 15877, 15875, 15875, 15877, 15881, 15878, 15876, 15877, 15879, 15876, 15875, 15876, 15880, 15877, 15877, 15879, 15884, 15882, 15882, 15885, 15889, 15886, 15884, 15885, 15888, 15884, 15883, 15885, 15889, 15886, 15885, 15887, 15892, 15890, 15890, 15893, 15897, 15894, 15893, 15893, 15896, 15893, 15892, 15893, 15897, 15894, 15894, 15896, 15900, 15898, 15899, 15901, 15905, 15902, 15900, 15900, 15903, 15899, 15898, 15899, 15902, 15899, 15899, 15900, 15905, 15903, 15903, 15905, 15909, 15906, 15904, 15905, 15908, 15904, 15903, 15905, 15909, 15906, 15905, 15908, 15912, 15910, 15911, 15913, 15917, 15914, 15912, 15913, 15915, 15911, 15910, 15911, 15915, 15912, 15911, 15913, 15917, 15915, 15915, 15917, 15921, 15918, 15916, 15917, 15919, 15916, 15915, 15916, 15920, 15917, 15917, 15919, 15924, 15922, 15922, 15925, 15929, 15926, 15924, 15925, 15928, 15925, 15923, 15925, 15929, 15926, 15925, 15928, 15932, 15930, 15930, 15933, 15937, 15934, 15932, 15933, 15936, 15932, 15931, 15933, 15936, 15934, 15933, 15935, 15940, 15938, 15938, 15941, 15945, 15942, 15941, 15941, 15944, 15941, 15940, 15941, 15945, 15942, 15942, 15944, 15948, 15946, 15947, 15949, 15953, 15950, 15948, 15948, 15951, 15947, 15946, 15947, 15950, 15947, 15946, 15948, 15953, 15951, 15951, 15953, 15957, 15954, 15952, 15953, 15956, 15952, 15951, 15953, 15957, 15954, 15953, 15955, 15960, 15958, 15958, 15961, 15965, 15962, 15960, 15961, 15963, 15959, 15958, 15959, 15963, 15960, 15959, 15961, 15965, 15963, 15963, 15965, 15969, 15966, 15964, 15965, 15967, 15964, 15963, 15964, 15968, 15965, 15965, 15967, 15972, 15970, 15970, 15973, 15977, 15974, 15972, 15973, 15976, 15972, 15971, 15973, 15976, 15974, 15973, 15975, 15980, 15978, 15978, 15981, 15985, 15982, 15980, 15981, 15984, 15981, 15980, 15981, 15985, 15982, 15982, 15984, 15988, 15986, 15987, 15989, 15993, 15990, 15988, 15988, 15991, 15987, 15986, 15987, 15990, 15987, 15987, 15989, 15993, 15991, 15991, 15993, 15997, 15994, 15992, 15993, 15995, 15992, 15991, 15992, 15996, 15993, 15993, 15995, 16000, 15998, 15998, 16001, 16005, 16002, 16000, 16001, 16004, 16000, 15999, 16001, 16004, 16002, 16001, 16003, 16008, 16006, 16006, 16009, 16013, 16010, 16008, 16009, 16012, 16009, 16008, 16009, 16013, 16010, 16010, 16012, 16016, 16014, 16015, 16017, 16021, 16018, 16016, 16016, 16019, 16015, 16014, 16015, 16018, 16015, 16014, 16016, 16021, 16019, 16019, 16021, 16025, 16022, 16020, 16021, 16024, 16020, 16019, 16021, 16024, 16022, 16021, 16023, 16028, 16026, 16026, 16029, 16033, 16030, 16028, 16029, 16031, 16027, 16026, 16027, 16031, 16028, 16027, 16029, 16033, 16031, 16031, 16033, 16037, 16034, 16032, 16033, 16035, 16032, 16031, 16032, 16036, 16033, 16033, 16035, 16039, 16038, 16038, 16041, 16045, 16042, 16040, 16041, 16044, 16040, 16039, 16041, 16044, 16042, 16041, 16043, 16048, 16046, 16046, 16049, 16053, 16050, 16048, 16049, 16052, 16049, 16047, 16049, 16053, 16050, 16050, 16052, 16056, 16054, 16055, 16057, 16061, 16058, 16056, 16056, 16059, 16055, 16054, 16055, 16058, 16055, 16054, 16056, 16061, 16059, 16059, 16061, 16065, 16062, 16060, 16061, 16064, 16060, 16059, 16061, 16064, 16062, 16061, 16063, 16068, 16066, 16066, 16069, 16073, 16070, 16068, 16069, 16071, 16067, 16066, 16067, 16071, 16068, 16067, 16069, 16073, 16071, 16071, 16073, 16077, 16074, 16072, 16073, 16075, 16072, 16071, 16072, 16076, 16073, 16073, 16075, 16079, 16078, 16078, 16081, 16085, 16082, 16080, 16081, 16084, 16080, 16079, 16081, 16085, 16082, 16081, 16083, 16088, 16086, 16086, 16089, 16093, 16090, 16088, 16089, 16092, 16088, 16087, 16089, 16092, 16090, 16089, 16091, 16096, 16094, 16094, 16097, 16101, 16098, 16096, 16097, 16100, 16097, 16095, 16097, 16101, 16098, 16098, 16100, 16104, 16102, 16103, 16105, 16109, 16106, 16104, 16104, 16107, 16103, 16101, 16103, 16106, 16103, 16102, 16104, 16109, 16107, 16107, 16109, 16113, 16110, 16108, 16109, 16112, 16108, 16107, 16109, 16112, 16110, 16109, 16111, 16116, 16114, 16114, 16117, 16121, 16118, 16116, 16116, 16119, 16115, 16114, 16115, 16119, 16116, 16115, 16117, 16121, 16119, 16119, 16121, 16125, 16122, 16120, 16121, 16123, 16120, 16119, 16120, 16124, 16121, 16121, 16123, 16127, 16126, 16126, 16129, 16133, 16130, 16128, 16129, 16132, 16128, 16127, 16129, 16132, 16130, 16129, 16131, 16136, 16134, 16134, 16137, 16141, 16138, 16136, 16137, 16140, 16137, 16135, 16137, 16141, 16138, 16137, 16140, 16144, 16142, 16143, 16145, 16149, 16146, 16144, 16144, 16147, 16143, 16141, 16143, 16146, 16143, 16142, 16144, 16149, 16147, 16147, 16149, 16153, 16150, 16148, 16149, 16152, 16148, 16147, 16149, 16152, 16150, 16149, 16151, 16156, 16154, 16154, 16157, 16161, 16158, 16156, 16156, 16159, 16155, 16154, 16155, 16159, 16155, 16155, 16157, 16161, 16159, 16159, 16161, 16165, 16162, 16160, 16161, 16163, 16160, 16159, 16160, 16164, 16161, 16161, 16163, 16167, 16166, 16166, 16169, 16173, 16170, 16168, 16169, 16172, 16168, 16167, 16169, 16173, 16170, 16169, 16171, 16176, 16174, 16174, 16177, 16181, 16178, 16176, 16177, 16180, 16176, 16175, 16176, 16180, 16177, 16177, 16179, 16184, 16182, 16182, 16185, 16189, 16186, 16184, 16185, 16188, 16185, 16183, 16185, 16189, 16186, 16185, 16188, 16192, 16190, 16191, 16193, 16197, 16194, 16192, 16192, 16195, 16191, 16189, 16191, 16194, 16191, 16190, 16192, 16196, 16195, 16195, 16197, 16201, 16198, 16196, 16197, 16200, 16196, 16195, 16197, 16200, 16198, 16197, 16199, 16204, 16202, 16202, 16205, 16209, 16206, 16204, 16204, 16207, 16203, 16202, 16203, 16207, 16203, 16203, 16204, 16209, 16207, 16207, 16209, 16213, 16210, 16208, 16209, 16211, 16208, 16207, 16208, 16212, 16209, 16209, 16211, 16215, 16214, 16214, 16217, 16221, 16218, 16216, 16217, 16220, 16216, 16215, 16217, 16220, 16218, 16217, 16219, 16224, 16222, 16222, 16225, 16229, 16226, 16224, 16225, 16228, 16225, 16223, 16225, 16229, 16226, 16225, 16228, 16232, 16230, 16230, 16233, 16237, 16234, 16232, 16232, 16235, 16231, 16229, 16231, 16234, 16231, 16230, 16232, 16236, 16235, 16235, 16237, 16241, 16238, 16236, 16237, 16240, 16236, 16235, 16237, 16240, 16238, 16237, 16239, 16244, 16242, 16242, 16245, 16249, 16246, 16244, 16244, 16247, 16243, 16242, 16243, 16247, 16243, 16243, 16244, 16249, 16247, 16247, 16249, 16253, 16250, 16248, 16249, 16251, 16248, 16246, 16248, 16252, 16249, 16249, 16251, 16255, 16254, 16254, 16257, 16261, 16258, 16256, 16257, 16260, 16256, 16255, 16257, 16261, 16258, 16257, 16259, 16264, 16262, 16262, 16265, 16269, 16266, 16264, 16265, 16268, 16264, 16263, 16264, 16268, 16265, 16265, 16267, 16272, 16270, 16270, 16273, 16277, 16274, 16272, 16273, 16276, 16273, 16271, 16273, 16277, 16274, 16273, 16276, 16280, 16278, 16278, 16281, 16285, 16282, 16280, 16280, 16283, 16279, 16277, 16279, 16282, 16279, 16278, 16280, 16284, 16282, 16283, 16285, 16289, 16286, 16284, 16285, 16288, 16284, 16283, 16285, 16288, 16286, 16285, 16287, 16292, 16290, 16290, 16293, 16297, 16294, 16292, 16292, 16295, 16291, 16290, 16291, 16294, 16291, 16290, 16292, 16297, 16295, 16295, 16297, 16301, 16298, 16296, 16297, 16299, 16296, 16294, 16296, 16300, 16297, 16297, 16299, 16303, 16302, 16302, 16305, 16309, 16306, 16304, 16305, 16308, 16304, 16303, 16305, 16308, 16306, 16305, 16307, 16312, 16310, 16310, 16313, 16317, 16314, 16312, 16313, 16316, 16312, 16311, 16313, 16317, 16314, 16313, 16316, 16320, 16318, 16318, 16321, 16325, 16322, 16320, 16320, 16323, 16319, 16317, 16319, 16322, 16319, 16318, 16320, 16324, 16322, 16322, 16325, 16329, 16326, 16324, 16325, 16328, 16324, 16323, 16324, 16328, 16326, 16325, 16327, 16332, 16330, 16330, 16333, 16337, 16334, 16332, 16332, 16335, 16331, 16330, 16331, 16334, 16331, 16330, 16332, 16337, 16335, 16335, 16337, 16341, 16338, 16336, 16337, 16339, 16336, 16334, 16336, 16340, 16337, 16336, 16339, 16343, 16342, 16342, 16345, 16349, 16346, 16344, 16345, 16348, 16344, 16343, 16345, 16349, 16346, 16345, 16347, 16352, 16350, 16350, 16353, 16357, 16354, 16352, 16353, 16355, 16352, 16351, 16352, 16356, 16353, 16353, 16355, 16359, 16358, 16358, 16361, 16365, 16362, 16360, 16361, 16364, 16361, 16360, 16362, 16366, 16363, 16363, 16366, 16370, 16369, 16369, 16372, 16377, 16374, 16373, 16374, 16377, 16374, 16373, 16375, 16379, 16376, 16376, 16379, 16383, 16381, 16381, 16383] + is_save: false auto_exposure: - isEnable: True - isDebug: True + is_enable: true + is_debug: true center_illuminance: 90 - histogram_skewness: 0.75 + histogram_skewness: 0.9 + color_space_conversion: - isEnable: True + conv_standard: 2 # Bt.709 HD = 1 # Bt.601/4407 = 2 - conv_standard: 1 - # analog = 1 - # digital = 2 - conv_type: 2 + is_save: false + ldci: - isEnable: True + is_enable: false clip_limit: 1 wind: 16 + is_save: false sharpen: - isEnable: False - + is_enable: true + sharpen_sigma: 5 + sharpen_strength: 1 + is_save: false 2d_noise_reduction: - isEnable: True + is_enable: false + # nlm window_size: 21 - patch_size: 5 - h: 15 + patch_size: 9 + wts: 10 + is_save: false +rgb_conversion: + is_enable: true + is_save: false + scale: - isEnable: False - isDebug: True + is_enable: false + is_debug: true new_width: 1920 new_height: 1080 - isHardware: True + is_hardware: true # Nearest_Neighbor # Bilinear - Algo: "Nearest_Neighbor" + algorithm: "Nearest_Neighbor" upscale_method: "Nearest_Neighbor" downscale_method: "Bilinear" + is_save: false yuv_conversion_format: # The conversion wont run if csc is false - isEnable: False + is_enable: false conv_type: '444' + is_save: false -pre_gamma: - isEnable: False - -tone_mapping: - isEnable: False - -jpeg_conversion: - isEnable: False diff --git a/docs/Algorithm Description Document v1.1.pdf b/docs/Algorithm Description Document v1.1.pdf new file mode 100644 index 0000000..518d7a9 Binary files /dev/null and b/docs/Algorithm Description Document v1.1.pdf differ diff --git a/docs/CONTRIBUTIONS.md b/docs/CONTRIBUTIONS.md new file mode 100644 index 0000000..14b6e69 --- /dev/null +++ b/docs/CONTRIBUTIONS.md @@ -0,0 +1,140 @@ +# Contributing to Infinite-ISP +Infinite-ISP has an "open innovation" approach, which welcomes anyone with the right skills, time, and interest to contribute generously to executing the ISP framework from the software to the hardware level. It is a community-driven project so you can contribute whether it is: + +- Adding algorithms or code to add features or improvements in the pipeline + +- Reporting a bug/issue +- Fix a bug +- Discussing the current state of the code +- Reviewing other developers' pull requests +- Improve documentation + +## How to Contribute? +If you want to contribute to the project, we recommend you see the repo issues first and find the one that interests you. The pull request process is what we follow to merge any contributions, including bug fixes, new code or algorithm, new tutorials, document amendments, etc. To get started, the following steps must be taken. + +1. Install Git and set up your GitHub account. + +2. Fork the infinite-isp repo and check [issues](https://github.com/10xEngineersTech/Infinite-ISP_ReferenceModel/issues) to get started. +3. Create a feature branch from the `main` branch to make changes after choosing a task. +4. See the code guidelines to write your code. +5. Run the test cases to ensure the implemented code runs fine on your local system. +6. Make sure your code lints. +7. Review the pull request process before sending the pull request. + +## Bug Report or Feature Request + +While contributing to our pipeline, we recommend investigating the repo [issues](https://github.com/10xEngineersTech/Infinite-ISP_ReferenceModel/issues) first. For this, you are welcome to open an issue on finding any kind of bug or to request a feature inclusion. Just be sure it doesn’t comply with any existing problems or pull requests before sending an issue or new feature request. + +While reporting a bug, ensure it includes all the relevant information, like code snippets, estimators, functions, exceptions, etc., so anyone can reproduce the bug. + +If you want to add a new algorithm or request a new feature to the pipeline, you have to look for the following points: + +1. Techniques that will provide a clear-cut improvement in image quality, code efficiency, or optimization will be considered for inclusion. + +2. Algorithms should be computationally less expensive. + +3. No compromise on quality benchmarks. + +## Pull Request Process +### PR Submission: + +The pull request process for infinite-isp is purely based on merit. For making a good PR, one should read the following guidelines: +1. After setting up the feature branch and adding your code to it, you must ensure it runs perfectly on your system without showing any bugs. + +2. Ensure you have followed the coding guidelines while implementing the algorithm. +3. Your PR should represent one issue at a time. You should have created a distinct feature branch with a separate pull request for each bug or feature request. +4. Squash all the unwanted commits before submitting the PR. +5. Add all the necessary information, like titles, meaningful variable names, comments explaining code lines, eloquent commit status, and relevant documentation. +6. Add running tests and performance tests for the code before sending PR. +7. Avoid adding unnecessary datasets while sending PR. If you want to contribute quality datasets to the project, please generate a separate PR +8. Make sure the modified python files lints. We have implemented code checks for linting through Github Actions and Branch Protection Rules which means we cannot merge code into `main` if there are linting errors. + +### PR Review and Merging + +Two core developers are responsible for a PR review process. For a successful merger, it should be first approved by them. After carefully analyzing and considering the coding requirements, pertinent documentation, and quality assessments, they execute the validation and performance tests. + +Then, if needed, you need to modify the code in response to the review you receive for your pull request. You must still change your branch by adding a new commit for this scenario. Push this commit to GitHub, and the pull request will be automatically updated. + +## Coding Styles +We follow PEP 8 – style guide for python code as we develop this soft ISP in python. The code should be well-commented, organized, and legible. + +### File Structure +Keep in mind the following norms while implementing the code. +- The modules folder should contain a separate python file for each new feature or functionality not currently in the pipeline. + +- A new function should be introduced to the same class for any feature enhancement or updated algorithms for the same modules. +- The helper functions should be put in the utils.py file. +- Follow the same coding pattern (PEP-8) in the modules files to prevent messy formatting or indentation. +- All the file names are written in lowercase for better compatibility. +- The algorithms implementations should be put in modules/, and their interfaces should be put in isp_pipeline.py. +- The relevant parameters should be updated in the config/ file. +- Documentation is written in .pdf files, including all the references, images, and flowcharts, and should be put into infinite-isp/docs/. +- Only English (ASCII) text is allowed for comment and explanation. No other language is allowed to use. +### Naming convention +- All the file names should be written in lowercase. + +- All the class names should start with a capital letter, e.g., AutoWhiteBalance. +- All the variable names should be in lowercase except those named after the author. +- An underscore separates words. +- Try using descriptive variables’ names for better understanding, e.g., start_index, upper_row, red_channel, etc. +Code Commenting +Code comments are an important part of the code for getting an insight into the algorithms, so, + Make sure all the comments are well-defined and comprehendible. + Complete sentences with a period in the end, should be used to clarify the meanings fully. The first letter should be in upper case. To explain any line of code, add an inline comment just before it. Example: + + +```python + # Increment x by 1 + x = x + 1 +``` + +- Keep your code comments short and to the point. Use # for each line to make it easier to read, then format it as a paragraph. + +- Docstrings should be added for public classes explaining what the method does, which is usually a one-liner docstring. +### Functions and Class Interfaces + +- The name of the functions and classes should be descriptive, explaining their purposes. +- All the functions should be well-defined with proper arguments and return values. + +## Code Review Guideline +Here is a checklist to go through while reviewing a code, +1. Evaluate the scope of the code and check its validity. + +2. Check if the code is well written, i.e., following the coding guidelines. +3. Make sure that the code is well-documented with an illustrative explanation. +4. Running the test suite on the code to see if it fits precisely within our standards and quality benchmarks. +5. The code should be readable, clear, and non-redundant. +6. Check its dependencies and compatibility. + +## Code of Conduct + +Since this initiative is community-driven, we expect positive behavior to lead to successful outcomes. We aim to provide a supportive, positive social atmosphere where community members may interact intellectually and exchange interests, skills, and valuable knowledge. +### Our Standards & Responsibilities +This is a civilized public forum where we want to uphold these norms: +1. Be civil and respectful of the topics and the people discussing them, even if you disagree with some of what is being said. + +2. Criticize ideas, not people, so strictly avoid foul language. +3. Provide reasoned counterarguments that improve the conversation. +4. Help us influence the future of this community by choosing to engage in discussions that make this forum an exciting place to be — and avoiding those that do not. +5. When you see bad behavior, don’t reply. It encourages bad conduct by acknowledging it, consumes your energy, and wastes everyone’s time. Just flag it. +6. This is a public forum, and search engines index these discussions. Keep the language, links, and images safe for family and friends. +7. Make the effort to put things in the right place so that we can spend more time discussing and less cleaning up. +8. You may not post anything digital that belongs to someone else without permission. +9. Don’t post spam or otherwise vandalize the forum. Encourage the behavior you want to see in the world. +10. We accept all who wish to participate in our activities, raising an environment where anyone can participate and make a difference. +## Enforcement +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned with this Code of Conduct or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + + + +## License +In short, when you submit code changes, your submissions are understood to be under the same [Apache 2.0 Lisence](../LICENSE) that covers the project. Feel free to contact the maintainers if that's a concern. +License. + +## References +1. https://opensource.com/life/16/3/contributor-guidelines-template-and-tips +2. https://pandas.pydata.org/docs/development/contributing_codebase.html#running-the-performance-test-suite +3. https://scikit-learn.org/stable/developers/contributing.html +4. https://github.com/opencv/opencv/wiki/How_to_contribute +5. https://forum.opencv.org/faq/ +6. https://peps.python.org/pep-0008/#comments diff --git a/docs/infinite_isp_Algo_v1.0.pdf b/docs/infinite_isp_Algo_v1.0.pdf deleted file mode 100644 index f39977c..0000000 Binary files a/docs/infinite_isp_Algo_v1.0.pdf and /dev/null differ diff --git a/modules/2d_noise_reduction.py b/in_frames/normal/data/.gitkeep similarity index 100% rename from modules/2d_noise_reduction.py rename to in_frames/normal/data/.gitkeep diff --git a/in_frames/normal/data/Indoor1_2592x1536_12bit_RGGB-configs.yml b/in_frames/normal/data/Indoor1_2592x1536_12bit_RGGB-configs.yml new file mode 100644 index 0000000..3d0a939 --- /dev/null +++ b/in_frames/normal/data/Indoor1_2592x1536_12bit_RGGB-configs.yml @@ -0,0 +1,184 @@ +platform: + filename: "Indoor1_2592x1536_12bit_RGGB.raw" + disable_progress_bar: false + leave_pbar_string: false + render_3a: false + # npy, png or both + save_format: both + +sensor_info: + bayer_pattern: "rggb" + range: 1023 + bit_depth: 12 + width: 2592 + height: 1536 + +crop: + is_enable: false + is_debug: false + new_width: 1280 + new_height: 720 + is_save: false + +dead_pixel_correction: + is_enable: false + dp_threshold: 80 + is_debug: true + is_save: false + +hdr_stitching: + is_enable: false + +black_level_correction: + is_enable: true + r_offset: 200 + gr_offset: 200 + gb_offset: 200 + b_offset: 200 + is_linear: false + r_sat: 4095 + gr_sat: 4095 + gb_sat: 4095 + b_sat: 4095 + is_save: false + +OECF: + is_enable: false + # Make sure the LUT has the right bit range i.e. if image is of 10 bit LUT should be from [0 - (2^10)-1] + # LUT here does nothing to the sensor response i.e. a value of 800 maps to 800 and 2000 maps to 2000 + r_lut: [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2094,2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,2480,2481,2482,2483,2484,2485,2486,2487,2488,2489,2490,2491,2492,2493,2494,2495,2496,2497,2498,2499,2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559,2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574,2575,2576,2577,2578,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2601,2602,2603,2604,2605,2606,2607,2608,2609,2610,2611,2612,2613,2614,2615,2616,2617,2618,2619,2620,2621,2622,2623,2624,2625,2626,2627,2628,2629,2630,2631,2632,2633,2634,2635,2636,2637,2638,2639,2640,2641,2642,2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658,2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,2691,2692,2693,2694,2695,2696,2697,2698,2699,2700,2701,2702,2703,2704,2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2729,2730,2731,2732,2733,2734,2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,2751,2752,2753,2754,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,2766,2767,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2780,2781,2782,2783,2784,2785,2786,2787,2788,2789,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,2810,2811,2812,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2857,2858,2859,2860,2861,2862,2863,2864,2865,2866,2867,2868,2869,2870,2871,2872,2873,2874,2875,2876,2877,2878,2879,2880,2881,2882,2883,2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,2962,2963,2964,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020,3021,3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069,3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3113,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174,3175,3176,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,3188,3189,3190,3191,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,3278,3279,3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295,3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327,3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343,3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,3388,3389,3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405,3406,3407,3408,3409,3410,3411,3412,3413,3414,3415,3416,3417,3418,3419,3420,3421,3422,3423,3424,3425,3426,3427,3428,3429,3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443,3444,3445,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3456,3457,3458,3459,3460,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,3512,3513,3514,3515,3516,3517,3518,3519,3520,3521,3522,3523,3524,3525,3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541,3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557,3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573,3574,3575,3576,3577,3578,3579,3580,3581,3582,3583,3584,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695,3696,3697,3698,3699,3700,3701,3702,3703,3704,3705,3706,3707,3708,3709,3710,3711,3712,3713,3714,3715,3716,3717,3718,3719,3720,3721,3722,3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744,3745,3746,3747,3748,3749,3750,3751,3752,3753,3754,3755,3756,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,3767,3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,3779,3780,3781,3782,3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3802,3803,3804,3805,3806,3807,3808,3809,3810,3811,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,3822,3823,3824,3825,3826,3827,3828,3829,3830,3831,3832,3833,3834,3835,3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847,3848,3849,3850,3851,3852,3853,3854,3855,3856,3857,3858,3859,3860,3861,3862,3863,3864,3865,3866,3867,3868,3869,3870,3871,3872,3873,3874,3875,3876,3877,3878,3879,3880,3881,3882,3883,3884,3885,3886,3887,3888,3889,3890,3891,3892,3893,3894,3895,3896,3897,3898,3899,3900,3901,3902,3903,3904,3905,3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,3940,3941,3942,3943,3944,3945,3946,3947,3948,3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,3978,3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,3992,3993,3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,4056,4057,4058,4059,4060,4061,4062,4063,4064,4065,4066,4067,4068,4069,4070,4071,4072,4073,4074,4075,4076,4077,4078,4079,4080,4081,4082,4083,4084,4085,4086,4087,4088,4089,4090,4091,4092,4093,4094,4095] + is_save: false + +digital_gain: + is_debug: true + is_auto: true + # Array of pre-define Gains + gain_array: [1, 2, 4, 6, 8, 10, 12, 16, 32, 64] + # Index of default gain + current_gain: 0 + ae_feedback: 0 + is_save: false + +lens_shading_correction: + is_enable: false + is_save: false + +bayer_noise_reduction: + is_enable: true + filter_window: 9 + r_std_dev_s: 1 + r_std_dev_r: 0.1 + g_std_dev_s: 1 + g_std_dev_r: 0.08 + b_std_dev_s: 1 + b_std_dev_r: 0.1 + is_save: false + +auto_white_balance: + is_enable: true + is_debug: true + underexposed_percentage: 5 + overexposed_percentage: 5 + algorithm: "norm_2" + # grey_world, norm_2, pca + percentage: 3.5 # pca + +white_balance: + is_enable: true + # is_auto refers to auto white balance module + is_debug: true + is_auto: true + r_gain: 1.24609375 + b_gain: 2.80859375 + is_save: false + +demosaic: + is_save: false + +color_correction_matrix: + #Row sum to 1 convention + is_enable: true + corrected_red: [ 2.203125, -1.0898, -0.11328 ] + corrected_green: [ -0.29296875, 1.30859375, -0.015625 ] + corrected_blue: [ 0.05859, -0.88671875, 1.828125 ] + is_save: false + +gamma_correction: + is_enable: true + # 8-bit + gamma_lut_8: [0, 5, 9, 13, 17, 22, 25, 29, 33, 37, 40, 44, 47, 50, 54, 57, 60, 63, 66, 69, 72, 75, 78, 80, 83, 85, 88, 90, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113, 115, 117, 118, 120, 122, 123, 125, 126, 128, 129, 131, 132, 134, 135, 136, 138, 139, 140, 141, 142, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 162, 163, 164, 165, 166, 167, 167, 168, 169, 170, 171, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 179, 179, 180, 181, 181, 182, 183, 183, 184, 185, 185, 186, 187, 187, 188, 188, 189, 190, 190, 191, 191, 192, 193, 193, 194, 194, 195, 195, 196, 197, 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 205, 205, 206, 206, 207, 207, 208, 208, 209, 209, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 216, 217, 217, 218, 218, 219, 219, 220, 220, 221, 221, 221, 222, 222, 223, 223, 224, 224, 225, 225, 225, 226, 226, 227, 227, 228, 228, 228, 229, 229, 230, 230, 231, 231, 231, 232, 232, 233, 233, 234, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240, 241, 241, 241, 242, 242, 243, 243, 244, 244, 244, 245, 245, 246, 246, 247, 247, 247, 248, 248, 249, 249, 250, 250, 250, 251, 251, 252, 252, 252, 253, 253, 254, 254, 255] + # 10-bit + gamma_lut_10: [0, 9, 13, 17, 21, 25, 29, 34, 38, 42, 46, 50, 54, 58, 62, 66, 70, 74, 78, 82, 86, 90, 94, 98, 102, 106, 110, 114, 117, 121, 125, 129, 132, 136, 140, 143, 147, 150, 154, 157, 161, 165, 168, 172, 175, 179, 182, 185, 189, 192, 196, 199, 202, 205, 209, 212, 215, 219, 222, 225, 228, 231, 235, 238, 241, 244, 247, 250, 253, 256, 259, 262, 265, 268, 271, 274, 277, 280, 283, 286, 289, 292, 295, 297, 300, 303, 306, 308, 311, 314, 317, 319, 322, 325, 327, 330, 332, 335, 337, 340, 342, 345, 347, 350, 352, 355, 357, 359, 362, 364, 367, 369, 371, 374, 376, 378, 380, 383, 385, 387, 389, 392, 394, 396, 398, 400, 402, 404, 406, 409, 411, 413, 415, 417, 419, 421, 423, 425, 427, 429, 431, 433, 435, 437, 439, 441, 443, 444, 446, 448, 450, 452, 454, 455, 457, 459, 461, 463, 464, 466, 468, 469, 471, 473, 474, 476, 478, 479, 481, 483, 484, 486, 488, 489, 491, 492, 494, 495, 497, 499, 500, 502, 503, 505, 506, 508, 509, 511, 513, 514, 516, 517, 519, 520, 521, 523, 524, 526, 527, 529, 530, 532, 533, 534, 536, 537, 539, 540, 541, 543, 544, 545, 547, 548, 549, 550, 552, 553, 554, 555, 557, 558, 559, 560, 562, 563, 564, 565, 567, 568, 569, 570, 571, 573, 574, 575, 576, 577, 578, 580, 581, 582, 583, 584, 585, 586, 588, 589, 590, 591, 592, 593, 594, 595, 596, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 633, 634, 635, 636, 637, 638, 639, 640, 641, 641, 642, 643, 644, 645, 646, 647, 648, 649, 649, 650, 651, 652, 653, 654, 655, 655, 656, 657, 658, 659, 660, 660, 661, 662, 663, 664, 665, 665, 666, 667, 668, 669, 670, 670, 671, 672, 673, 674, 674, 675, 676, 677, 678, 678, 679, 680, 681, 681, 682, 683, 683, 684, 685, 686, 686, 687, 688, 689, 689, 690, 691, 692, 692, 693, 694, 695, 695, 696, 697, 697, 698, 699, 700, 700, 701, 702, 703, 703, 704, 705, 705, 706, 707, 708, 708, 709, 710, 710, 711, 712, 713, 713, 714, 715, 715, 716, 717, 717, 718, 719, 719, 720, 721, 722, 722, 723, 724, 724, 725, 726, 726, 727, 728, 728, 729, 730, 731, 731, 732, 733, 733, 734, 734, 735, 736, 736, 737, 738, 738, 739, 740, 740, 741, 742, 742, 743, 744, 744, 745, 745, 746, 747, 747, 748, 749, 749, 750, 751, 751, 752, 753, 753, 754, 754, 755, 756, 756, 757, 757, 758, 759, 759, 760, 761, 761, 762, 762, 763, 763, 764, 765, 765, 766, 766, 767, 768, 768, 769, 769, 770, 771, 771, 772, 772, 773, 774, 774, 775, 775, 776, 776, 777, 777, 778, 779, 779, 780, 780, 781, 782, 782, 783, 783, 784, 784, 785, 785, 786, 787, 787, 788, 788, 789, 789, 790, 791, 791, 792, 792, 793, 793, 794, 794, 795, 795, 796, 797, 797, 797, 798, 799, 799, 800, 800, 801, 801, 802, 802, 803, 803, 804, 805, 805, 806, 806, 806, 807, 808, 808, 809, 809, 810, 810, 811, 811, 812, 812, 813, 813, 814, 814, 815, 815, 816, 816, 817, 817, 818, 818, 819, 819, 820, 821, 821, 821, 822, 823, 823, 824, 824, 825, 825, 826, 826, 827, 827, 828, 828, 829, 829, 830, 830, 831, 831, 832, 832, 833, 833, 834, 834, 835, 835, 836, 836, 837, 837, 838, 838, 839, 839, 839, 840, 841, 841, 842, 842, 842, 843, 843, 844, 845, 845, 845, 846, 846, 847, 847, 848, 848, 849, 849, 850, 850, 851, 851, 852, 852, 853, 853, 854, 854, 855, 855, 856, 856, 857, 857, 858, 858, 859, 859, 860, 860, 861, 861, 862, 862, 863, 863, 864, 864, 865, 865, 866, 866, 867, 867, 868, 868, 868, 869, 870, 870, 870, 871, 871, 872, 872, 873, 873, 874, 874, 875, 875, 876, 876, 877, 877, 878, 878, 879, 879, 880, 880, 881, 881, 881, 882, 882, 883, 883, 884, 884, 885, 885, 886, 886, 887, 887, 887, 888, 888, 889, 889, 890, 890, 891, 891, 892, 892, 892, 893, 893, 894, 894, 895, 895, 896, 896, 896, 897, 897, 898, 898, 899, 899, 900, 900, 900, 901, 901, 902, 902, 903, 903, 903, 904, 904, 905, 905, 906, 906, 906, 907, 907, 908, 908, 909, 909, 910, 910, 910, 911, 911, 912, 912, 913, 913, 913, 914, 914, 915, 915, 916, 916, 916, 917, 917, 918, 918, 919, 919, 919, 920, 920, 921, 921, 922, 922, 922, 923, 923, 924, 924, 925, 925, 925, 926, 926, 927, 927, 928, 928, 928, 929, 929, 930, 930, 931, 931, 931, 932, 932, 933, 933, 934, 934, 934, 935, 935, 936, 936, 936, 937, 937, 938, 938, 939, 939, 939, 940, 940, 941, 941, 942, 942, 943, 943, 943, 944, 944, 945, 945, 946, 946, 947, 947, 947, 948, 948, 949, 949, 950, 950, 951, 951, 951, 952, 952, 953, 953, 954, 954, 955, 955, 956, 956, 956, 957, 957, 958, 958, 959, 959, 960, 960, 961, 961, 961, 962, 962, 963, 963, 964, 964, 964, 965, 965, 966, 966, 967, 967, 968, 968, 968, 969, 969, 970, 970, 971, 971, 971, 972, 972, 973, 973, 974, 974, 975, 975, 975, 976, 976, 977, 977, 977, 978, 978, 979, 979, 980, 980, 980, 981, 981, 982, 982, 983, 983, 983, 984, 984, 985, 985, 986, 986, 986, 987, 987, 988, 988, 988, 989, 989, 990, 990, 990, 991, 991, 992, 992, 993, 993, 994, 994, 994, 995, 995, 996, 996, 997, 997, 997, 998, 998, 999, 999, 999, 1000, 1000, 1001, 1001, 1002, 1002, 1002, 1003, 1003, 1004, 1004, 1004, 1005, 1005, 1006, 1006, 1007, 1007, 1007, 1008, 1008, 1009, 1009, 1010, 1010, 1010, 1011, 1011, 1012, 1012, 1013, 1013, 1013, 1014, 1014, 1015, 1015, 1015, 1016, 1016, 1017, 1017, 1018, 1018, 1018, 1019, 1019, 1020, 1020, 1021, 1021, 1021, 1022, 1022, 1023, 1023] + # 12-bit + gamma_lut_12: [0, 11, 21, 30, 37, 42, 46, 50, 53, 57, 61, 65, 70, 74, 78, 82, 86, 90, 94, 98, 102, 106, 110, 114, 118, 122, 126, 131, 135, 139, 143, 147, 151, 155, 159, 163, 167, 171, 175, 179, 183, 187, 191, 195, 199, 203, 207, 212, 216, 220, 224, 228, 232, 236, 240, 245, 249, 253, 257, 261, 265, 269, 273, 277, 281, 285, 289, 293, 297, 301, 305, 309, 313, 317, 321, 326, 330, 334, 338, 342, 346, 350, 354, 358, 362, 365, 369, 373, 377, 381, 385, 390, 394, 398, 401, 405, 409, 413, 417, 421, 425, 429, 432, 436, 440, 443, 447, 451, 455, 458, 462, 466, 470, 473, 477, 481, 485, 488, 492, 496, 500, 503, 507, 511, 515, 519, 522, 526, 530, 533, 537, 540, 544, 547, 551, 555, 559, 562, 566, 569, 573, 576, 580, 584, 588, 591, 595, 598, 602, 605, 609, 612, 616, 619, 622, 626, 630, 633, 637, 641, 645, 648, 652, 655, 659, 662, 665, 669, 673, 676, 680, 683, 687, 690, 693, 696, 700, 703, 707, 711, 715, 718, 721, 724, 728, 731, 734, 738, 742, 745, 749, 752, 756, 759, 762, 765, 769, 772, 775, 779, 783, 786, 789, 792, 796, 799, 802, 805, 809, 812, 815, 818, 822, 825, 828, 832, 836, 839, 842, 845, 849, 852, 855, 858, 862, 865, 868, 871, 875, 878, 881, 884, 888, 890, 893, 896, 900, 903, 906, 910, 914, 917, 920, 923, 926, 929, 932, 935, 939, 942, 945, 948, 952, 954, 957, 960, 964, 967, 970, 973, 977, 979, 982, 985, 989, 992, 995, 998, 1002, 1005, 1007, 1010, 1014, 1016, 1019, 1022, 1026, 1028, 1031, 1034, 1038, 1040, 1043, 1046, 1050, 1052, 1055, 1058, 1062, 1064, 1067, 1070, 1074, 1076, 1079, 1082, 1086, 1088, 1091, 1094, 1098, 1100, 1103, 1106, 1110, 1112, 1115, 1118, 1121, 1123, 1126, 1129, 1133, 1135, 1138, 1141, 1145, 1147, 1150, 1153, 1156, 1158, 1161, 1163, 1167, 1169, 1172, 1175, 1179, 1181, 1184, 1187, 1190, 1192, 1195, 1198, 1201, 1203, 1206, 1209, 1212, 1214, 1217, 1220, 1223, 1225, 1228, 1231, 1234, 1236, 1239, 1242, 1245, 1247, 1250, 1253, 1256, 1258, 1261, 1264, 1267, 1269, 1271, 1274, 1277, 1279, 1282, 1284, 1288, 1290, 1293, 1296, 1299, 1301, 1303, 1306, 1309, 1311, 1314, 1317, 1320, 1322, 1324, 1327, 1330, 1332, 1335, 1338, 1341, 1343, 1345, 1347, 1350, 1352, 1355, 1358, 1360, 1363, 1365, 1367, 1369, 1372, 1375, 1378, 1380, 1383, 1385, 1387, 1389, 1392, 1395, 1397, 1400, 1403, 1405, 1407, 1409, 1412, 1414, 1417, 1419, 1422, 1424, 1427, 1429, 1431, 1434, 1436, 1438, 1441, 1443, 1446, 1448, 1451, 1453, 1456, 1458, 1461, 1463, 1465, 1467, 1469, 1471, 1474, 1476, 1479, 1481, 1484, 1486, 1488, 1491, 1493, 1495, 1497, 1499, 1502, 1504, 1506, 1509, 1511, 1513, 1515, 1518, 1520, 1522, 1524, 1527, 1529, 1531, 1533, 1535, 1538, 1540, 1542, 1544, 1547, 1549, 1551, 1553, 1556, 1558, 1560, 1563, 1565, 1567, 1569, 1571, 1573, 1575, 1577, 1579, 1582, 1584, 1586, 1588, 1590, 1592, 1594, 1596, 1599, 1601, 1603, 1605, 1607, 1609, 1611, 1613, 1616, 1618, 1620, 1622, 1624, 1626, 1628, 1630, 1633, 1635, 1637, 1639, 1641, 1643, 1645, 1647, 1650, 1652, 1654, 1656, 1658, 1660, 1662, 1664, 1666, 1668, 1670, 1672, 1674, 1676, 1678, 1680, 1682, 1684, 1686, 1688, 1691, 1693, 1695, 1697, 1699, 1701, 1703, 1705, 1707, 1709, 1711, 1713, 1715, 1717, 1719, 1721, 1723, 1725, 1727, 1728, 1730, 1732, 1734, 1736, 1738, 1740, 1742, 1744, 1746, 1748, 1750, 1751, 1753, 1755, 1757, 1759, 1761, 1763, 1765, 1767, 1769, 1771, 1773, 1774, 1776, 1778, 1780, 1782, 1784, 1786, 1788, 1789, 1791, 1793, 1795, 1796, 1798, 1800, 1802, 1803, 1805, 1807, 1809, 1811, 1813, 1815, 1817, 1818, 1820, 1822, 1824, 1825, 1827, 1829, 1831, 1832, 1834, 1836, 1838, 1839, 1841, 1843, 1845, 1847, 1849, 1851, 1853, 1854, 1856, 1857, 1858, 1860, 1862, 1864, 1866, 1868, 1870, 1872, 1874, 1875, 1876, 1878, 1880, 1881, 1883, 1885, 1887, 1888, 1890, 1892, 1893, 1895, 1896, 1898, 1900, 1901, 1903, 1905, 1907, 1908, 1910, 1912, 1913, 1915, 1916, 1918, 1920, 1921, 1923, 1925, 1927, 1928, 1930, 1932, 1933, 1935, 1936, 1938, 1940, 1941, 1943, 1945, 1947, 1948, 1949, 1951, 1952, 1954, 1955, 1957, 1959, 1960, 1962, 1964, 1965, 1967, 1968, 1970, 1972, 1973, 1975, 1977, 1978, 1979, 1981, 1982, 1983, 1985, 1987, 1989, 1990, 1992, 1993, 1995, 1997, 1998, 2000, 2002, 2003, 2005, 2006, 2008, 2009, 2011, 2012, 2014, 2015, 2017, 2018, 2020, 2021, 2023, 2024, 2026, 2027, 2029, 2030, 2032, 2033, 2035, 2036, 2038, 2039, 2041, 2042, 2044, 2046, 2047, 2049, 2051, 2052, 2053, 2055, 2056, 2057, 2059, 2061, 2063, 2064, 2066, 2067, 2069, 2070, 2072, 2073, 2075, 2076, 2077, 2079, 2080, 2081, 2083, 2084, 2086, 2087, 2089, 2090, 2092, 2093, 2095, 2096, 2098, 2099, 2101, 2102, 2104, 2105, 2107, 2108, 2110, 2111, 2112, 2114, 2115, 2116, 2117, 2119, 2121, 2122, 2124, 2125, 2127, 2128, 2129, 2130, 2132, 2133, 2135, 2136, 2138, 2139, 2140, 2142, 2143, 2144, 2145, 2147, 2149, 2150, 2152, 2153, 2155, 2156, 2157, 2159, 2160, 2161, 2162, 2163, 2165, 2166, 2168, 2169, 2171, 2172, 2173, 2175, 2176, 2177, 2178, 2179, 2181, 2182, 2184, 2185, 2187, 2188, 2189, 2191, 2192, 2193, 2194, 2195, 2197, 2198, 2199, 2200, 2202, 2203, 2205, 2206, 2208, 2209, 2210, 2212, 2213, 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2222, 2223, 2225, 2226, 2228, 2229, 2230, 2232, 2233, 2234, 2235, 2237, 2238, 2239, 2240, 2241, 2242, 2243, 2244, 2245, 2247, 2248, 2249, 2250, 2252, 2253, 2255, 2256, 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274, 2276, 2277, 2278, 2279, 2281, 2282, 2283, 2284, 2286, 2287, 2288, 2289, 2291, 2292, 2293, 2295, 2296, 2297, 2297, 2299, 2300, 2301, 2302, 2303, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2314, 2315, 2316, 2318, 2319, 2320, 2320, 2322, 2323, 2324, 2325, 2326, 2328, 2329, 2330, 2332, 2333, 2334, 2334, 2336, 2337, 2338, 2339, 2340, 2342, 2343, 2343, 2345, 2346, 2347, 2348, 2349, 2351, 2352, 2353, 2354, 2355, 2356, 2356, 2358, 2359, 2360, 2361, 2362, 2364, 2365, 2365, 2367, 2368, 2369, 2370, 2371, 2373, 2374, 2374, 2376, 2377, 2378, 2379, 2380, 2382, 2383, 2383, 2385, 2386, 2387, 2388, 2389, 2391, 2392, 2393, 2394, 2395, 2396, 2396, 2398, 2399, 2400, 2401, 2402, 2404, 2405, 2406, 2407, 2408, 2409, 2409, 2411, 2412, 2413, 2414, 2415, 2417, 2418, 2419, 2420, 2421, 2422, 2422, 2424, 2425, 2426, 2426, 2428, 2429, 2430, 2430, 2432, 2433, 2434, 2434, 2436, 2437, 2438, 2439, 2440, 2442, 2443, 2444, 2445, 2446, 2447, 2447, 2449, 2450, 2451, 2451, 2453, 2454, 2455, 2455, 2457, 2458, 2459, 2459, 2461, 2462, 2463, 2463, 2465, 2466, 2467, 2468, 2469, 2470, 2470, 2471, 2472, 2473, 2473, 2474, 2476, 2477, 2478, 2478, 2480, 2481, 2482, 2482, 2484, 2485, 2486, 2486, 2488, 2489, 2490, 2490, 2492, 2493, 2494, 2494, 2496, 2497, 2498, 2498, 2500, 2501, 2502, 2502, 2504, 2505, 2505, 2506, 2507, 2508, 2509, 2509, 2511, 2512, 2512, 2513, 2514, 2515, 2515, 2516, 2517, 2519, 2520, 2520, 2522, 2523, 2524, 2524, 2526, 2527, 2528, 2528, 2530, 2531, 2531, 2532, 2533, 2534, 2535, 2535, 2537, 2538, 2538, 2539, 2540, 2541, 2542, 2542, 2544, 2545, 2545, 2546, 2547, 2548, 2548, 2549, 2550, 2552, 2553, 2553, 2555, 2556, 2556, 2557, 2558, 2559, 2560, 2560, 2562, 2563, 2563, 2564, 2565, 2566, 2566, 2567, 2568, 2570, 2571, 2571, 2573, 2574, 2574, 2575, 2576, 2577, 2577, 2578, 2580, 2581, 2581, 2582, 2583, 2584, 2584, 2585, 2586, 2587, 2587, 2588, 2589, 2591, 2592, 2592, 2594, 2595, 2595, 2596, 2597, 2598, 2598, 2599, 2600, 2601, 2602, 2602, 2604, 2605, 2605, 2606, 2607, 2608, 2608, 2609, 2610, 2612, 2613, 2613, 2615, 2616, 2616, 2617, 2618, 2619, 2619, 2620, 2621, 2622, 2622, 2623, 2624, 2625, 2625, 2626, 2627, 2629, 2630, 2630, 2632, 2633, 2633, 2634, 2635, 2636, 2636, 2637, 2638, 2639, 2639, 2640, 2641, 2642, 2642, 2643, 2645, 2646, 2646, 2647, 2648, 2649, 2649, 2650, 2651, 2653, 2653, 2654, 2655, 2656, 2656, 2657, 2658, 2659, 2659, 2660, 2661, 2662, 2662, 2663, 2665, 2666, 2666, 2667, 2668, 2669, 2669, 2670, 2671, 2672, 2672, 2673, 2674, 2675, 2675, 2676, 2677, 2679, 2679, 2680, 2681, 2682, 2682, 2683, 2684, 2685, 2685, 2686, 2687, 2688, 2688, 2689, 2690, 2691, 2691, 2692, 2693, 2695, 2695, 2696, 2697, 2698, 2698, 2699, 2700, 2701, 2701, 2702, 2703, 2704, 2704, 2705, 2706, 2707, 2707, 2708, 2709, 2711, 2711, 2712, 2713, 2714, 2714, 2714, 2715, 2716, 2716, 2717, 2718, 2720, 2720, 2721, 2722, 2723, 2723, 2724, 2725, 2726, 2726, 2727, 2728, 2729, 2729, 2730, 2731, 2732, 2732, 2733, 2734, 2735, 2735, 2736, 2737, 2738, 2738, 2739, 2740, 2741, 2741, 2742, 2743, 2744, 2744, 2745, 2746, 2747, 2747, 2748, 2749, 2750, 2750, 2751, 2752, 2753, 2753, 2754, 2755, 2756, 2756, 2757, 2758, 2759, 2759, 2760, 2761, 2762, 2762, 2763, 2764, 2765, 2765, 2766, 2767, 2768, 2768, 2769, 2770, 2771, 2771, 2772, 2773, 2774, 2774, 2775, 2776, 2777, 2777, 2778, 2779, 2780, 2780, 2780, 2781, 2782, 2782, 2782, 2783, 2785, 2785, 2786, 2788, 2789, 2789, 2789, 2790, 2791, 2791, 2792, 2793, 2794, 2794, 2795, 2796, 2797, 2797, 2798, 2799, 2800, 2800, 2801, 2802, 2803, 2803, 2804, 2805, 2806, 2806, 2807, 2808, 2809, 2809, 2810, 2811, 2812, 2812, 2812, 2813, 2814, 2814, 2814, 2815, 2817, 2817, 2818, 2820, 2821, 2821, 2821, 2822, 2823, 2823, 2824, 2825, 2826, 2826, 2827, 2828, 2829, 2829, 2830, 2831, 2832, 2832, 2833, 2834, 2835, 2835, 2835, 2836, 2837, 2837, 2838, 2839, 2841, 2841, 2841, 2842, 2843, 2843, 2843, 2845, 2846, 2846, 2847, 2848, 2849, 2849, 2850, 2851, 2852, 2852, 2853, 2854, 2855, 2855, 2855, 2856, 2857, 2857, 2858, 2859, 2860, 2860, 2861, 2862, 2863, 2863, 2864, 2865, 2866, 2866, 2866, 2867, 2868, 2868, 2869, 2870, 2871, 2871, 2872, 2873, 2874, 2874, 2875, 2876, 2877, 2877, 2877, 2878, 2879, 2879, 2880, 2881, 2883, 2883, 2883, 2884, 2885, 2885, 2885, 2887, 2888, 2888, 2889, 2890, 2891, 2891, 2892, 2893, 2894, 2894, 2894, 2895, 2896, 2896, 2897, 2898, 2899, 2899, 2900, 2901, 2902, 2902, 2903, 2904, 2905, 2905, 2905, 2906, 2907, 2907, 2907, 2908, 2910, 2910, 2911, 2912, 2913, 2913, 2913, 2914, 2915, 2915, 2915, 2917, 2918, 2918, 2919, 2920, 2921, 2921, 2922, 2923, 2924, 2924, 2924, 2925, 2926, 2926, 2926, 2927, 2928, 2928, 2929, 2930, 2932, 2932, 2932, 2933, 2934, 2934, 2934, 2935, 2936, 2936, 2937, 2938, 2939, 2939, 2940, 2941, 2942, 2942, 2943, 2944, 2945, 2945, 2945, 2946, 2947, 2947, 2947, 2948, 2950, 2950, 2951, 2952, 2953, 2953, 2953, 2954, 2955, 2955, 2956, 2957, 2958, 2958, 2958, 2959, 2960, 2960, 2961, 2962, 2963, 2963, 2963, 2964, 2965, 2965, 2965, 2966, 2968, 2968, 2969, 2970, 2971, 2971, 2971, 2972, 2973, 2973, 2973, 2974, 2976, 2976, 2977, 2978, 2979, 2979, 2979, 2980, 2981, 2981, 2981, 2982, 2983, 2983, 2983, 2984, 2986, 2986, 2987, 2988, 2989, 2989, 2989, 2990, 2991, 2991, 2992, 2993, 2994, 2994, 2994, 2995, 2996, 2996, 2997, 2998, 2999, 2999, 2999, 3000, 3001, 3001, 3002, 3003, 3004, 3004, 3004, 3005, 3006, 3006, 3006, 3007, 3009, 3009, 3010, 3011, 3012, 3012, 3012, 3013, 3014, 3014, 3014, 3015, 3016, 3016, 3017, 3018, 3019, 3019, 3019, 3020, 3021, 3021, 3022, 3023, 3024, 3024, 3024, 3025, 3026, 3026, 3027, 3028, 3029, 3029, 3029, 3030, 3031, 3031, 3031, 3033, 3034, 3034, 3034, 3035, 3036, 3036, 3036, 3037, 3038, 3038, 3038, 3039, 3041, 3041, 3042, 3043, 3044, 3044, 3044, 3045, 3046, 3046, 3046, 3047, 3048, 3048, 3049, 3050, 3051, 3051, 3051, 3052, 3053, 3053, 3053, 3054, 3055, 3055, 3056, 3057, 3058, 3058, 3058, 3059, 3060, 3060, 3060, 3061, 3062, 3062, 3063, 3064, 3065, 3065, 3065, 3066, 3067, 3067, 3067, 3068, 3069, 3069, 3070, 3071, 3072, 3072, 3072, 3073, 3074, 3074, 3074, 3076, 3077, 3077, 3077, 3078, 3079, 3079, 3079, 3080, 3082, 3082, 3082, 3083, 3084, 3084, 3084, 3085, 3086, 3086, 3086, 3088, 3089, 3089, 3089, 3090, 3091, 3091, 3091, 3092, 3093, 3093, 3093, 3095, 3096, 3096, 3096, 3097, 3098, 3098, 3098, 3099, 3100, 3100, 3100, 3102, 3103, 3103, 3103, 3104, 3105, 3105, 3105, 3106, 3107, 3107, 3107, 3108, 3109, 3109, 3109, 3110, 3111, 3111, 3111, 3112, 3114, 3114, 3114, 3115, 3116, 3116, 3116, 3117, 3118, 3118, 3118, 3119, 3121, 3121, 3121, 3122, 3123, 3123, 3123, 3124, 3125, 3125, 3125, 3126, 3128, 3128, 3128, 3129, 3130, 3130, 3130, 3131, 3132, 3132, 3132, 3133, 3134, 3134, 3134, 3135, 3137, 3137, 3137, 3138, 3139, 3139, 3139, 3140, 3141, 3141, 3141, 3142, 3143, 3143, 3143, 3144, 3145, 3145, 3145, 3146, 3148, 3148, 3148, 3149, 3150, 3150, 3150, 3151, 3152, 3152, 3152, 3153, 3155, 3155, 3155, 3156, 3157, 3157, 3157, 3158, 3159, 3159, 3159, 3160, 3161, 3161, 3162, 3163, 3164, 3163, 3163, 3164, 3165, 3165, 3165, 3166, 3168, 3168, 3168, 3169, 3170, 3170, 3170, 3171, 3172, 3172, 3172, 3173, 3175, 3175, 3175, 3176, 3177, 3177, 3177, 3178, 3179, 3179, 3179, 3180, 3181, 3181, 3181, 3182, 3183, 3183, 3183, 3184, 3185, 3185, 3185, 3186, 3188, 3188, 3188, 3189, 3190, 3189, 3189, 3190, 3191, 3191, 3191, 3192, 3194, 3194, 3194, 3195, 3196, 3196, 3196, 3197, 3198, 3198, 3199, 3200, 3201, 3201, 3201, 3201, 3202, 3201, 3202, 3202, 3204, 3204, 3204, 3205, 3207, 3207, 3207, 3208, 3209, 3209, 3209, 3210, 3211, 3211, 3211, 3212, 3213, 3213, 3213, 3214, 3215, 3215, 3215, 3216, 3217, 3217, 3218, 3219, 3220, 3219, 3219, 3220, 3221, 3221, 3221, 3222, 3224, 3224, 3224, 3225, 3226, 3225, 3225, 3226, 3227, 3227, 3227, 3228, 3230, 3230, 3230, 3231, 3232, 3232, 3232, 3233, 3234, 3234, 3234, 3235, 3236, 3236, 3236, 3237, 3238, 3238, 3238, 3239, 3240, 3240, 3240, 3242, 3243, 3243, 3243, 3243, 3244, 3243, 3244, 3244, 3246, 3246, 3247, 3248, 3249, 3248, 3248, 3249, 3250, 3250, 3250, 3251, 3253, 3253, 3253, 3254, 3255, 3255, 3255, 3256, 3257, 3257, 3257, 3258, 3259, 3259, 3259, 3260, 3261, 3261, 3261, 3262, 3263, 3263, 3263, 3264, 3265, 3265, 3265, 3266, 3267, 3267, 3267, 3268, 3269, 3269, 3269, 3270, 3271, 3271, 3271, 3272, 3273, 3273, 3273, 3274, 3275, 3275, 3275, 3276, 3278, 3278, 3278, 3278, 3279, 3278, 3279, 3279, 3281, 3281, 3281, 3282, 3284, 3284, 3284, 3285, 3286, 3285, 3285, 3286, 3287, 3287, 3287, 3288, 3290, 3290, 3290, 3291, 3292, 3291, 3291, 3292, 3293, 3293, 3293, 3294, 3296, 3296, 3296, 3297, 3298, 3298, 3298, 3299, 3300, 3300, 3300, 3301, 3302, 3302, 3302, 3303, 3304, 3304, 3304, 3305, 3306, 3306, 3306, 3307, 3308, 3308, 3308, 3309, 3310, 3310, 3310, 3311, 3312, 3312, 3312, 3313, 3314, 3314, 3314, 3315, 3316, 3316, 3316, 3317, 3318, 3318, 3318, 3319, 3320, 3320, 3320, 3321, 3322, 3322, 3322, 3323, 3324, 3324, 3324, 3325, 3326, 3326, 3326, 3327, 3328, 3328, 3328, 3329, 3330, 3330, 3330, 3331, 3332, 3332, 3332, 3333, 3334, 3334, 3334, 3335, 3336, 3336, 3336, 3337, 3338, 3338, 3338, 3339, 3340, 3340, 3340, 3341, 3342, 3342, 3342, 3343, 3344, 3344, 3344, 3345, 3346, 3346, 3346, 3347, 3348, 3348, 3348, 3349, 3350, 3350, 3350, 3351, 3352, 3352, 3352, 3353, 3354, 3354, 3354, 3355, 3356, 3356, 3356, 3357, 3358, 3357, 3357, 3358, 3359, 3359, 3359, 3360, 3362, 3362, 3362, 3363, 3364, 3363, 3363, 3364, 3365, 3365, 3365, 3366, 3368, 3368, 3368, 3369, 3370, 3369, 3369, 3370, 3371, 3371, 3371, 3372, 3374, 3373, 3373, 3374, 3375, 3374, 3375, 3375, 3377, 3377, 3377, 3378, 3380, 3379, 3379, 3380, 3381, 3380, 3381, 3381, 3383, 3383, 3383, 3384, 3385, 3385, 3385, 3386, 3387, 3387, 3387, 3388, 3389, 3389, 3389, 3390, 3391, 3391, 3391, 3392, 3393, 3393, 3393, 3394, 3395, 3395, 3395, 3396, 3397, 3397, 3397, 3398, 3399, 3399, 3399, 3400, 3401, 3401, 3401, 3402, 3403, 3403, 3403, 3404, 3405, 3405, 3405, 3406, 3407, 3406, 3406, 3407, 3408, 3408, 3408, 3409, 3411, 3411, 3411, 3412, 3413, 3412, 3412, 3413, 3414, 3414, 3414, 3415, 3417, 3417, 3417, 3418, 3419, 3418, 3418, 3419, 3420, 3419, 3420, 3420, 3422, 3422, 3422, 3423, 3425, 3424, 3424, 3425, 3426, 3425, 3425, 3426, 3428, 3428, 3428, 3429, 3431, 3430, 3430, 3431, 3432, 3431, 3432, 3432, 3434, 3434, 3434, 3435, 3436, 3436, 3436, 3437, 3438, 3438, 3438, 3439, 3440, 3440, 3440, 3441, 3442, 3442, 3442, 3443, 3444, 3444, 3444, 3445, 3446, 3446, 3446, 3447, 3448, 3448, 3448, 3449, 3450, 3450, 3450, 3451, 3452, 3452, 3452, 3453, 3454, 3454, 3454, 3455, 3456, 3456, 3456, 3457, 3458, 3458, 3458, 3459, 3460, 3460, 3460, 3461, 3462, 3462, 3462, 3463, 3464, 3463, 3464, 3464, 3466, 3466, 3466, 3467, 3468, 3467, 3467, 3468, 3469, 3469, 3469, 3470, 3472, 3472, 3472, 3473, 3474, 3473, 3473, 3474, 3475, 3474, 3474, 3475, 3477, 3477, 3477, 3478, 3480, 3479, 3479, 3480, 3481, 3480, 3481, 3481, 3483, 3483, 3483, 3484, 3485, 3485, 3485, 3486, 3487, 3487, 3487, 3488, 3489, 3489, 3489, 3490, 3491, 3491, 3491, 3492, 3493, 3492, 3493, 3493, 3495, 3495, 3495, 3496, 3497, 3496, 3496, 3497, 3498, 3498, 3498, 3499, 3501, 3501, 3501, 3502, 3503, 3502, 3502, 3503, 3504, 3503, 3503, 3504, 3506, 3506, 3506, 3507, 3509, 3508, 3508, 3509, 3510, 3509, 3510, 3510, 3512, 3512, 3512, 3513, 3514, 3513, 3514, 3514, 3516, 3515, 3516, 3516, 3518, 3517, 3518, 3518, 3520, 3519, 3520, 3520, 3522, 3522, 3522, 3523, 3524, 3523, 3523, 3524, 3525, 3524, 3524, 3525, 3527, 3527, 3527, 3528, 3530, 3529, 3529, 3530, 3531, 3530, 3531, 3531, 3533, 3532, 3533, 3533, 3535, 3535, 3535, 3536, 3537, 3536, 3536, 3537, 3538, 3537, 3537, 3538, 3540, 3540, 3540, 3541, 3543, 3542, 3542, 3543, 3544, 3543, 3544, 3544, 3546, 3545, 3546, 3546, 3548, 3548, 3548, 3549, 3550, 3549, 3549, 3550, 3551, 3550, 3551, 3551, 3553, 3552, 3553, 3553, 3555, 3554, 3555, 3555, 3557, 3556, 3557, 3557, 3559, 3559, 3559, 3560, 3561, 3560, 3560, 3561, 3562, 3561, 3562, 3562, 3564, 3563, 3564, 3564, 3566, 3566, 3566, 3567, 3568, 3567, 3567, 3568, 3569, 3568, 3569, 3569, 3571, 3570, 3571, 3571, 3573, 3572, 3573, 3573, 3575, 3574, 3575, 3575, 3577, 3577, 3577, 3578, 3579, 3578, 3578, 3579, 3580, 3579, 3580, 3580, 3582, 3581, 3582, 3582, 3584, 3584, 3584, 3585, 3586, 3585, 3585, 3586, 3587, 3586, 3587, 3587, 3589, 3588, 3589, 3589, 3591, 3590, 3591, 3591, 3593, 3593, 3593, 3594, 3595, 3594, 3594, 3595, 3596, 3595, 3596, 3596, 3598, 3597, 3598, 3598, 3600, 3600, 3600, 3601, 3602, 3601, 3601, 3602, 3603, 3602, 3603, 3603, 3605, 3604, 3605, 3605, 3607, 3606, 3607, 3608, 3609, 3608, 3608, 3609, 3610, 3609, 3610, 3610, 3612, 3612, 3612, 3613, 3614, 3613, 3613, 3614, 3615, 3614, 3615, 3615, 3617, 3616, 3617, 3617, 3619, 3619, 3619, 3620, 3621, 3620, 3620, 3621, 3622, 3622, 3622, 3623, 3625, 3624, 3624, 3625, 3626, 3625, 3625, 3625, 3627, 3627, 3627, 3628, 3630, 3629, 3629, 3630, 3631, 3630, 3630, 3631, 3633, 3632, 3633, 3633, 3635, 3634, 3635, 3636, 3637, 3636, 3636, 3637, 3638, 3637, 3637, 3638, 3640, 3640, 3640, 3641, 3642, 3641, 3641, 3642, 3643, 3642, 3643, 3643, 3645, 3644, 3645, 3645, 3647, 3646, 3647, 3648, 3649, 3648, 3648, 3649, 3650, 3649, 3649, 3650, 3652, 3652, 3652, 3653, 3654, 3653, 3653, 3654, 3655, 3654, 3655, 3655, 3657, 3656, 3657, 3657, 3659, 3658, 3659, 3659, 3661, 3660, 3660, 3661, 3662, 3661, 3661, 3662, 3664, 3663, 3664, 3665, 3666, 3665, 3665, 3666, 3667, 3666, 3667, 3667, 3669, 3668, 3669, 3669, 3671, 3670, 3671, 3671, 3673, 3672, 3672, 3673, 3674, 3673, 3673, 3674, 3676, 3675, 3676, 3677, 3678, 3677, 3677, 3678, 3679, 3678, 3678, 3679, 3681, 3680, 3681, 3682, 3683, 3682, 3682, 3683, 3684, 3683, 3683, 3684, 3686, 3685, 3686, 3686, 3688, 3687, 3688, 3688, 3690, 3689, 3689, 3690, 3691, 3690, 3690, 3691, 3693, 3692, 3693, 3694, 3695, 3694, 3694, 3695, 3696, 3695, 3695, 3696, 3698, 3697, 3698, 3699, 3700, 3699, 3699, 3700, 3701, 3700, 3700, 3701, 3703, 3702, 3703, 3703, 3705, 3704, 3705, 3705, 3707, 3706, 3706, 3707, 3708, 3707, 3707, 3708, 3710, 3709, 3710, 3710, 3712, 3711, 3711, 3712, 3713, 3712, 3712, 3713, 3715, 3714, 3715, 3715, 3717, 3716, 3716, 3717, 3718, 3717, 3717, 3718, 3720, 3719, 3720, 3720, 3722, 3721, 3722, 3722, 3724, 3723, 3723, 3724, 3725, 3724, 3724, 3724, 3726, 3726, 3726, 3727, 3729, 3728, 3728, 3729, 3730, 3729, 3730, 3730, 3732, 3731, 3731, 3731, 3733, 3733, 3733, 3734, 3736, 3735, 3735, 3736, 3737, 3736, 3736, 3736, 3738, 3737, 3737, 3738, 3740, 3739, 3740, 3740, 3742, 3741, 3742, 3742, 3744, 3743, 3743, 3744, 3745, 3744, 3744, 3745, 3747, 3746, 3747, 3747, 3749, 3748, 3749, 3749, 3751, 3750, 3750, 3751, 3752, 3751, 3751, 3752, 3754, 3753, 3754, 3754, 3756, 3755, 3756, 3756, 3758, 3757, 3757, 3758, 3759, 3758, 3758, 3759, 3761, 3760, 3761, 3761, 3763, 3762, 3763, 3763, 3765, 3764, 3764, 3765, 3766, 3765, 3765, 3766, 3768, 3767, 3768, 3768, 3770, 3769, 3770, 3770, 3772, 3771, 3771, 3772, 3773, 3772, 3772, 3773, 3775, 3774, 3775, 3775, 3777, 3776, 3777, 3777, 3779, 3778, 3778, 3779, 3780, 3779, 3779, 3780, 3782, 3781, 3782, 3782, 3784, 3783, 3783, 3784, 3786, 3785, 3786, 3786, 3788, 3787, 3787, 3788, 3789, 3788, 3788, 3789, 3791, 3790, 3791, 3791, 3793, 3792, 3792, 3793, 3795, 3794, 3795, 3795, 3797, 3796, 3796, 3797, 3798, 3797, 3797, 3798, 3800, 3799, 3800, 3800, 3802, 3801, 3801, 3802, 3804, 3803, 3804, 3804, 3806, 3805, 3805, 3806, 3807, 3806, 3806, 3807, 3809, 3808, 3809, 3809, 3811, 3810, 3810, 3811, 3813, 3812, 3813, 3813, 3815, 3814, 3814, 3815, 3816, 3815, 3815, 3816, 3818, 3817, 3818, 3818, 3820, 3819, 3820, 3820, 3822, 3821, 3821, 3822, 3824, 3823, 3824, 3824, 3826, 3825, 3825, 3826, 3827, 3826, 3826, 3827, 3829, 3828, 3829, 3829, 3831, 3830, 3830, 3831, 3833, 3832, 3833, 3833, 3835, 3834, 3834, 3835, 3836, 3835, 3835, 3836, 3838, 3837, 3838, 3838, 3840, 3839, 3839, 3840, 3842, 3841, 3842, 3842, 3844, 3843, 3843, 3844, 3845, 3844, 3844, 3845, 3847, 3846, 3847, 3847, 3849, 3848, 3848, 3849, 3850, 3849, 3849, 3850, 3852, 3851, 3852, 3852, 3854, 3853, 3853, 3854, 3856, 3855, 3856, 3856, 3858, 3857, 3857, 3858, 3859, 3858, 3858, 3859, 3861, 3860, 3861, 3861, 3863, 3862, 3862, 3863, 3865, 3864, 3865, 3865, 3867, 3866, 3866, 3867, 3868, 3867, 3867, 3868, 3870, 3869, 3869, 3870, 3872, 3871, 3872, 3872, 3874, 3873, 3873, 3874, 3875, 3874, 3874, 3875, 3877, 3876, 3877, 3877, 3879, 3878, 3878, 3879, 3881, 3880, 3881, 3881, 3883, 3882, 3882, 3882, 3884, 3883, 3883, 3884, 3886, 3885, 3885, 3886, 3887, 3886, 3886, 3887, 3889, 3888, 3888, 3889, 3891, 3890, 3891, 3891, 3893, 3892, 3892, 3892, 3894, 3893, 3893, 3894, 3896, 3895, 3895, 3896, 3898, 3897, 3898, 3898, 3900, 3899, 3899, 3899, 3901, 3900, 3900, 3901, 3903, 3902, 3902, 3903, 3904, 3903, 3903, 3904, 3906, 3905, 3905, 3906, 3908, 3907, 3908, 3908, 3910, 3909, 3909, 3909, 3911, 3910, 3910, 3911, 3913, 3912, 3912, 3913, 3915, 3914, 3915, 3915, 3917, 3916, 3916, 3916, 3918, 3917, 3917, 3918, 3920, 3919, 3919, 3920, 3921, 3920, 3920, 3921, 3923, 3922, 3922, 3923, 3925, 3924, 3925, 3925, 3927, 3926, 3926, 3926, 3928, 3927, 3927, 3928, 3930, 3929, 3929, 3930, 3932, 3931, 3932, 3932, 3934, 3933, 3933, 3933, 3935, 3934, 3934, 3935, 3937, 3936, 3936, 3936, 3938, 3937, 3937, 3938, 3940, 3939, 3939, 3940, 3942, 3941, 3942, 3942, 3944, 3943, 3943, 3943, 3945, 3944, 3944, 3945, 3947, 3946, 3946, 3947, 3949, 3948, 3949, 3949, 3951, 3950, 3950, 3950, 3952, 3951, 3951, 3952, 3954, 3953, 3953, 3953, 3955, 3954, 3954, 3955, 3957, 3956, 3957, 3957, 3959, 3958, 3958, 3958, 3960, 3959, 3959, 3960, 3962, 3961, 3961, 3961, 3963, 3962, 3962, 3963, 3965, 3964, 3964, 3965, 3967, 3966, 3967, 3967, 3969, 3968, 3968, 3968, 3970, 3969, 3969, 3970, 3972, 3971, 3971, 3972, 3974, 3973, 3974, 3974, 3976, 3975, 3975, 3975, 3977, 3976, 3976, 3977, 3979, 3978, 3978, 3978, 3980, 3979, 3979, 3980, 3982, 3981, 3981, 3982, 3984, 3983, 3983, 3984, 3986, 3985, 3986, 3986, 3988, 3987, 3987, 3987, 3989, 3988, 3988, 3989, 3991, 3990, 3990, 3990, 3992, 3991, 3991, 3992, 3994, 3993, 3993, 3994, 3996, 3995, 3995, 3996, 3998, 3997, 3997, 3997, 3999, 3998, 3998, 3999, 4001, 4000, 4000, 4001, 4003, 4002, 4002, 4003, 4005, 4004, 4004, 4004, 4006, 4005, 4005, 4006, 4008, 4007, 4007, 4007, 4009, 4008, 4008, 4009, 4011, 4010, 4010, 4011, 4013, 4012, 4012, 4013, 4015, 4014, 4014, 4014, 4016, 4015, 4015, 4016, 4018, 4017, 4017, 4017, 4019, 4018, 4018, 4019, 4021, 4020, 4020, 4021, 4023, 4022, 4022, 4023, 4025, 4024, 4024, 4025, 4027, 4026, 4026, 4026, 4028, 4027, 4027, 4028, 4030, 4029, 4029, 4029, 4031, 4030, 4030, 4031, 4033, 4032, 4032, 4033, 4035, 4034, 4034, 4035, 4037, 4036, 4036, 4036, 4038, 4037, 4037, 4038, 4040, 4039, 4039, 4039, 4041, 4040, 4040, 4041, 4043, 4042, 4042, 4043, 4045, 4044, 4044, 4045, 4047, 4046, 4046, 4047, 4049, 4048, 4048, 4048, 4050, 4049, 4049, 4050, 4052, 4051, 4051, 4051, 4053, 4052, 4052, 4053, 4055, 4054, 4054, 4055, 4057, 4056, 4056, 4057, 4059, 4058, 4058, 4058, 4060, 4059, 4059, 4060, 4062, 4061, 4061, 4061, 4062, 4062, 4062, 4063, 4064, 4064, 4064, 4065, 4066, 4066, 4066, 4067, 4068, 4068, 4068, 4069, 4070, 4070, 4070, 4070, 4071, 4071, 4071, 4072, 4073, 4073, 4073, 4073, 4074, 4074, 4074, 4075, 4076, 4076, 4076, 4077, 4078, 4078, 4078, 4079, 4080, 4080, 4080, 4080, 4081, 4081, 4081, 4082, 4083, 4083, 4083, 4083, 4084, 4084, 4084, 4085, 4086, 4086, 4086, 4087, 4088, 4088, 4088, 4089, 4090, 4090, 4091, 4092, 4093, 4093, 4094, 4095] + # 14-bit + gamma_lut_14: [0, 11, 22, 32, 43, 53, 64, 74, 83, 93, 102, 110, 119, 127, 134, 141, 148, 154, 160, 165, 170, 174, 178, 182, 186, 190, 193, 196, 199, 202, 205, 209, 212, 215, 219, 223, 227, 231, 235, 239, 244, 248, 252, 257, 262, 266, 271, 275, 280, 284, 288, 293, 297, 301, 305, 309, 313, 317, 321, 325, 329, 332, 336, 340, 344, 348, 352, 356, 360, 364, 368, 372, 376, 380, 384, 388, 392, 396, 400, 404, 408, 412, 416, 420, 424, 427, 431, 435, 439, 443, 447, 451, 455, 459, 464, 468, 472, 476, 480, 484, 489, 493, 497, 501, 506, 510, 514, 519, 523, 527, 531, 536, 540, 544, 548, 552, 556, 560, 564, 568, 572, 576, 580, 584, 588, 592, 596, 600, 604, 608, 612, 616, 620, 623, 627, 631, 636, 639, 643, 647, 652, 656, 660, 664, 668, 672, 676, 680, 684, 688, 692, 696, 700, 704, 708, 712, 716, 720, 724, 728, 732, 736, 739, 743, 747, 751, 755, 759, 763, 767, 771, 775, 779, 783, 787, 792, 796, 800, 804, 808, 813, 817, 821, 825, 830, 834, 838, 842, 847, 851, 855, 860, 864, 868, 872, 876, 880, 884, 887, 891, 896, 899, 903, 907, 912, 915, 919, 924, 928, 932, 936, 940, 944, 948, 953, 957, 961, 966, 970, 974, 979, 983, 987, 991, 996, 1000, 1004, 1008, 1012, 1016, 1020, 1024, 1028, 1032, 1036, 1040, 1044, 1048, 1052, 1056, 1060, 1064, 1067, 1071, 1075, 1079, 1083, 1087, 1091, 1095, 1099, 1103, 1107, 1111, 1115, 1120, 1124, 1128, 1131, 1135, 1140, 1143, 1147, 1151, 1156, 1159, 1163, 1167, 1172, 1175, 1179, 1184, 1188, 1191, 1195, 1199, 1203, 1207, 1211, 1215, 1219, 1223, 1227, 1231, 1235, 1239, 1243, 1247, 1252, 1256, 1260, 1264, 1268, 1272, 1277, 1281, 1285, 1289, 1294, 1298, 1303, 1307, 1311, 1315, 1320, 1324, 1327, 1332, 1336, 1339, 1343, 1347, 1352, 1355, 1359, 1363, 1368, 1371, 1375, 1379, 1384, 1387, 1391, 1395, 1400, 1403, 1407, 1411, 1416, 1420, 1423, 1428, 1432, 1436, 1440, 1444, 1448, 1451, 1455, 1458, 1462, 1465, 1469, 1473, 1477, 1480, 1484, 1488, 1492, 1495, 1499, 1503, 1508, 1511, 1515, 1520, 1524, 1528, 1532, 1537, 1541, 1545, 1549, 1554, 1559, 1563, 1567, 1571, 1576, 1579, 1583, 1587, 1591, 1594, 1598, 1602, 1606, 1609, 1613, 1616, 1621, 1624, 1628, 1632, 1636, 1639, 1643, 1647, 1651, 1655, 1658, 1663, 1667, 1671, 1675, 1679, 1683, 1687, 1691, 1695, 1700, 1703, 1707, 1711, 1715, 1718, 1722, 1726, 1730, 1733, 1737, 1741, 1745, 1748, 1752, 1756, 1760, 1763, 1766, 1770, 1774, 1778, 1781, 1785, 1789, 1792, 1796, 1800, 1804, 1808, 1811, 1815, 1820, 1823, 1827, 1830, 1834, 1838, 1841, 1845, 1849, 1853, 1856, 1860, 1864, 1868, 1871, 1875, 1880, 1883, 1886, 1890, 1894, 1898, 1901, 1905, 1909, 1912, 1916, 1920, 1924, 1928, 1931, 1935, 1940, 1943, 1946, 1950, 1954, 1958, 1961, 1965, 1969, 1972, 1976, 1980, 1984, 1988, 1991, 1995, 2000, 2003, 2006, 2010, 2014, 2017, 2021, 2025, 2029, 2032, 2036, 2040, 2044, 2048, 2051, 2055, 2060, 2063, 2067, 2070, 2074, 2078, 2081, 2085, 2089, 2093, 2096, 2100, 2105, 2108, 2112, 2116, 2120, 2123, 2126, 2129, 2133, 2136, 2139, 2143, 2147, 2150, 2153, 2157, 2161, 2164, 2168, 2171, 2176, 2179, 2182, 2186, 2190, 2193, 2197, 2201, 2205, 2208, 2212, 2216, 2220, 2224, 2227, 2231, 2236, 2239, 2242, 2245, 2249, 2252, 2255, 2259, 2263, 2266, 2269, 2273, 2277, 2280, 2284, 2287, 2292, 2295, 2298, 2302, 2306, 2309, 2313, 2317, 2321, 2324, 2328, 2332, 2336, 2340, 2343, 2347, 2352, 2355, 2358, 2362, 2365, 2368, 2372, 2375, 2379, 2382, 2386, 2389, 2393, 2396, 2400, 2404, 2408, 2410, 2414, 2417, 2421, 2424, 2427, 2431, 2435, 2438, 2441, 2445, 2449, 2452, 2456, 2460, 2464, 2466, 2470, 2473, 2477, 2480, 2483, 2486, 2490, 2493, 2497, 2501, 2505, 2508, 2511, 2515, 2520, 2523, 2526, 2530, 2534, 2537, 2541, 2545, 2549, 2552, 2556, 2560, 2564, 2568, 2571, 2575, 2580, 2583, 2586, 2589, 2593, 2596, 2600, 2603, 2607, 2610, 2613, 2617, 2621, 2624, 2628, 2631, 2636, 2638, 2641, 2645, 2649, 2652, 2655, 2658, 2662, 2665, 2669, 2673, 2677, 2680, 2683, 2687, 2691, 2694, 2698, 2701, 2705, 2708, 2712, 2715, 2719, 2722, 2726, 2729, 2733, 2737, 2740, 2744, 2747, 2750, 2753, 2756, 2760, 2762, 2765, 2768, 2772, 2775, 2778, 2781, 2785, 2788, 2792, 2795, 2799, 2802, 2806, 2810, 2814, 2817, 2820, 2824, 2829, 2832, 2836, 2840, 2844, 2847, 2851, 2855, 2859, 2862, 2865, 2869, 2872, 2875, 2878, 2881, 2885, 2888, 2891, 2894, 2898, 2901, 2904, 2908, 2911, 2914, 2917, 2920, 2924, 2927, 2930, 2934, 2938, 2941, 2944, 2948, 2952, 2956, 2959, 2963, 2967, 2970, 2974, 2977, 2981, 2984, 2987, 2991, 2995, 2998, 3001, 3005, 3009, 3012, 3016, 3019, 3023, 3026, 3029, 3032, 3036, 3038, 3041, 3045, 3048, 3051, 3054, 3058, 3062, 3064, 3068, 3071, 3075, 3078, 3081, 3085, 3089, 3091, 3095, 3098, 3102, 3105, 3109, 3113, 3117, 3120, 3123, 3127, 3131, 3134, 3137, 3140, 3144, 3147, 3150, 3153, 3157, 3160, 3163, 3166, 3170, 3173, 3176, 3179, 3183, 3186, 3189, 3192, 3196, 3198, 3201, 3205, 3208, 3211, 3214, 3218, 3222, 3225, 3228, 3231, 3235, 3238, 3241, 3244, 3247, 3250, 3253, 3256, 3260, 3263, 3266, 3269, 3273, 3276, 3279, 3283, 3287, 3290, 3293, 3297, 3301, 3303, 3306, 3310, 3314, 3317, 3321, 3324, 3329, 3332, 3335, 3339, 3343, 3346, 3349, 3352, 3356, 3359, 3361, 3365, 3369, 3371, 3374, 3378, 3382, 3385, 3388, 3391, 3395, 3398, 3401, 3404, 3408, 3410, 3413, 3416, 3420, 3423, 3426, 3429, 3434, 3436, 3440, 3443, 3447, 3450, 3453, 3456, 3460, 3462, 3465, 3468, 3472, 3475, 3478, 3481, 3486, 3488, 3492, 3495, 3499, 3502, 3505, 3508, 3512, 3514, 3517, 3521, 3525, 3527, 3530, 3534, 3538, 3541, 3544, 3547, 3551, 3554, 3556, 3559, 3562, 3564, 3567, 3570, 3574, 3576, 3579, 3582, 3586, 3589, 3592, 3595, 3599, 3602, 3605, 3608, 3612, 3615, 3618, 3622, 3626, 3629, 3632, 3636, 3641, 3644, 3647, 3651, 3655, 3658, 3660, 3664, 3667, 3669, 3672, 3675, 3679, 3681, 3684, 3687, 3691, 3693, 3696, 3699, 3703, 3706, 3708, 3711, 3715, 3717, 3720, 3724, 3728, 3730, 3733, 3737, 3741, 3744, 3747, 3751, 3755, 3758, 3761, 3764, 3768, 3770, 3773, 3777, 3781, 3783, 3786, 3790, 3794, 3797, 3800, 3803, 3807, 3809, 3812, 3815, 3819, 3821, 3823, 3826, 3830, 3832, 3835, 3838, 3842, 3845, 3848, 3851, 3855, 3858, 3860, 3864, 3867, 3870, 3873, 3876, 3880, 3883, 3886, 3889, 3894, 3896, 3900, 3903, 3907, 3909, 3912, 3915, 3919, 3921, 3923, 3926, 3930, 3932, 3935, 3938, 3942, 3945, 3948, 3951, 3955, 3958, 3960, 3963, 3967, 3970, 3972, 3976, 3980, 3982, 3985, 3989, 3993, 3996, 3999, 4003, 4007, 4010, 4012, 4015, 4019, 4021, 4023, 4027, 4031, 4033, 4035, 4039, 4043, 4045, 4048, 4051, 4055, 4057, 4060, 4063, 4066, 4068, 4071, 4074, 4078, 4080, 4083, 4086, 4090, 4093, 4096, 4099, 4103, 4105, 4108, 4111, 4114, 4116, 4119, 4122, 4126, 4128, 4131, 4134, 4138, 4141, 4144, 4147, 4151, 4153, 4156, 4159, 4162, 4164, 4167, 4170, 4174, 4176, 4179, 4182, 4186, 4189, 4192, 4195, 4199, 4201, 4204, 4207, 4210, 4212, 4215, 4218, 4222, 4224, 4227, 4230, 4234, 4237, 4240, 4243, 4247, 4249, 4252, 4255, 4258, 4260, 4263, 4266, 4270, 4272, 4275, 4278, 4282, 4285, 4288, 4291, 4295, 4297, 4300, 4303, 4306, 4308, 4311, 4314, 4318, 4320, 4323, 4326, 4330, 4333, 4336, 4339, 4343, 4345, 4348, 4351, 4354, 4356, 4359, 4362, 4366, 4368, 4371, 4374, 4378, 4381, 4384, 4387, 4391, 4393, 4396, 4399, 4403, 4405, 4407, 4410, 4414, 4416, 4419, 4423, 4427, 4429, 4432, 4435, 4439, 4441, 4443, 4446, 4449, 4451, 4453, 4456, 4460, 4462, 4464, 4467, 4471, 4473, 4476, 4479, 4483, 4485, 4487, 4490, 4494, 4496, 4498, 4501, 4505, 4507, 4510, 4514, 4518, 4520, 4523, 4527, 4531, 4533, 4536, 4539, 4543, 4544, 4547, 4550, 4554, 4556, 4559, 4563, 4567, 4569, 4572, 4575, 4579, 4581, 4583, 4586, 4590, 4591, 4594, 4597, 4600, 4602, 4604, 4608, 4611, 4614, 4616, 4619, 4623, 4625, 4627, 4630, 4633, 4634, 4637, 4640, 4643, 4645, 4648, 4651, 4655, 4657, 4660, 4663, 4667, 4669, 4671, 4674, 4678, 4680, 4682, 4686, 4690, 4692, 4695, 4698, 4702, 4705, 4708, 4711, 4715, 4717, 4719, 4722, 4726, 4727, 4729, 4733, 4736, 4738, 4740, 4744, 4747, 4749, 4752, 4755, 4759, 4761, 4763, 4766, 4769, 4771, 4773, 4776, 4780, 4781, 4784, 4787, 4791, 4793, 4796, 4799, 4803, 4805, 4807, 4810, 4813, 4815, 4817, 4820, 4824, 4826, 4828, 4831, 4835, 4837, 4840, 4843, 4847, 4849, 4851, 4854, 4857, 4859, 4861, 4864, 4868, 4869, 4872, 4875, 4879, 4881, 4884, 4887, 4891, 4893, 4895, 4898, 4901, 4903, 4905, 4908, 4912, 4913, 4916, 4919, 4923, 4925, 4928, 4931, 4935, 4937, 4939, 4942, 4945, 4947, 4949, 4952, 4956, 4957, 4960, 4963, 4967, 4969, 4972, 4975, 4979, 4981, 4983, 4986, 4989, 4990, 4993, 4996, 5000, 5001, 5004, 5007, 5011, 5013, 5016, 5019, 5023, 5025, 5027, 5030, 5033, 5035, 5037, 5040, 5044, 5046, 5048, 5051, 5055, 5057, 5060, 5063, 5067, 5068, 5070, 5073, 5076, 5077, 5079, 5082, 5086, 5087, 5089, 5092, 5096, 5098, 5100, 5103, 5107, 5108, 5110, 5113, 5117, 5118, 5120, 5123, 5127, 5129, 5131, 5135, 5139, 5141, 5144, 5147, 5151, 5153, 5155, 5158, 5161, 5163, 5165, 5168, 5172, 5174, 5176, 5180, 5183, 5185, 5188, 5191, 5195, 5196, 5198, 5201, 5204, 5205, 5207, 5210, 5213, 5215, 5217, 5220, 5224, 5226, 5228, 5231, 5235, 5237, 5239, 5241, 5245, 5246, 5249, 5252, 5256, 5257, 5260, 5263, 5267, 5269, 5272, 5275, 5279, 5280, 5282, 5285, 5288, 5289, 5291, 5294, 5297, 5299, 5301, 5304, 5308, 5309, 5312, 5315, 5319, 5321, 5323, 5326, 5329, 5331, 5333, 5336, 5340, 5342, 5344, 5347, 5351, 5353, 5356, 5359, 5363, 5364, 5366, 5368, 5371, 5372, 5374, 5376, 5379, 5380, 5382, 5385, 5389, 5390, 5392, 5395, 5399, 5400, 5402, 5405, 5409, 5410, 5412, 5416, 5419, 5421, 5424, 5427, 5431, 5433, 5436, 5439, 5443, 5444, 5446, 5448, 5451, 5452, 5454, 5456, 5459, 5461, 5462, 5465, 5469, 5470, 5472, 5475, 5479, 5480, 5482, 5485, 5489, 5490, 5492, 5495, 5499, 5501, 5504, 5507, 5511, 5513, 5516, 5519, 5523, 5524, 5526, 5528, 5531, 5532, 5534, 5536, 5539, 5540, 5542, 5545, 5549, 5550, 5552, 5555, 5559, 5560, 5562, 5565, 5568, 5570, 5572, 5575, 5579, 5581, 5583, 5587, 5591, 5593, 5596, 5599, 5603, 5604, 5606, 5608, 5611, 5612, 5614, 5617, 5620, 5621, 5623, 5626, 5629, 5630, 5633, 5635, 5639, 5640, 5642, 5644, 5647, 5648, 5650, 5653, 5657, 5658, 5660, 5663, 5667, 5669, 5672, 5675, 5679, 5680, 5682, 5685, 5688, 5689, 5691, 5694, 5698, 5699, 5701, 5704, 5708, 5710, 5712, 5715, 5719, 5720, 5721, 5724, 5727, 5728, 5729, 5732, 5735, 5736, 5738, 5741, 5745, 5746, 5748, 5751, 5755, 5756, 5758, 5760, 5763, 5764, 5766, 5769, 5773, 5774, 5776, 5779, 5783, 5785, 5788, 5791, 5795, 5796, 5798, 5801, 5804, 5805, 5807, 5810, 5814, 5815, 5817, 5820, 5824, 5826, 5828, 5831, 5835, 5836, 5838, 5840, 5843, 5844, 5846, 5848, 5852, 5853, 5855, 5857, 5861, 5862, 5864, 5867, 5871, 5872, 5873, 5875, 5878, 5879, 5881, 5883, 5887, 5888, 5890, 5893, 5896, 5898, 5900, 5903, 5907, 5908, 5910, 5912, 5916, 5917, 5919, 5922, 5925, 5927, 5929, 5932, 5936, 5938, 5940, 5943, 5947, 5948, 5950, 5952, 5955, 5956, 5958, 5960, 5964, 5965, 5966, 5969, 5973, 5974, 5976, 5979, 5983, 5984, 5985, 5988, 5991, 5991, 5993, 5996, 5999, 6000, 6002, 6005, 6009, 6010, 6012, 6015, 6019, 6020, 6021, 6024, 6027, 6027, 6029, 6032, 6035, 6036, 6038, 6041, 6045, 6046, 6048, 6051, 6055, 6056, 6057, 6060, 6063, 6063, 6065, 6068, 6071, 6072, 6074, 6077, 6081, 6082, 6084, 6087, 6091, 6092, 6093, 6096, 6099, 6099, 6101, 6104, 6107, 6108, 6110, 6113, 6117, 6118, 6120, 6123, 6127, 6128, 6129, 6132, 6135, 6135, 6137, 6140, 6143, 6144, 6146, 6149, 6153, 6154, 6156, 6159, 6163, 6164, 6165, 6168, 6171, 6171, 6173, 6176, 6179, 6180, 6182, 6185, 6189, 6190, 6192, 6195, 6199, 6200, 6201, 6203, 6207, 6207, 6209, 6211, 6215, 6216, 6218, 6221, 6224, 6226, 6228, 6231, 6235, 6236, 6237, 6240, 6243, 6244, 6245, 6248, 6252, 6253, 6254, 6257, 6261, 6262, 6264, 6267, 6271, 6271, 6273, 6275, 6278, 6278, 6279, 6282, 6285, 6286, 6287, 6290, 6293, 6294, 6296, 6299, 6303, 6304, 6305, 6307, 6310, 6311, 6313, 6315, 6319, 6320, 6322, 6325, 6329, 6330, 6332, 6335, 6339, 6339, 6341, 6343, 6346, 6346, 6347, 6350, 6353, 6354, 6355, 6358, 6361, 6363, 6364, 6367, 6371, 6372, 6373, 6375, 6378, 6379, 6381, 6383, 6387, 6388, 6390, 6393, 6397, 6398, 6400, 6403, 6407, 6407, 6409, 6411, 6414, 6414, 6415, 6418, 6421, 6422, 6423, 6426, 6429, 6430, 6432, 6435, 6439, 6440, 6441, 6443, 6446, 6447, 6449, 6451, 6455, 6456, 6458, 6461, 6465, 6466, 6468, 6471, 6475, 6475, 6477, 6479, 6482, 6482, 6483, 6486, 6489, 6490, 6491, 6494, 6497, 6498, 6500, 6503, 6507, 6507, 6509, 6511, 6514, 6515, 6517, 6519, 6523, 6524, 6526, 6529, 6533, 6534, 6536, 6539, 6543, 6543, 6545, 6547, 6550, 6550, 6551, 6554, 6557, 6558, 6559, 6562, 6565, 6566, 6568, 6571, 6575, 6575, 6577, 6579, 6582, 6583, 6584, 6587, 6591, 6592, 6594, 6597, 6600, 6602, 6604, 6607, 6611, 6611, 6613, 6615, 6618, 6618, 6620, 6622, 6625, 6626, 6627, 6630, 6634, 6635, 6637, 6639, 6643, 6643, 6644, 6646, 6649, 6650, 6651, 6653, 6657, 6657, 6659, 6662, 6665, 6666, 6668, 6671, 6675, 6675, 6676, 6679, 6682, 6682, 6683, 6686, 6689, 6690, 6691, 6694, 6698, 6699, 6700, 6703, 6707, 6707, 6708, 6710, 6713, 6713, 6715, 6717, 6720, 6721, 6723, 6725, 6729, 6730, 6732, 6735, 6739, 6739, 6741, 6743, 6746, 6747, 6748, 6751, 6755, 6756, 6758, 6761, 6764, 6766, 6768, 6771, 6775, 6775, 6777, 6779, 6782, 6782, 6783, 6786, 6789, 6790, 6791, 6794, 6798, 6799, 6800, 6803, 6807, 6807, 6808, 6810, 6813, 6814, 6815, 6817, 6821, 6821, 6823, 6826, 6829, 6830, 6832, 6835, 6839, 6839, 6840, 6842, 6845, 6846, 6847, 6849, 6853, 6853, 6855, 6858, 6861, 6862, 6864, 6867, 6871, 6871, 6872, 6875, 6878, 6878, 6879, 6882, 6885, 6886, 6887, 6890, 6894, 6895, 6897, 6899, 6903, 6903, 6904, 6906, 6908, 6908, 6909, 6912, 6915, 6915, 6916, 6919, 6922, 6923, 6925, 6927, 6931, 6931, 6932, 6934, 6937, 6937, 6938, 6941, 6944, 6945, 6946, 6949, 6953, 6954, 6956, 6959, 6963, 6963, 6964, 6967, 6970, 6970, 6971, 6974, 6977, 6978, 6979, 6982, 6986, 6987, 6989, 6991, 6995, 6995, 6996, 6998, 7000, 7000, 7001, 7004, 7007, 7007, 7008, 7011, 7014, 7015, 7017, 7019, 7023, 7023, 7024, 7026, 7029, 7029, 7030, 7033, 7036, 7037, 7038, 7041, 7045, 7046, 7048, 7051, 7055, 7055, 7056, 7059, 7062, 7062, 7063, 7066, 7069, 7070, 7071, 7074, 7078, 7079, 7080, 7083, 7087, 7087, 7088, 7090, 7092, 7092, 7093, 7095, 7099, 7099, 7100, 7103, 7106, 7107, 7108, 7111, 7115, 7115, 7116, 7118, 7121, 7121, 7123, 7125, 7129, 7129, 7131, 7133, 7137, 7138, 7140, 7143, 7147, 7147, 7148, 7150, 7153, 7153, 7154, 7156, 7159, 7159, 7161, 7163, 7166, 7167, 7169, 7171, 7175, 7175, 7176, 7177, 7180, 7180, 7181, 7183, 7187, 7187, 7188, 7191, 7194, 7195, 7197, 7199, 7203, 7203, 7203, 7205, 7208, 7208, 7209, 7211, 7214, 7214, 7216, 7218, 7222, 7223, 7224, 7227, 7231, 7231, 7232, 7234, 7237, 7237, 7239, 7241, 7245, 7245, 7247, 7249, 7253, 7254, 7256, 7259, 7263, 7263, 7264, 7266, 7269, 7269, 7270, 7272, 7275, 7275, 7276, 7279, 7282, 7283, 7285, 7287, 7291, 7291, 7291, 7293, 7296, 7296, 7297, 7299, 7302, 7303, 7304, 7306, 7310, 7311, 7312, 7315, 7319, 7319, 7320, 7321, 7324, 7324, 7325, 7327, 7331, 7331, 7332, 7335, 7338, 7339, 7341, 7343, 7347, 7347, 7347, 7349, 7352, 7352, 7353, 7355, 7358, 7358, 7359, 7362, 7366, 7366, 7368, 7371, 7375, 7375, 7376, 7378, 7381, 7382, 7383, 7385, 7389, 7389, 7391, 7394, 7398, 7399, 7400, 7403, 7407, 7407, 7407, 7409, 7412, 7411, 7412, 7414, 7417, 7417, 7418, 7420, 7423, 7424, 7425, 7427, 7431, 7430, 7431, 7433, 7435, 7435, 7436, 7438, 7441, 7442, 7443, 7446, 7449, 7450, 7452, 7455, 7459, 7459, 7460, 7462, 7465, 7466, 7467, 7470, 7473, 7474, 7475, 7478, 7482, 7483, 7484, 7487, 7491, 7491, 7491, 7493, 7496, 7495, 7496, 7498, 7501, 7501, 7502, 7504, 7507, 7508, 7509, 7511, 7515, 7514, 7515, 7517, 7520, 7519, 7520, 7522, 7526, 7526, 7527, 7530, 7534, 7534, 7536, 7539, 7543, 7543, 7544, 7546, 7548, 7548, 7549, 7552, 7555, 7555, 7556, 7559, 7563, 7563, 7565, 7567, 7571, 7570, 7571, 7573, 7575, 7575, 7575, 7577, 7580, 7580, 7581, 7584, 7587, 7587, 7589, 7591, 7595, 7594, 7595, 7597, 7600, 7599, 7600, 7603, 7606, 7606, 7607, 7610, 7614, 7614, 7616, 7619, 7623, 7623, 7624, 7626, 7628, 7628, 7629, 7632, 7635, 7635, 7636, 7639, 7642, 7643, 7645, 7647, 7651, 7650, 7651, 7653, 7655, 7655, 7655, 7657, 7660, 7660, 7661, 7664, 7667, 7667, 7669, 7671, 7675, 7674, 7675, 7677, 7680, 7679, 7680, 7683, 7686, 7686, 7687, 7690, 7694, 7694, 7696, 7699, 7703, 7703, 7704, 7705, 7708, 7708, 7709, 7712, 7715, 7715, 7716, 7719, 7722, 7723, 7725, 7727, 7731, 7730, 7731, 7732, 7735, 7735, 7735, 7737, 7740, 7740, 7741, 7743, 7747, 7747, 7749, 7751, 7755, 7754, 7755, 7757, 7760, 7760, 7761, 7763, 7766, 7766, 7768, 7770, 7774, 7775, 7776, 7779, 7783, 7782, 7783, 7785, 7787, 7787, 7788, 7790, 7793, 7793, 7794, 7796, 7799, 7800, 7801, 7803, 7807, 7806, 7807, 7808, 7811, 7810, 7811, 7813, 7816, 7816, 7817, 7819, 7822, 7823, 7824, 7827, 7831, 7830, 7831, 7833, 7836, 7836, 7837, 7839, 7843, 7843, 7844, 7847, 7850, 7851, 7852, 7855, 7859, 7858, 7859, 7860, 7863, 7862, 7863, 7865, 7868, 7868, 7869, 7871, 7875, 7875, 7877, 7879, 7883, 7882, 7883, 7885, 7888, 7888, 7889, 7891, 7895, 7895, 7896, 7899, 7902, 7903, 7905, 7907, 7911, 7910, 7910, 7912, 7914, 7913, 7914, 7915, 7918, 7918, 7919, 7921, 7924, 7924, 7925, 7927, 7931, 7930, 7931, 7933, 7935, 7935, 7936, 7938, 7942, 7942, 7943, 7946, 7950, 7951, 7952, 7955, 7959, 7958, 7959, 7961, 7963, 7963, 7963, 7965, 7968, 7968, 7969, 7971, 7975, 7975, 7977, 7979, 7983, 7982, 7983, 7985, 7988, 7987, 7988, 7991, 7994, 7994, 7995, 7998, 8002, 8003, 8004, 8007, 8011, 8010, 8011, 8013, 8015, 8015, 8016, 8018, 8021, 8021, 8021, 8024, 8027, 8027, 8029, 8031, 8035, 8034, 8035, 8036, 8039, 8038, 8039, 8041, 8044, 8044, 8045, 8047, 8051, 8051, 8053, 8055, 8058, 8058, 8059, 8060, 8063, 8062, 8063, 8065, 8068, 8068, 8069, 8071, 8075, 8075, 8077, 8079, 8082, 8082, 8083, 8084, 8087, 8086, 8087, 8089, 8092, 8092, 8093, 8095, 8099, 8099, 8101, 8103, 8106, 8106, 8107, 8108, 8111, 8110, 8111, 8113, 8116, 8116, 8117, 8119, 8123, 8123, 8125, 8127, 8130, 8130, 8131, 8132, 8135, 8134, 8135, 8137, 8140, 8140, 8141, 8143, 8147, 8147, 8149, 8151, 8154, 8154, 8154, 8156, 8158, 8158, 8158, 8160, 8164, 8163, 8164, 8167, 8170, 8171, 8172, 8175, 8178, 8178, 8179, 8181, 8184, 8184, 8185, 8187, 8191, 8191, 8192, 8195, 8198, 8199, 8200, 8203, 8206, 8206, 8206, 8208, 8210, 8209, 8210, 8211, 8214, 8214, 8214, 8216, 8220, 8220, 8221, 8223, 8226, 8226, 8227, 8228, 8231, 8231, 8232, 8234, 8238, 8238, 8239, 8242, 8246, 8246, 8248, 8251, 8254, 8254, 8255, 8257, 8259, 8259, 8259, 8261, 8265, 8264, 8265, 8268, 8271, 8271, 8273, 8275, 8278, 8278, 8279, 8280, 8283, 8282, 8283, 8285, 8288, 8288, 8289, 8292, 8295, 8295, 8297, 8299, 8302, 8302, 8302, 8304, 8306, 8305, 8305, 8307, 8310, 8310, 8310, 8312, 8316, 8316, 8317, 8319, 8322, 8322, 8322, 8324, 8326, 8326, 8326, 8328, 8332, 8331, 8332, 8335, 8338, 8339, 8340, 8343, 8346, 8346, 8347, 8348, 8351, 8350, 8351, 8353, 8356, 8356, 8357, 8359, 8363, 8363, 8365, 8367, 8370, 8370, 8370, 8372, 8375, 8374, 8375, 8377, 8380, 8380, 8381, 8383, 8387, 8387, 8388, 8391, 8394, 8394, 8394, 8396, 8399, 8398, 8399, 8401, 8404, 8404, 8405, 8407, 8411, 8411, 8412, 8415, 8418, 8418, 8419, 8420, 8423, 8422, 8423, 8425, 8428, 8428, 8429, 8432, 8435, 8435, 8437, 8439, 8442, 8442, 8442, 8443, 8446, 8445, 8445, 8447, 8450, 8450, 8450, 8452, 8456, 8456, 8457, 8459, 8462, 8462, 8462, 8464, 8466, 8466, 8466, 8468, 8471, 8471, 8472, 8475, 8478, 8479, 8480, 8483, 8486, 8486, 8487, 8488, 8491, 8491, 8491, 8493, 8497, 8496, 8497, 8500, 8503, 8503, 8505, 8507, 8510, 8510, 8510, 8511, 8514, 8513, 8513, 8515, 8518, 8517, 8518, 8520, 8523, 8524, 8525, 8527, 8530, 8530, 8530, 8532, 8535, 8534, 8535, 8537, 8540, 8540, 8541, 8543, 8547, 8547, 8548, 8551, 8554, 8554, 8554, 8555, 8558, 8557, 8557, 8559, 8562, 8562, 8562, 8564, 8568, 8568, 8569, 8571, 8574, 8574, 8574, 8576, 8578, 8578, 8578, 8580, 8583, 8583, 8584, 8587, 8590, 8591, 8592, 8595, 8598, 8598, 8599, 8600, 8603, 8602, 8603, 8605, 8608, 8608, 8609, 8611, 8615, 8615, 8617, 8619, 8622, 8622, 8622, 8624, 8626, 8625, 8626, 8627, 8630, 8630, 8630, 8633, 8636, 8636, 8637, 8639, 8642, 8642, 8642, 8643, 8645, 8644, 8645, 8646, 8649, 8649, 8650, 8652, 8655, 8655, 8657, 8659, 8662, 8662, 8662, 8664, 8667, 8666, 8667, 8669, 8672, 8672, 8673, 8675, 8679, 8679, 8680, 8683, 8686, 8686, 8686, 8688, 8690, 8689, 8690, 8691, 8694, 8694, 8695, 8697, 8700, 8700, 8701, 8703, 8706, 8706, 8706, 8707, 8709, 8708, 8709, 8710, 8713, 8713, 8713, 8716, 8719, 8719, 8720, 8723, 8726, 8726, 8726, 8728, 8731, 8730, 8730, 8733, 8736, 8736, 8737, 8739, 8743, 8743, 8744, 8747, 8750, 8750, 8750, 8751, 8754, 8753, 8753, 8755, 8758, 8758, 8758, 8761, 8764, 8764, 8765, 8767, 8770, 8770, 8770, 8771, 8774, 8773, 8773, 8775, 8778, 8777, 8778, 8780, 8784, 8784, 8785, 8787, 8790, 8790, 8790, 8791, 8793, 8792, 8793, 8794, 8797, 8797, 8798, 8800, 8803, 8803, 8805, 8807, 8810, 8810, 8810, 8812, 8814, 8814, 8814, 8816, 8820, 8819, 8820, 8823, 8827, 8827, 8828, 8831, 8834, 8834, 8834, 8836, 8838, 8837, 8838, 8840, 8843, 8842, 8843, 8845, 8848, 8848, 8849, 8851, 8854, 8853, 8853, 8854, 8857, 8855, 8855, 8857, 8860, 8859, 8859, 8861, 8864, 8864, 8865, 8867, 8870, 8869, 8869, 8871, 8873, 8872, 8872, 8874, 8877, 8876, 8877, 8879, 8883, 8883, 8884, 8887, 8890, 8890, 8890, 8892, 8895, 8894, 8894, 8897, 8900, 8900, 8901, 8903, 8907, 8907, 8908, 8911, 8914, 8914, 8914, 8915, 8918, 8917, 8917, 8919, 8922, 8922, 8922, 8924, 8928, 8928, 8929, 8931, 8934, 8934, 8934, 8935, 8938, 8937, 8937, 8939, 8942, 8942, 8942, 8944, 8948, 8948, 8949, 8951, 8954, 8953, 8953, 8954, 8957, 8955, 8955, 8957, 8960, 8959, 8959, 8961, 8964, 8964, 8965, 8967, 8970, 8969, 8969, 8971, 8973, 8972, 8973, 8974, 8978, 8977, 8978, 8980, 8983, 8983, 8985, 8987, 8990, 8990, 8990, 8991, 8993, 8992, 8992, 8994, 8997, 8997, 8997, 9000, 9003, 9003, 9004, 9007, 9010, 9010, 9010, 9012, 9015, 9014, 9015, 9017, 9020, 9020, 9021, 9023, 9027, 9027, 9028, 9031, 9034, 9033, 9033, 9035, 9037, 9036, 9036, 9037, 9040, 9039, 9039, 9041, 9045, 9044, 9045, 9047, 9050, 9049, 9049, 9051, 9053, 9052, 9053, 9054, 9058, 9057, 9058, 9060, 9064, 9064, 9065, 9067, 9070, 9069, 9069, 9070, 9073, 9071, 9071, 9073, 9076, 9075, 9075, 9077, 9080, 9080, 9081, 9083, 9086, 9085, 9085, 9087, 9089, 9088, 9088, 9090, 9093, 9093, 9093, 9096, 9099, 9099, 9100, 9103, 9106, 9106, 9106, 9107, 9110, 9109, 9109, 9111, 9114, 9113, 9114, 9116, 9120, 9120, 9121, 9123, 9126, 9125, 9126, 9127, 9129, 9128, 9129, 9131, 9134, 9133, 9134, 9136, 9139, 9139, 9141, 9143, 9146, 9145, 9146, 9147, 9149, 9148, 9149, 9150, 9154, 9153, 9154, 9156, 9159, 9159, 9160, 9163, 9166, 9166, 9166, 9167, 9170, 9169, 9169, 9171, 9174, 9174, 9174, 9176, 9180, 9180, 9181, 9183, 9186, 9185, 9185, 9186, 9188, 9187, 9187, 9189, 9192, 9191, 9191, 9193, 9196, 9196, 9197, 9199, 9202, 9201, 9201, 9203, 9205, 9204, 9205, 9207, 9210, 9209, 9210, 9212, 9216, 9216, 9217, 9219, 9222, 9221, 9221, 9222, 9225, 9223, 9223, 9225, 9228, 9227, 9227, 9229, 9232, 9232, 9233, 9235, 9238, 9237, 9237, 9238, 9241, 9240, 9240, 9242, 9245, 9244, 9245, 9247, 9251, 9251, 9252, 9255, 9258, 9258, 9258, 9259, 9262, 9261, 9261, 9263, 9266, 9266, 9266, 9268, 9272, 9272, 9273, 9275, 9278, 9277, 9277, 9278, 9280, 9279, 9279, 9281, 9284, 9283, 9283, 9285, 9288, 9288, 9289, 9291, 9294, 9293, 9293, 9294, 9297, 9296, 9296, 9298, 9301, 9300, 9301, 9303, 9307, 9307, 9308, 9311, 9314, 9314, 9314, 9315, 9318, 9317, 9317, 9319, 9322, 9322, 9322, 9324, 9328, 9328, 9329, 9331, 9334, 9333, 9333, 9334, 9336, 9335, 9335, 9337, 9339, 9339, 9339, 9341, 9344, 9344, 9345, 9347, 9350, 9349, 9349, 9351, 9353, 9352, 9353, 9354, 9358, 9357, 9358, 9360, 9363, 9363, 9365, 9367, 9370, 9369, 9369, 9370, 9372, 9371, 9371, 9373, 9376, 9375, 9375, 9377, 9380, 9380, 9381, 9383, 9386, 9385, 9385, 9387, 9389, 9388, 9388, 9390, 9393, 9393, 9393, 9396, 9399, 9399, 9400, 9403, 9406, 9405, 9405, 9406, 9409, 9408, 9408, 9409, 9412, 9411, 9412, 9413, 9417, 9416, 9417, 9419, 9422, 9421, 9421, 9422, 9424, 9423, 9422, 9424, 9427, 9426, 9426, 9428, 9432, 9432, 9433, 9435, 9438, 9437, 9437, 9439, 9441, 9440, 9441, 9443, 9446, 9445, 9446, 9448, 9452, 9451, 9453, 9455, 9458, 9457, 9457, 9458, 9460, 9459, 9459, 9461, 9464, 9463, 9463, 9465, 9468, 9468, 9469, 9471, 9474, 9473, 9473, 9475, 9477, 9476, 9476, 9478, 9482, 9481, 9482, 9484, 9487, 9487, 9488, 9491, 9494, 9493, 9493, 9494, 9496, 9495, 9495, 9497, 9500, 9499, 9499, 9501, 9504, 9504, 9505, 9507, 9510, 9509, 9509, 9511, 9513, 9512, 9512, 9514, 9518, 9517, 9518, 9520, 9523, 9523, 9524, 9527, 9530, 9529, 9529, 9530, 9532, 9531, 9531, 9533, 9536, 9535, 9535, 9537, 9540, 9540, 9541, 9543, 9546, 9545, 9545, 9547, 9549, 9548, 9548, 9550, 9553, 9553, 9553, 9556, 9559, 9559, 9560, 9563, 9566, 9565, 9565, 9566, 9569, 9567, 9567, 9569, 9572, 9571, 9571, 9573, 9577, 9576, 9577, 9579, 9582, 9581, 9581, 9582, 9584, 9582, 9582, 9584, 9587, 9586, 9586, 9588, 9592, 9592, 9593, 9595, 9598, 9597, 9597, 9599, 9601, 9600, 9600, 9602, 9605, 9605, 9605, 9608, 9611, 9611, 9612, 9615, 9618, 9617, 9617, 9618, 9621, 9619, 9619, 9621, 9624, 9623, 9623, 9625, 9629, 9628, 9629, 9631, 9634, 9633, 9633, 9634, 9636, 9634, 9634, 9636, 9639, 9638, 9638, 9640, 9644, 9644, 9644, 9647, 9650, 9649, 9649, 9651, 9653, 9652, 9652, 9654, 9657, 9657, 9657, 9660, 9663, 9663, 9664, 9667, 9670, 9669, 9669, 9670, 9673, 9671, 9671, 9673, 9676, 9675, 9675, 9677, 9681, 9680, 9681, 9683, 9686, 9685, 9685, 9686, 9688, 9687, 9687, 9688, 9691, 9690, 9691, 9693, 9696, 9696, 9697, 9699, 9702, 9701, 9701, 9702, 9704, 9703, 9703, 9704, 9707, 9706, 9707, 9709, 9712, 9712, 9713, 9715, 9718, 9717, 9717, 9718, 9720, 9719, 9719, 9721, 9724, 9723, 9723, 9725, 9728, 9728, 9729, 9731, 9734, 9733, 9733, 9734, 9736, 9734, 9734, 9736, 9739, 9738, 9738, 9740, 9744, 9744, 9744, 9747, 9750, 9749, 9749, 9751, 9753, 9752, 9752, 9754, 9757, 9757, 9757, 9760, 9763, 9763, 9764, 9767, 9770, 9769, 9769, 9770, 9773, 9771, 9771, 9773, 9776, 9775, 9775, 9777, 9780, 9780, 9781, 9783, 9786, 9785, 9785, 9786, 9788, 9787, 9787, 9788, 9791, 9790, 9791, 9793, 9796, 9796, 9797, 9799, 9802, 9801, 9801, 9802, 9804, 9803, 9803, 9804, 9807, 9806, 9807, 9809, 9812, 9812, 9813, 9815, 9818, 9817, 9817, 9818, 9820, 9819, 9819, 9820, 9823, 9822, 9823, 9825, 9828, 9828, 9829, 9831, 9834, 9833, 9833, 9834, 9836, 9835, 9835, 9836, 9839, 9838, 9839, 9841, 9844, 9844, 9845, 9847, 9850, 9849, 9849, 9850, 9852, 9851, 9851, 9852, 9855, 9854, 9855, 9857, 9860, 9860, 9861, 9863, 9866, 9865, 9865, 9866, 9868, 9867, 9867, 9869, 9872, 9871, 9871, 9873, 9877, 9876, 9877, 9879, 9882, 9881, 9880, 9881, 9883, 9882, 9881, 9883, 9885, 9884, 9884, 9886, 9889, 9888, 9889, 9891, 9894, 9893, 9892, 9893, 9896, 9894, 9894, 9896, 9899, 9898, 9898, 9900, 9904, 9904, 9905, 9907, 9910, 9909, 9909, 9910, 9912, 9911, 9911, 9912, 9915, 9914, 9915, 9917, 9920, 9920, 9921, 9923, 9926, 9925, 9925, 9926, 9928, 9927, 9927, 9928, 9931, 9930, 9931, 9933, 9936, 9936, 9937, 9939, 9942, 9941, 9941, 9942, 9944, 9943, 9943, 9944, 9947, 9946, 9947, 9949, 9952, 9952, 9953, 9955, 9958, 9957, 9957, 9958, 9960, 9959, 9959, 9960, 9963, 9962, 9963, 9965, 9968, 9968, 9969, 9971, 9974, 9973, 9973, 9974, 9976, 9975, 9975, 9976, 9979, 9978, 9979, 9981, 9984, 9984, 9985, 9987, 9990, 9989, 9989, 9990, 9992, 9991, 9990, 9992, 9995, 9994, 9994, 9997, 10000, 10000, 10001, 10003, 10006, 10005, 10005, 10006, 10008, 10007, 10007, 10009, 10012, 10011, 10011, 10013, 10017, 10016, 10017, 10019, 10022, 10021, 10020, 10021, 10023, 10021, 10021, 10022, 10025, 10024, 10024, 10026, 10029, 10028, 10029, 10031, 10034, 10033, 10032, 10034, 10036, 10035, 10034, 10036, 10039, 10038, 10039, 10041, 10044, 10044, 10045, 10047, 10050, 10049, 10048, 10049, 10051, 10050, 10049, 10051, 10053, 10052, 10052, 10054, 10057, 10056, 10057, 10059, 10062, 10061, 10060, 10061, 10064, 10062, 10062, 10064, 10067, 10066, 10066, 10068, 10072, 10071, 10072, 10075, 10078, 10077, 10077, 10078, 10080, 10079, 10079, 10080, 10083, 10082, 10083, 10085, 10088, 10088, 10089, 10091, 10094, 10093, 10092, 10094, 10096, 10094, 10094, 10096, 10099, 10098, 10098, 10100, 10104, 10104, 10104, 10107, 10110, 10109, 10109, 10110, 10112, 10111, 10111, 10113, 10116, 10115, 10115, 10117, 10120, 10120, 10121, 10123, 10126, 10125, 10124, 10125, 10127, 10125, 10125, 10126, 10129, 10128, 10128, 10130, 10133, 10132, 10133, 10135, 10138, 10137, 10136, 10138, 10140, 10138, 10138, 10140, 10143, 10142, 10143, 10145, 10148, 10148, 10149, 10151, 10154, 10153, 10152, 10153, 10155, 10153, 10153, 10154, 10157, 10156, 10156, 10158, 10161, 10160, 10161, 10163, 10166, 10165, 10164, 10165, 10168, 10166, 10166, 10168, 10171, 10170, 10170, 10173, 10176, 10176, 10177, 10179, 10182, 10181, 10180, 10181, 10183, 10182, 10181, 10183, 10185, 10184, 10184, 10186, 10189, 10188, 10189, 10191, 10194, 10193, 10192, 10193, 10196, 10194, 10194, 10196, 10199, 10198, 10198, 10200, 10204, 10203, 10204, 10207, 10210, 10209, 10209, 10210, 10212, 10211, 10211, 10213, 10216, 10215, 10215, 10217, 10221, 10220, 10221, 10223, 10226, 10225, 10224, 10225, 10227, 10225, 10225, 10226, 10229, 10228, 10228, 10230, 10233, 10232, 10233, 10235, 10238, 10237, 10236, 10237, 10240, 10238, 10238, 10240, 10243, 10242, 10242, 10245, 10248, 10248, 10249, 10251, 10254, 10253, 10252, 10253, 10255, 10253, 10253, 10255, 10257, 10256, 10256, 10258, 10261, 10260, 10261, 10263, 10266, 10265, 10264, 10265, 10268, 10266, 10266, 10267, 10271, 10270, 10270, 10272, 10276, 10275, 10276, 10279, 10282, 10281, 10281, 10282, 10284, 10283, 10283, 10285, 10288, 10287, 10287, 10289, 10292, 10292, 10293, 10295, 10298, 10297, 10296, 10297, 10299, 10297, 10297, 10298, 10301, 10300, 10300, 10302, 10305, 10304, 10305, 10307, 10310, 10309, 10308, 10309, 10312, 10310, 10310, 10312, 10315, 10314, 10314, 10316, 10320, 10320, 10320, 10323, 10326, 10325, 10324, 10325, 10327, 10326, 10325, 10327, 10330, 10328, 10328, 10330, 10333, 10333, 10333, 10335, 10338, 10336, 10336, 10337, 10339, 10337, 10336, 10338, 10341, 10339, 10339, 10341, 10345, 10344, 10345, 10347, 10350, 10349, 10348, 10349, 10352, 10350, 10350, 10352, 10355, 10354, 10354, 10356, 10360, 10359, 10360, 10363, 10366, 10365, 10365, 10366, 10368, 10367, 10367, 10368, 10372, 10370, 10371, 10373, 10376, 10376, 10377, 10379, 10382, 10381, 10380, 10381, 10383, 10382, 10381, 10383, 10386, 10384, 10384, 10386, 10389, 10389, 10389, 10391, 10394, 10392, 10392, 10393, 10395, 10393, 10392, 10394, 10397, 10395, 10395, 10397, 10400, 10400, 10401, 10403, 10406, 10405, 10404, 10405, 10408, 10406, 10406, 10408, 10411, 10410, 10410, 10413, 10416, 10416, 10417, 10419, 10422, 10421, 10420, 10421, 10423, 10421, 10421, 10422, 10425, 10424, 10424, 10426, 10429, 10428, 10429, 10431, 10434, 10433, 10432, 10433, 10435, 10434, 10434, 10435, 10439, 10437, 10438, 10440, 10444, 10443, 10444, 10447, 10450, 10449, 10449, 10450, 10452, 10451, 10451, 10452, 10456, 10454, 10455, 10457, 10460, 10460, 10461, 10463, 10466, 10465, 10464, 10465, 10467, 10465, 10465, 10467, 10469, 10468, 10468, 10470, 10473, 10472, 10473, 10475, 10478, 10476, 10476, 10477, 10479, 10477, 10477, 10478, 10481, 10480, 10480, 10482, 10485, 10484, 10485, 10487, 10490, 10488, 10488, 10489, 10491, 10489, 10488, 10490, 10493, 10491, 10491, 10493, 10497, 10496, 10497, 10499, 10502, 10501, 10500, 10501, 10504, 10502, 10502, 10503, 10507, 10506, 10506, 10508, 10512, 10511, 10512, 10515, 10518, 10517, 10516, 10518, 10520, 10519, 10519, 10520, 10523, 10522, 10523, 10525, 10528, 10528, 10529, 10531, 10534, 10533, 10532, 10533, 10535, 10533, 10533, 10534, 10537, 10536, 10536, 10538, 10541, 10540, 10541, 10543, 10546, 10544, 10544, 10545, 10547, 10545, 10545, 10546, 10549, 10548, 10548, 10550, 10553, 10552, 10553, 10555, 10558, 10556, 10556, 10557, 10559, 10557, 10556, 10558, 10561, 10559, 10559, 10561, 10565, 10564, 10565, 10567, 10570, 10569, 10568, 10569, 10572, 10570, 10570, 10572, 10575, 10574, 10574, 10576, 10580, 10580, 10580, 10583, 10586, 10584, 10584, 10585, 10587, 10585, 10585, 10586, 10589, 10588, 10588, 10589, 10593, 10592, 10593, 10595, 10598, 10597, 10596, 10597, 10600, 10598, 10598, 10600, 10603, 10602, 10602, 10604, 10608, 10607, 10608, 10611, 10614, 10613, 10612, 10613, 10615, 10613, 10613, 10615, 10617, 10616, 10616, 10618, 10621, 10620, 10621, 10623, 10626, 10624, 10624, 10625, 10627, 10625, 10625, 10626, 10629, 10628, 10628, 10630, 10633, 10632, 10633, 10635, 10638, 10636, 10636, 10636, 10639, 10637, 10636, 10638, 10641, 10639, 10639, 10641, 10644, 10644, 10644, 10647, 10650, 10649, 10648, 10649, 10652, 10650, 10650, 10652, 10655, 10654, 10654, 10656, 10660, 10660, 10660, 10663, 10666, 10665, 10664, 10665, 10667, 10665, 10665, 10666, 10669, 10668, 10668, 10670, 10673, 10672, 10673, 10675, 10678, 10676, 10676, 10677, 10679, 10677, 10677, 10678, 10681, 10680, 10680, 10681, 10685, 10684, 10685, 10687, 10690, 10688, 10688, 10688, 10691, 10689, 10688, 10690, 10693, 10691, 10691, 10693, 10696, 10696, 10696, 10699, 10702, 10701, 10700, 10701, 10704, 10702, 10702, 10704, 10707, 10706, 10706, 10708, 10712, 10711, 10712, 10715, 10718, 10716, 10716, 10717, 10719, 10717, 10717, 10718, 10721, 10720, 10720, 10722, 10725, 10724, 10725, 10727, 10730, 10728, 10728, 10729, 10731, 10729, 10728, 10730, 10733, 10731, 10731, 10733, 10737, 10736, 10737, 10739, 10742, 10740, 10740, 10741, 10743, 10741, 10741, 10742, 10745, 10744, 10744, 10746, 10749, 10748, 10749, 10751, 10754, 10752, 10752, 10752, 10755, 10753, 10752, 10754, 10757, 10755, 10755, 10757, 10760, 10760, 10760, 10763, 10766, 10765, 10764, 10765, 10768, 10766, 10766, 10768, 10771, 10770, 10770, 10772, 10776, 10775, 10776, 10779, 10782, 10780, 10780, 10781, 10783, 10781, 10781, 10782, 10785, 10784, 10784, 10786, 10789, 10788, 10789, 10791, 10794, 10792, 10792, 10792, 10795, 10793, 10792, 10794, 10797, 10795, 10795, 10797, 10801, 10800, 10801, 10803, 10806, 10804, 10804, 10805, 10807, 10805, 10805, 10806, 10809, 10808, 10808, 10810, 10813, 10812, 10813, 10815, 10818, 10816, 10816, 10816, 10819, 10817, 10816, 10818, 10821, 10819, 10819, 10821, 10824, 10824, 10824, 10827, 10830, 10828, 10828, 10829, 10832, 10830, 10830, 10832, 10835, 10834, 10834, 10836, 10840, 10839, 10840, 10843, 10846, 10845, 10844, 10845, 10848, 10846, 10845, 10847, 10850, 10848, 10848, 10850, 10854, 10853, 10853, 10855, 10858, 10856, 10855, 10856, 10858, 10855, 10855, 10856, 10858, 10857, 10856, 10858, 10861, 10860, 10861, 10863, 10866, 10864, 10864, 10865, 10867, 10866, 10865, 10867, 10870, 10869, 10870, 10872, 10876, 10875, 10876, 10879, 10882, 10880, 10880, 10881, 10883, 10881, 10881, 10883, 10885, 10884, 10884, 10886, 10889, 10888, 10889, 10891, 10894, 10892, 10892, 10892, 10895, 10893, 10892, 10894, 10897, 10895, 10895, 10897, 10901, 10900, 10901, 10903, 10906, 10904, 10904, 10905, 10907, 10905, 10904, 10906, 10909, 10907, 10907, 10909, 10913, 10912, 10913, 10915, 10918, 10916, 10916, 10917, 10919, 10917, 10916, 10918, 10921, 10919, 10919, 10921, 10925, 10924, 10925, 10927, 10930, 10928, 10928, 10929, 10931, 10929, 10928, 10930, 10933, 10931, 10931, 10933, 10937, 10936, 10937, 10939, 10942, 10940, 10940, 10940, 10943, 10941, 10940, 10942, 10945, 10943, 10943, 10945, 10949, 10948, 10949, 10951, 10954, 10952, 10952, 10952, 10955, 10953, 10952, 10954, 10957, 10955, 10955, 10957, 10961, 10960, 10961, 10963, 10966, 10964, 10964, 10964, 10967, 10965, 10964, 10966, 10969, 10967, 10967, 10969, 10973, 10972, 10973, 10975, 10978, 10976, 10976, 10976, 10979, 10977, 10976, 10978, 10981, 10979, 10979, 10981, 10985, 10984, 10985, 10987, 10990, 10988, 10988, 10988, 10991, 10989, 10988, 10990, 10993, 10991, 10991, 10993, 10997, 10996, 10997, 10999, 11002, 11000, 11000, 11000, 11003, 11001, 11000, 11002, 11005, 11003, 11003, 11005, 11009, 11008, 11009, 11011, 11014, 11012, 11012, 11012, 11015, 11013, 11012, 11014, 11017, 11015, 11015, 11017, 11021, 11020, 11021, 11023, 11026, 11024, 11024, 11024, 11027, 11025, 11024, 11026, 11029, 11027, 11027, 11029, 11033, 11032, 11033, 11035, 11038, 11036, 11036, 11036, 11039, 11037, 11036, 11038, 11041, 11039, 11039, 11041, 11045, 11044, 11045, 11047, 11050, 11048, 11048, 11048, 11051, 11049, 11048, 11050, 11053, 11051, 11051, 11053, 11057, 11056, 11057, 11059, 11062, 11060, 11060, 11060, 11063, 11061, 11060, 11062, 11065, 11063, 11063, 11065, 11069, 11068, 11069, 11071, 11074, 11072, 11072, 11072, 11075, 11073, 11072, 11074, 11077, 11075, 11075, 11077, 11081, 11080, 11080, 11083, 11086, 11084, 11084, 11084, 11087, 11085, 11084, 11086, 11089, 11087, 11087, 11089, 11093, 11092, 11093, 11095, 11098, 11096, 11095, 11096, 11099, 11097, 11096, 11098, 11101, 11099, 11099, 11101, 11105, 11104, 11104, 11107, 11110, 11108, 11108, 11109, 11111, 11109, 11109, 11110, 11113, 11112, 11112, 11114, 11117, 11116, 11117, 11119, 11122, 11120, 11119, 11120, 11122, 11120, 11119, 11120, 11123, 11121, 11121, 11123, 11126, 11125, 11125, 11127, 11130, 11128, 11127, 11128, 11130, 11128, 11127, 11129, 11132, 11130, 11130, 11132, 11136, 11135, 11136, 11138, 11142, 11140, 11140, 11141, 11144, 11142, 11142, 11144, 11147, 11146, 11146, 11149, 11152, 11152, 11152, 11155, 11158, 11156, 11155, 11156, 11158, 11156, 11155, 11156, 11159, 11157, 11157, 11159, 11162, 11161, 11161, 11163, 11166, 11164, 11163, 11164, 11166, 11164, 11164, 11165, 11168, 11167, 11167, 11169, 11172, 11172, 11172, 11175, 11178, 11176, 11176, 11176, 11179, 11177, 11176, 11178, 11181, 11179, 11179, 11181, 11185, 11184, 11184, 11187, 11190, 11188, 11187, 11188, 11191, 11189, 11188, 11190, 11193, 11191, 11191, 11193, 11197, 11196, 11196, 11199, 11202, 11200, 11199, 11200, 11203, 11201, 11200, 11202, 11205, 11203, 11203, 11205, 11209, 11208, 11208, 11211, 11214, 11212, 11211, 11212, 11215, 11213, 11212, 11214, 11217, 11215, 11215, 11217, 11221, 11220, 11220, 11223, 11226, 11224, 11223, 11224, 11227, 11225, 11224, 11226, 11229, 11227, 11227, 11229, 11233, 11232, 11232, 11235, 11238, 11236, 11236, 11237, 11239, 11237, 11237, 11238, 11241, 11240, 11240, 11242, 11245, 11244, 11245, 11247, 11250, 11248, 11247, 11248, 11250, 11248, 11247, 11248, 11251, 11249, 11249, 11250, 11254, 11253, 11253, 11255, 11258, 11256, 11255, 11256, 11258, 11256, 11255, 11257, 11260, 11258, 11258, 11260, 11264, 11263, 11264, 11266, 11270, 11268, 11268, 11269, 11272, 11270, 11270, 11272, 11275, 11274, 11274, 11276, 11280, 11280, 11280, 11283, 11286, 11284, 11283, 11284, 11286, 11284, 11283, 11284, 11287, 11285, 11285, 11287, 11290, 11289, 11289, 11291, 11294, 11292, 11291, 11292, 11294, 11292, 11292, 11293, 11296, 11295, 11295, 11297, 11300, 11300, 11300, 11303, 11306, 11304, 11303, 11304, 11307, 11305, 11304, 11306, 11309, 11307, 11307, 11309, 11313, 11312, 11312, 11315, 11318, 11316, 11315, 11316, 11318, 11316, 11316, 11317, 11321, 11319, 11319, 11321, 11324, 11324, 11324, 11327, 11330, 11328, 11328, 11329, 11331, 11329, 11329, 11330, 11333, 11332, 11332, 11334, 11337, 11336, 11337, 11339, 11342, 11340, 11339, 11339, 11341, 11339, 11338, 11339, 11342, 11340, 11340, 11342, 11345, 11344, 11344, 11347, 11350, 11348, 11348, 11349, 11351, 11350, 11349, 11351, 11355, 11353, 11354, 11356, 11360, 11359, 11360, 11362, 11366, 11364, 11363, 11364, 11366, 11364, 11363, 11364, 11367, 11365, 11365, 11367, 11370, 11369, 11369, 11371, 11374, 11372, 11371, 11372, 11374, 11372, 11371, 11373, 11376, 11375, 11375, 11377, 11380, 11379, 11380, 11382, 11386, 11384, 11383, 11384, 11387, 11385, 11384, 11386, 11389, 11387, 11387, 11389, 11393, 11392, 11392, 11395, 11398, 11396, 11395, 11396, 11398, 11396, 11396, 11397, 11400, 11399, 11399, 11401, 11404, 11404, 11404, 11407, 11410, 11408, 11407, 11408, 11411, 11409, 11408, 11410, 11413, 11412, 11411, 11413, 11417, 11416, 11417, 11419, 11422, 11420, 11419, 11420, 11422, 11419, 11419, 11420, 11423, 11421, 11420, 11422, 11425, 11424, 11425, 11427, 11430, 11428, 11427, 11428, 11430, 11428, 11428, 11429, 11432, 11431, 11431, 11433, 11436, 11436, 11436, 11438, 11442, 11440, 11439, 11440, 11443, 11441, 11440, 11442, 11445, 11443, 11443, 11445, 11449, 11448, 11448, 11451, 11454, 11452, 11451, 11452, 11455, 11453, 11452, 11454, 11457, 11455, 11455, 11457, 11461, 11460, 11461, 11463, 11466, 11464, 11463, 11464, 11466, 11463, 11463, 11464, 11467, 11465, 11464, 11466, 11469, 11468, 11469, 11471, 11474, 11472, 11471, 11472, 11474, 11472, 11472, 11473, 11476, 11475, 11475, 11477, 11480, 11480, 11480, 11482, 11486, 11484, 11483, 11484, 11487, 11484, 11484, 11485, 11489, 11487, 11487, 11489, 11492, 11492, 11492, 11494, 11498, 11496, 11495, 11496, 11499, 11497, 11496, 11498, 11501, 11500, 11500, 11501, 11505, 11504, 11505, 11507, 11510, 11508, 11507, 11507, 11509, 11507, 11506, 11507, 11510, 11508, 11508, 11510, 11513, 11512, 11512, 11515, 11518, 11516, 11516, 11517, 11519, 11518, 11517, 11519, 11523, 11521, 11522, 11524, 11528, 11527, 11528, 11530, 11534, 11532, 11531, 11532, 11534, 11532, 11531, 11532, 11535, 11533, 11533, 11535, 11538, 11537, 11537, 11539, 11542, 11540, 11539, 11540, 11542, 11540, 11539, 11541, 11544, 11542, 11542, 11544, 11548, 11547, 11548, 11550, 11554, 11552, 11551, 11552, 11555, 11552, 11552, 11554, 11557, 11555, 11555, 11557, 11561, 11560, 11560, 11562, 11566, 11564, 11563, 11564, 11567, 11565, 11564, 11566, 11569, 11567, 11567, 11569, 11573, 11572, 11572, 11575, 11578, 11576, 11575, 11576, 11578, 11575, 11574, 11576, 11579, 11577, 11576, 11578, 11581, 11580, 11581, 11583, 11586, 11584, 11583, 11584, 11586, 11584, 11583, 11585, 11588, 11587, 11587, 11589, 11592, 11591, 11592, 11594, 11598, 11596, 11595, 11596, 11599, 11596, 11596, 11597, 11601, 11599, 11599, 11601, 11604, 11604, 11604, 11606, 11610, 11608, 11607, 11608, 11611, 11609, 11608, 11610, 11613, 11611, 11611, 11613, 11617, 11616, 11616, 11619, 11622, 11620, 11619, 11620, 11622, 11619, 11618, 11620, 11623, 11621, 11620, 11622, 11625, 11624, 11625, 11627, 11630, 11628, 11627, 11628, 11630, 11628, 11627, 11629, 11632, 11630, 11630, 11632, 11636, 11635, 11636, 11638, 11642, 11640, 11639, 11640, 11643, 11641, 11640, 11642, 11645, 11643, 11643, 11645, 11649, 11648, 11648, 11651, 11654, 11652, 11651, 11651, 11654, 11651, 11650, 11652, 11655, 11653, 11652, 11654, 11657, 11656, 11657, 11659, 11662, 11660, 11659, 11660, 11662, 11660, 11659, 11661, 11664, 11663, 11662, 11665, 11668, 11667, 11668, 11670, 11674, 11672, 11671, 11672, 11674, 11672, 11672, 11673, 11677, 11675, 11675, 11677, 11680, 11680, 11680, 11682, 11686, 11684, 11683, 11684, 11687, 11685, 11684, 11686, 11689, 11687, 11687, 11689, 11693, 11692, 11692, 11695, 11698, 11696, 11695, 11696, 11698, 11696, 11695, 11696, 11699, 11697, 11697, 11699, 11702, 11701, 11701, 11703, 11706, 11704, 11702, 11703, 11705, 11702, 11701, 11703, 11706, 11704, 11703, 11705, 11709, 11708, 11708, 11710, 11714, 11712, 11711, 11713, 11715, 11713, 11713, 11715, 11718, 11717, 11717, 11720, 11724, 11723, 11724, 11726, 11730, 11728, 11727, 11728, 11730, 11728, 11727, 11729, 11731, 11730, 11729, 11731, 11734, 11733, 11733, 11735, 11738, 11736, 11734, 11735, 11737, 11735, 11734, 11735, 11738, 11736, 11736, 11738, 11741, 11740, 11740, 11743, 11746, 11744, 11743, 11744, 11746, 11744, 11744, 11745, 11748, 11747, 11747, 11749, 11752, 11751, 11752, 11754, 11758, 11756, 11755, 11756, 11758, 11756, 11756, 11757, 11760, 11759, 11759, 11761, 11764, 11764, 11764, 11766, 11770, 11768, 11767, 11768, 11771, 11769, 11768, 11770, 11773, 11771, 11771, 11773, 11777, 11776, 11776, 11779, 11782, 11780, 11779, 11779, 11782, 11779, 11778, 11780, 11782, 11781, 11780, 11782, 11785, 11784, 11785, 11787, 11790, 11788, 11787, 11788, 11790, 11788, 11787, 11789, 11792, 11790, 11790, 11792, 11796, 11795, 11796, 11798, 11802, 11800, 11799, 11800, 11803, 11801, 11800, 11802, 11805, 11803, 11803, 11805, 11809, 11808, 11808, 11811, 11814, 11812, 11811, 11811, 11813, 11811, 11810, 11811, 11814, 11812, 11812, 11814, 11817, 11816, 11816, 11819, 11822, 11820, 11819, 11820, 11822, 11820, 11820, 11821, 11824, 11823, 11823, 11825, 11829, 11828, 11828, 11830, 11834, 11832, 11831, 11831, 11834, 11831, 11830, 11832, 11834, 11833, 11832, 11834, 11837, 11836, 11836, 11839, 11842, 11840, 11839, 11840, 11842, 11840, 11840, 11841, 11844, 11843, 11843, 11845, 11848, 11848, 11848, 11850, 11854, 11852, 11851, 11851, 11854, 11851, 11850, 11852, 11855, 11853, 11852, 11854, 11857, 11856, 11857, 11859, 11862, 11860, 11859, 11860, 11862, 11860, 11859, 11861, 11864, 11862, 11862, 11864, 11868, 11867, 11868, 11870, 11874, 11872, 11871, 11872, 11875, 11873, 11872, 11874, 11877, 11875, 11875, 11877, 11881, 11880, 11880, 11883, 11886, 11884, 11883, 11883, 11885, 11883, 11882, 11884, 11886, 11884, 11884, 11886, 11889, 11888, 11888, 11891, 11894, 11892, 11891, 11892, 11894, 11892, 11891, 11893, 11896, 11894, 11894, 11896, 11900, 11899, 11900, 11902, 11906, 11904, 11903, 11904, 11907, 11905, 11904, 11906, 11909, 11907, 11907, 11909, 11913, 11912, 11912, 11914, 11918, 11916, 11915, 11916, 11918, 11915, 11915, 11916, 11919, 11917, 11917, 11918, 11922, 11920, 11921, 11923, 11926, 11924, 11922, 11923, 11925, 11923, 11922, 11923, 11926, 11924, 11924, 11926, 11929, 11928, 11928, 11930, 11934, 11932, 11931, 11932, 11934, 11932, 11931, 11933, 11936, 11934, 11934, 11936, 11940, 11939, 11940, 11942, 11946, 11944, 11943, 11944, 11947, 11945, 11944, 11946, 11949, 11947, 11947, 11949, 11953, 11952, 11952, 11955, 11958, 11956, 11955, 11955, 11957, 11955, 11954, 11955, 11958, 11956, 11956, 11958, 11961, 11960, 11960, 11962, 11966, 11964, 11963, 11964, 11966, 11964, 11964, 11965, 11968, 11967, 11967, 11969, 11972, 11972, 11972, 11974, 11978, 11976, 11975, 11975, 11977, 11975, 11974, 11975, 11978, 11976, 11976, 11978, 11981, 11980, 11980, 11982, 11986, 11984, 11983, 11984, 11986, 11984, 11984, 11985, 11988, 11987, 11987, 11989, 11992, 11992, 11992, 11994, 11998, 11996, 11995, 11995, 11997, 11995, 11994, 11995, 11998, 11996, 11996, 11998, 12001, 12000, 12000, 12002, 12006, 12004, 12003, 12004, 12006, 12004, 12004, 12005, 12008, 12007, 12007, 12009, 12012, 12012, 12012, 12014, 12018, 12016, 12015, 12015, 12018, 12015, 12014, 12016, 12019, 12017, 12016, 12018, 12021, 12020, 12020, 12023, 12026, 12024, 12023, 12024, 12026, 12024, 12023, 12025, 12028, 12026, 12026, 12028, 12032, 12031, 12032, 12034, 12038, 12036, 12035, 12036, 12039, 12036, 12036, 12038, 12041, 12039, 12039, 12041, 12045, 12044, 12044, 12046, 12050, 12048, 12047, 12047, 12050, 12047, 12047, 12048, 12051, 12049, 12048, 12050, 12054, 12052, 12053, 12055, 12058, 12055, 12054, 12055, 12057, 12054, 12054, 12055, 12058, 12056, 12055, 12057, 12061, 12060, 12060, 12062, 12066, 12064, 12063, 12064, 12066, 12064, 12064, 12065, 12068, 12067, 12067, 12069, 12073, 12072, 12072, 12074, 12078, 12076, 12075, 12075, 12077, 12075, 12074, 12075, 12078, 12076, 12076, 12078, 12081, 12080, 12080, 12082, 12086, 12084, 12083, 12084, 12086, 12084, 12083, 12085, 12088, 12087, 12087, 12089, 12092, 12092, 12092, 12094, 12098, 12096, 12095, 12095, 12097, 12095, 12094, 12095, 12098, 12096, 12096, 12098, 12101, 12100, 12100, 12102, 12106, 12104, 12103, 12104, 12106, 12104, 12103, 12105, 12108, 12107, 12107, 12109, 12112, 12112, 12112, 12114, 12118, 12116, 12115, 12115, 12117, 12115, 12114, 12115, 12118, 12116, 12116, 12118, 12121, 12120, 12120, 12122, 12126, 12124, 12123, 12124, 12126, 12124, 12123, 12125, 12128, 12126, 12126, 12129, 12132, 12131, 12132, 12134, 12138, 12136, 12135, 12136, 12138, 12135, 12135, 12136, 12139, 12137, 12137, 12138, 12142, 12140, 12141, 12143, 12146, 12143, 12142, 12143, 12145, 12142, 12142, 12143, 12146, 12144, 12144, 12145, 12149, 12148, 12148, 12150, 12154, 12152, 12151, 12152, 12154, 12152, 12151, 12153, 12156, 12154, 12154, 12156, 12160, 12159, 12160, 12162, 12166, 12164, 12163, 12164, 12167, 12164, 12164, 12165, 12169, 12167, 12167, 12169, 12173, 12172, 12172, 12174, 12178, 12176, 12175, 12175, 12178, 12175, 12174, 12176, 12179, 12177, 12176, 12178, 12182, 12180, 12181, 12183, 12186, 12183, 12182, 12183, 12185, 12182, 12181, 12183, 12186, 12184, 12183, 12185, 12189, 12188, 12188, 12190, 12194, 12192, 12191, 12192, 12194, 12192, 12191, 12193, 12196, 12195, 12195, 12197, 12200, 12199, 12200, 12202, 12206, 12204, 12203, 12203, 12206, 12203, 12203, 12204, 12207, 12205, 12204, 12206, 12210, 12208, 12209, 12211, 12214, 12211, 12210, 12211, 12213, 12210, 12209, 12211, 12214, 12212, 12211, 12213, 12217, 12216, 12216, 12218, 12222, 12220, 12219, 12220, 12222, 12220, 12219, 12221, 12224, 12223, 12222, 12225, 12228, 12227, 12228, 12230, 12234, 12232, 12231, 12231, 12234, 12231, 12230, 12232, 12235, 12233, 12232, 12234, 12238, 12236, 12237, 12239, 12242, 12239, 12238, 12239, 12241, 12238, 12237, 12239, 12242, 12240, 12239, 12241, 12245, 12244, 12244, 12246, 12250, 12248, 12247, 12248, 12250, 12248, 12247, 12249, 12252, 12251, 12250, 12253, 12256, 12255, 12256, 12258, 12262, 12260, 12259, 12259, 12262, 12259, 12258, 12260, 12263, 12261, 12260, 12262, 12266, 12264, 12265, 12267, 12270, 12267, 12266, 12267, 12269, 12266, 12265, 12267, 12270, 12268, 12267, 12269, 12273, 12272, 12272, 12274, 12278, 12276, 12275, 12276, 12278, 12276, 12275, 12277, 12280, 12279, 12279, 12281, 12284, 12284, 12284, 12286, 12290, 12288, 12286, 12287, 12289, 12287, 12286, 12287, 12290, 12288, 12288, 12290, 12293, 12292, 12292, 12294, 12298, 12296, 12295, 12296, 12298, 12296, 12295, 12297, 12300, 12299, 12298, 12301, 12304, 12303, 12304, 12306, 12310, 12308, 12306, 12307, 12309, 12307, 12306, 12307, 12310, 12308, 12308, 12310, 12313, 12312, 12312, 12314, 12318, 12316, 12315, 12316, 12318, 12316, 12315, 12317, 12320, 12318, 12318, 12320, 12324, 12323, 12324, 12326, 12330, 12328, 12327, 12327, 12330, 12327, 12326, 12328, 12331, 12329, 12328, 12330, 12334, 12332, 12333, 12335, 12338, 12335, 12334, 12335, 12337, 12334, 12333, 12335, 12338, 12336, 12335, 12337, 12341, 12340, 12340, 12342, 12346, 12344, 12343, 12344, 12346, 12344, 12343, 12345, 12348, 12346, 12346, 12349, 12352, 12351, 12352, 12354, 12358, 12356, 12355, 12355, 12358, 12355, 12354, 12356, 12359, 12357, 12356, 12358, 12362, 12360, 12361, 12363, 12366, 12363, 12362, 12363, 12365, 12362, 12361, 12363, 12366, 12364, 12363, 12365, 12369, 12368, 12368, 12370, 12374, 12372, 12371, 12372, 12374, 12372, 12371, 12373, 12376, 12374, 12374, 12376, 12380, 12379, 12380, 12382, 12386, 12384, 12383, 12383, 12386, 12383, 12382, 12384, 12387, 12385, 12384, 12386, 12390, 12388, 12388, 12391, 12394, 12391, 12390, 12391, 12393, 12390, 12389, 12391, 12394, 12392, 12391, 12393, 12397, 12396, 12396, 12398, 12402, 12400, 12399, 12400, 12402, 12400, 12399, 12401, 12404, 12402, 12402, 12404, 12408, 12407, 12408, 12410, 12414, 12412, 12411, 12411, 12414, 12411, 12410, 12412, 12415, 12413, 12412, 12414, 12417, 12416, 12416, 12418, 12422, 12419, 12418, 12419, 12421, 12418, 12418, 12419, 12422, 12420, 12420, 12421, 12425, 12424, 12424, 12426, 12430, 12427, 12426, 12427, 12429, 12427, 12426, 12427, 12430, 12428, 12428, 12430, 12433, 12432, 12432, 12434, 12438, 12435, 12434, 12435, 12437, 12434, 12433, 12435, 12438, 12436, 12435, 12437, 12441, 12440, 12440, 12442, 12446, 12444, 12443, 12444, 12446, 12444, 12443, 12445, 12448, 12446, 12446, 12448, 12452, 12451, 12452, 12454, 12458, 12456, 12455, 12455, 12458, 12455, 12454, 12456, 12459, 12457, 12456, 12458, 12462, 12460, 12460, 12462, 12466, 12463, 12462, 12463, 12465, 12462, 12461, 12463, 12466, 12464, 12463, 12465, 12469, 12468, 12468, 12470, 12474, 12472, 12471, 12472, 12474, 12472, 12471, 12473, 12476, 12474, 12474, 12476, 12480, 12479, 12480, 12482, 12486, 12484, 12483, 12483, 12486, 12483, 12482, 12484, 12487, 12485, 12484, 12486, 12490, 12488, 12488, 12490, 12494, 12491, 12490, 12491, 12493, 12490, 12489, 12491, 12494, 12492, 12491, 12493, 12497, 12496, 12496, 12498, 12502, 12500, 12499, 12500, 12502, 12500, 12499, 12501, 12504, 12502, 12502, 12504, 12508, 12507, 12508, 12510, 12514, 12511, 12510, 12511, 12513, 12511, 12510, 12512, 12515, 12512, 12512, 12514, 12517, 12516, 12516, 12518, 12522, 12519, 12518, 12519, 12521, 12519, 12518, 12519, 12522, 12520, 12520, 12522, 12525, 12524, 12524, 12526, 12530, 12527, 12526, 12527, 12529, 12526, 12525, 12527, 12530, 12528, 12527, 12529, 12533, 12532, 12532, 12534, 12538, 12536, 12535, 12536, 12538, 12536, 12535, 12537, 12540, 12538, 12538, 12540, 12544, 12543, 12544, 12546, 12550, 12547, 12546, 12547, 12550, 12547, 12546, 12548, 12551, 12548, 12548, 12550, 12553, 12552, 12552, 12554, 12558, 12555, 12554, 12555, 12557, 12554, 12554, 12555, 12558, 12556, 12556, 12557, 12561, 12560, 12560, 12562, 12566, 12563, 12562, 12563, 12565, 12563, 12562, 12563, 12566, 12564, 12564, 12566, 12569, 12568, 12568, 12570, 12574, 12571, 12570, 12571, 12573, 12570, 12569, 12571, 12574, 12572, 12571, 12573, 12577, 12576, 12576, 12578, 12582, 12580, 12579, 12580, 12582, 12580, 12579, 12581, 12584, 12582, 12582, 12584, 12588, 12587, 12588, 12590, 12594, 12591, 12590, 12591, 12594, 12591, 12590, 12592, 12595, 12593, 12592, 12594, 12597, 12596, 12596, 12598, 12602, 12599, 12598, 12599, 12601, 12598, 12597, 12598, 12602, 12599, 12599, 12601, 12605, 12603, 12604, 12606, 12610, 12608, 12607, 12608, 12610, 12608, 12607, 12609, 12612, 12610, 12610, 12612, 12616, 12615, 12616, 12618, 12622, 12619, 12618, 12619, 12621, 12619, 12618, 12619, 12622, 12620, 12620, 12622, 12625, 12624, 12624, 12626, 12630, 12627, 12626, 12627, 12629, 12627, 12626, 12627, 12630, 12628, 12628, 12630, 12633, 12632, 12632, 12634, 12638, 12635, 12634, 12635, 12637, 12634, 12633, 12634, 12637, 12635, 12635, 12637, 12641, 12639, 12640, 12642, 12646, 12644, 12643, 12644, 12646, 12644, 12644, 12645, 12649, 12647, 12647, 12649, 12653, 12652, 12652, 12654, 12658, 12655, 12654, 12654, 12656, 12653, 12652, 12653, 12656, 12654, 12653, 12655, 12658, 12656, 12656, 12658, 12662, 12659, 12658, 12659, 12661, 12659, 12658, 12660, 12663, 12662, 12662, 12664, 12668, 12667, 12668, 12670, 12674, 12672, 12671, 12671, 12674, 12671, 12670, 12672, 12675, 12673, 12672, 12674, 12678, 12676, 12676, 12678, 12682, 12679, 12678, 12679, 12681, 12678, 12677, 12678, 12681, 12679, 12679, 12681, 12685, 12683, 12684, 12686, 12690, 12687, 12687, 12687, 12690, 12688, 12687, 12689, 12692, 12690, 12690, 12692, 12696, 12695, 12696, 12698, 12702, 12699, 12698, 12699, 12701, 12699, 12698, 12699, 12702, 12700, 12700, 12702, 12705, 12704, 12704, 12706, 12710, 12707, 12706, 12707, 12709, 12706, 12705, 12707, 12710, 12708, 12707, 12709, 12713, 12712, 12712, 12714, 12718, 12715, 12714, 12715, 12717, 12714, 12714, 12715, 12718, 12716, 12716, 12717, 12721, 12720, 12720, 12722, 12726, 12723, 12722, 12723, 12725, 12723, 12722, 12723, 12726, 12724, 12724, 12726, 12729, 12728, 12728, 12730, 12734, 12731, 12730, 12731, 12733, 12730, 12729, 12731, 12734, 12732, 12731, 12733, 12737, 12735, 12736, 12738, 12742, 12739, 12738, 12739, 12742, 12739, 12739, 12740, 12744, 12742, 12742, 12744, 12748, 12747, 12748, 12750, 12754, 12751, 12751, 12751, 12754, 12751, 12750, 12752, 12755, 12753, 12752, 12754, 12758, 12756, 12757, 12758, 12762, 12759, 12757, 12758, 12760, 12757, 12756, 12757, 12759, 12757, 12756, 12758, 12761, 12760, 12760, 12762, 12766, 12763, 12762, 12763, 12766, 12763, 12763, 12764, 12768, 12766, 12766, 12768, 12772, 12771, 12772, 12774, 12778, 12775, 12774, 12775, 12778, 12775, 12774, 12776, 12779, 12777, 12776, 12778, 12782, 12780, 12780, 12782, 12786, 12783, 12782, 12782, 12785, 12782, 12781, 12782, 12785, 12783, 12783, 12785, 12788, 12787, 12788, 12790, 12794, 12791, 12791, 12792, 12794, 12792, 12791, 12793, 12796, 12795, 12795, 12797, 12801, 12799, 12800, 12802, 12806, 12803, 12802, 12803, 12805, 12802, 12801, 12802, 12805, 12802, 12801, 12803, 12806, 12805, 12805, 12807, 12810, 12807, 12806, 12806, 12808, 12806, 12805, 12806, 12809, 12807, 12807, 12809, 12812, 12811, 12812, 12814, 12818, 12815, 12815, 12816, 12818, 12816, 12815, 12817, 12820, 12818, 12818, 12820, 12824, 12823, 12824, 12826, 12830, 12827, 12826, 12827, 12829, 12827, 12826, 12827, 12830, 12828, 12828, 12830, 12833, 12832, 12832, 12834, 12838, 12835, 12834, 12835, 12837, 12834, 12833, 12835, 12838, 12836, 12835, 12837, 12841, 12840, 12840, 12842, 12846, 12843, 12842, 12843, 12845, 12842, 12841, 12843, 12846, 12844, 12843, 12845, 12849, 12848, 12848, 12850, 12854, 12851, 12850, 12851, 12853, 12850, 12850, 12851, 12854, 12852, 12852, 12853, 12857, 12856, 12856, 12858, 12862, 12859, 12858, 12858, 12861, 12858, 12857, 12858, 12861, 12859, 12859, 12861, 12864, 12863, 12864, 12866, 12870, 12867, 12867, 12868, 12870, 12868, 12867, 12869, 12873, 12871, 12871, 12873, 12877, 12876, 12876, 12878, 12882, 12879, 12878, 12878, 12880, 12877, 12876, 12877, 12880, 12878, 12877, 12878, 12882, 12880, 12880, 12882, 12886, 12883, 12882, 12883, 12885, 12883, 12882, 12884, 12887, 12885, 12885, 12888, 12892, 12891, 12891, 12894, 12898, 12895, 12895, 12895, 12898, 12895, 12895, 12896, 12899, 12897, 12897, 12898, 12902, 12900, 12901, 12902, 12906, 12903, 12901, 12902, 12904, 12901, 12899, 12901, 12903, 12901, 12900, 12902, 12905, 12904, 12904, 12906, 12910, 12907, 12906, 12907, 12910, 12907, 12906, 12908, 12912, 12910, 12910, 12912, 12916, 12915, 12915, 12918, 12922, 12919, 12918, 12919, 12921, 12919, 12918, 12919, 12923, 12920, 12920, 12922, 12925, 12924, 12924, 12926, 12930, 12927, 12926, 12927, 12929, 12926, 12925, 12927, 12930, 12928, 12927, 12929, 12933, 12932, 12932, 12934, 12938, 12935, 12934, 12935, 12937, 12934, 12933, 12935, 12938, 12936, 12935, 12937, 12941, 12940, 12940, 12942, 12946, 12943, 12942, 12943, 12945, 12942, 12942, 12943, 12946, 12944, 12944, 12945, 12949, 12948, 12948, 12950, 12954, 12951, 12950, 12950, 12953, 12950, 12949, 12950, 12953, 12951, 12951, 12953, 12956, 12955, 12956, 12958, 12962, 12959, 12958, 12960, 12962, 12960, 12959, 12961, 12964, 12962, 12962, 12965, 12968, 12967, 12968, 12970, 12974, 12971, 12970, 12970, 12973, 12970, 12969, 12970, 12973, 12970, 12969, 12971, 12974, 12973, 12973, 12974, 12978, 12975, 12973, 12974, 12976, 12973, 12972, 12974, 12977, 12975, 12974, 12976, 12980, 12979, 12979, 12982, 12986, 12983, 12983, 12984, 12986, 12984, 12983, 12985, 12989, 12987, 12987, 12989, 12993, 12992, 12992, 12994, 12998, 12995, 12994, 12994, 12996, 12993, 12992, 12993, 12996, 12993, 12993, 12994, 12998, 12996, 12996, 12998, 13002, 12999, 12998, 12999, 13001, 12999, 12998, 13000, 13003, 13001, 13001, 13004, 13008, 13007, 13007, 13010, 13014, 13011, 13010, 13011, 13013, 13011, 13010, 13011, 13014, 13012, 13012, 13014, 13017, 13016, 13016, 13018, 13022, 13019, 13018, 13019, 13021, 13018, 13017, 13019, 13022, 13020, 13019, 13021, 13025, 13024, 13024, 13026, 13030, 13027, 13026, 13027, 13029, 13026, 13025, 13027, 13030, 13028, 13027, 13029, 13033, 13032, 13032, 13034, 13038, 13035, 13034, 13035, 13037, 13034, 13033, 13035, 13038, 13036, 13035, 13037, 13041, 13040, 13040, 13042, 13046, 13043, 13042, 13043, 13045, 13042, 13041, 13043, 13046, 13044, 13043, 13045, 13049, 13048, 13048, 13050, 13054, 13051, 13050, 13051, 13053, 13050, 13049, 13051, 13054, 13052, 13051, 13053, 13057, 13056, 13056, 13058, 13062, 13059, 13058, 13059, 13061, 13058, 13057, 13059, 13062, 13060, 13059, 13061, 13065, 13064, 13064, 13066, 13070, 13067, 13066, 13067, 13069, 13066, 13065, 13067, 13070, 13068, 13067, 13069, 13073, 13072, 13072, 13074, 13078, 13075, 13074, 13075, 13077, 13074, 13073, 13075, 13078, 13076, 13075, 13077, 13081, 13080, 13080, 13082, 13086, 13083, 13082, 13083, 13085, 13082, 13081, 13083, 13086, 13084, 13083, 13085, 13089, 13088, 13088, 13090, 13094, 13091, 13090, 13090, 13093, 13090, 13089, 13090, 13093, 13091, 13091, 13093, 13096, 13095, 13096, 13098, 13102, 13099, 13098, 13099, 13102, 13100, 13099, 13101, 13104, 13102, 13102, 13104, 13108, 13107, 13108, 13110, 13114, 13111, 13110, 13110, 13112, 13110, 13108, 13110, 13112, 13110, 13109, 13111, 13114, 13113, 13112, 13114, 13118, 13115, 13113, 13114, 13116, 13113, 13112, 13114, 13117, 13115, 13114, 13116, 13120, 13119, 13119, 13122, 13126, 13123, 13122, 13123, 13126, 13123, 13123, 13124, 13128, 13126, 13126, 13128, 13132, 13131, 13131, 13134, 13138, 13135, 13134, 13135, 13138, 13135, 13134, 13136, 13139, 13137, 13136, 13138, 13142, 13140, 13140, 13142, 13146, 13143, 13141, 13142, 13144, 13141, 13139, 13140, 13143, 13141, 13140, 13142, 13145, 13144, 13144, 13146, 13150, 13147, 13146, 13147, 13149, 13147, 13146, 13148, 13151, 13149, 13149, 13152, 13156, 13155, 13155, 13158, 13162, 13159, 13158, 13159, 13162, 13159, 13158, 13160, 13163, 13161, 13160, 13162, 13166, 13164, 13164, 13166, 13170, 13167, 13165, 13166, 13168, 13165, 13163, 13164, 13167, 13165, 13164, 13166, 13169, 13168, 13168, 13170, 13174, 13171, 13170, 13171, 13173, 13171, 13170, 13172, 13175, 13174, 13173, 13176, 13180, 13179, 13179, 13182, 13186, 13183, 13182, 13183, 13185, 13183, 13182, 13183, 13186, 13184, 13184, 13186, 13189, 13188, 13188, 13190, 13194, 13191, 13190, 13190, 13193, 13190, 13189, 13190, 13194, 13191, 13191, 13193, 13197, 13195, 13196, 13198, 13202, 13199, 13198, 13199, 13201, 13198, 13197, 13199, 13202, 13200, 13199, 13201, 13205, 13204, 13204, 13206, 13210, 13207, 13206, 13207, 13209, 13206, 13205, 13207, 13210, 13208, 13207, 13209, 13213, 13212, 13212, 13214, 13218, 13215, 13214, 13215, 13217, 13214, 13213, 13215, 13218, 13216, 13215, 13217, 13221, 13220, 13220, 13222, 13226, 13223, 13222, 13223, 13225, 13222, 13221, 13223, 13226, 13224, 13223, 13225, 13229, 13228, 13228, 13230, 13234, 13231, 13230, 13231, 13233, 13230, 13229, 13231, 13234, 13232, 13231, 13233, 13237, 13236, 13236, 13238, 13242, 13239, 13238, 13239, 13241, 13238, 13237, 13239, 13242, 13240, 13239, 13241, 13245, 13244, 13244, 13246, 13250, 13247, 13246, 13247, 13249, 13246, 13245, 13247, 13250, 13248, 13247, 13249, 13253, 13252, 13252, 13254, 13258, 13255, 13254, 13255, 13257, 13254, 13253, 13255, 13258, 13256, 13255, 13257, 13261, 13260, 13260, 13262, 13266, 13263, 13262, 13263, 13265, 13262, 13261, 13263, 13266, 13264, 13263, 13265, 13269, 13268, 13268, 13270, 13274, 13271, 13270, 13271, 13273, 13270, 13269, 13271, 13274, 13272, 13271, 13273, 13277, 13276, 13276, 13278, 13282, 13279, 13278, 13279, 13281, 13278, 13277, 13279, 13282, 13280, 13279, 13281, 13285, 13284, 13284, 13286, 13290, 13287, 13286, 13287, 13289, 13286, 13285, 13287, 13290, 13288, 13287, 13289, 13293, 13292, 13292, 13294, 13298, 13295, 13294, 13295, 13297, 13294, 13293, 13295, 13298, 13296, 13295, 13297, 13301, 13300, 13300, 13302, 13306, 13303, 13302, 13303, 13305, 13302, 13301, 13303, 13306, 13304, 13303, 13305, 13309, 13308, 13308, 13310, 13314, 13311, 13310, 13310, 13313, 13310, 13309, 13311, 13314, 13312, 13311, 13313, 13317, 13315, 13316, 13318, 13322, 13319, 13318, 13318, 13321, 13318, 13317, 13319, 13322, 13320, 13319, 13321, 13325, 13323, 13324, 13326, 13330, 13327, 13326, 13326, 13329, 13326, 13325, 13327, 13330, 13328, 13327, 13329, 13333, 13331, 13332, 13334, 13338, 13335, 13334, 13334, 13337, 13334, 13333, 13335, 13338, 13336, 13335, 13337, 13341, 13339, 13340, 13342, 13346, 13343, 13342, 13342, 13345, 13342, 13341, 13343, 13346, 13344, 13343, 13345, 13349, 13347, 13348, 13350, 13354, 13351, 13350, 13350, 13353, 13350, 13349, 13351, 13354, 13352, 13351, 13353, 13357, 13355, 13356, 13358, 13362, 13359, 13358, 13358, 13361, 13358, 13357, 13359, 13362, 13360, 13359, 13361, 13365, 13363, 13364, 13366, 13370, 13367, 13366, 13366, 13369, 13366, 13365, 13367, 13370, 13368, 13367, 13369, 13373, 13371, 13372, 13374, 13378, 13375, 13374, 13374, 13377, 13374, 13373, 13375, 13378, 13376, 13375, 13377, 13381, 13379, 13380, 13382, 13386, 13383, 13382, 13382, 13385, 13382, 13381, 13382, 13386, 13383, 13383, 13385, 13389, 13387, 13388, 13390, 13394, 13391, 13390, 13390, 13393, 13390, 13389, 13390, 13394, 13391, 13391, 13393, 13397, 13395, 13396, 13398, 13402, 13399, 13398, 13398, 13401, 13398, 13397, 13398, 13402, 13399, 13399, 13401, 13405, 13403, 13404, 13406, 13410, 13407, 13406, 13406, 13409, 13406, 13405, 13407, 13410, 13408, 13407, 13409, 13413, 13411, 13412, 13414, 13417, 13415, 13414, 13414, 13417, 13414, 13413, 13414, 13418, 13415, 13415, 13417, 13421, 13419, 13420, 13422, 13425, 13423, 13422, 13423, 13425, 13422, 13422, 13423, 13426, 13424, 13424, 13426, 13429, 13428, 13428, 13430, 13433, 13431, 13429, 13430, 13432, 13429, 13427, 13428, 13431, 13429, 13428, 13430, 13433, 13432, 13432, 13434, 13437, 13435, 13434, 13435, 13437, 13435, 13434, 13436, 13439, 13437, 13437, 13439, 13443, 13442, 13443, 13446, 13449, 13447, 13446, 13447, 13450, 13447, 13446, 13448, 13451, 13449, 13448, 13450, 13454, 13452, 13452, 13454, 13457, 13455, 13453, 13453, 13455, 13452, 13451, 13452, 13455, 13453, 13452, 13454, 13457, 13456, 13456, 13458, 13461, 13459, 13458, 13459, 13461, 13459, 13458, 13460, 13463, 13461, 13461, 13463, 13467, 13466, 13467, 13470, 13473, 13471, 13470, 13471, 13474, 13471, 13470, 13472, 13475, 13473, 13472, 13474, 13478, 13476, 13476, 13478, 13481, 13479, 13477, 13477, 13479, 13476, 13475, 13476, 13479, 13476, 13476, 13477, 13481, 13480, 13480, 13482, 13485, 13483, 13482, 13483, 13486, 13483, 13482, 13484, 13488, 13486, 13486, 13488, 13492, 13491, 13491, 13494, 13497, 13495, 13494, 13494, 13496, 13493, 13492, 13493, 13496, 13494, 13493, 13495, 13498, 13496, 13496, 13498, 13501, 13499, 13497, 13498, 13500, 13497, 13496, 13497, 13500, 13498, 13498, 13500, 13504, 13503, 13503, 13506, 13509, 13507, 13506, 13507, 13510, 13508, 13507, 13509, 13512, 13510, 13510, 13512, 13516, 13515, 13516, 13518, 13521, 13519, 13518, 13518, 13520, 13517, 13516, 13517, 13520, 13518, 13517, 13518, 13522, 13520, 13520, 13522, 13525, 13523, 13521, 13522, 13524, 13521, 13520, 13522, 13525, 13523, 13522, 13524, 13528, 13527, 13528, 13530, 13533, 13531, 13530, 13530, 13533, 13530, 13529, 13531, 13534, 13532, 13531, 13533, 13537, 13535, 13536, 13538, 13541, 13539, 13538, 13538, 13541, 13538, 13537, 13538, 13542, 13539, 13539, 13541, 13545, 13543, 13544, 13546, 13549, 13547, 13546, 13546, 13549, 13546, 13545, 13546, 13550, 13547, 13547, 13549, 13553, 13551, 13552, 13554, 13557, 13555, 13554, 13554, 13557, 13554, 13553, 13554, 13558, 13555, 13555, 13557, 13561, 13559, 13560, 13562, 13565, 13563, 13562, 13562, 13565, 13562, 13561, 13562, 13566, 13563, 13563, 13565, 13569, 13567, 13568, 13570, 13573, 13571, 13570, 13570, 13573, 13570, 13569, 13570, 13574, 13571, 13571, 13573, 13577, 13575, 13576, 13578, 13581, 13579, 13578, 13578, 13581, 13578, 13577, 13578, 13582, 13579, 13579, 13581, 13585, 13583, 13584, 13586, 13589, 13587, 13586, 13586, 13589, 13586, 13585, 13586, 13590, 13587, 13587, 13589, 13593, 13591, 13592, 13594, 13597, 13595, 13594, 13594, 13597, 13594, 13593, 13594, 13598, 13595, 13595, 13597, 13601, 13599, 13600, 13602, 13605, 13603, 13602, 13602, 13605, 13602, 13601, 13602, 13606, 13603, 13603, 13605, 13609, 13607, 13608, 13610, 13613, 13611, 13610, 13610, 13613, 13610, 13609, 13610, 13613, 13611, 13611, 13613, 13617, 13615, 13616, 13618, 13621, 13619, 13618, 13619, 13621, 13618, 13617, 13619, 13622, 13620, 13619, 13621, 13625, 13624, 13624, 13626, 13629, 13627, 13625, 13626, 13628, 13624, 13623, 13624, 13627, 13625, 13624, 13626, 13629, 13628, 13628, 13630, 13633, 13631, 13630, 13631, 13633, 13630, 13630, 13631, 13635, 13633, 13633, 13635, 13639, 13638, 13639, 13642, 13645, 13643, 13642, 13643, 13646, 13643, 13642, 13643, 13647, 13644, 13644, 13646, 13650, 13648, 13648, 13650, 13653, 13651, 13649, 13649, 13651, 13648, 13647, 13648, 13651, 13648, 13648, 13649, 13653, 13652, 13652, 13654, 13657, 13655, 13654, 13655, 13657, 13655, 13654, 13655, 13659, 13657, 13657, 13659, 13663, 13662, 13663, 13666, 13669, 13667, 13666, 13667, 13669, 13667, 13666, 13667, 13671, 13668, 13668, 13670, 13673, 13672, 13672, 13674, 13677, 13675, 13673, 13674, 13676, 13673, 13671, 13673, 13676, 13673, 13672, 13674, 13678, 13676, 13676, 13678, 13681, 13679, 13677, 13678, 13680, 13677, 13676, 13677, 13681, 13678, 13678, 13680, 13684, 13683, 13683, 13686, 13689, 13687, 13686, 13687, 13690, 13687, 13687, 13689, 13692, 13690, 13690, 13692, 13696, 13695, 13695, 13698, 13701, 13699, 13697, 13698, 13700, 13697, 13696, 13697, 13700, 13698, 13697, 13698, 13702, 13700, 13700, 13702, 13705, 13703, 13701, 13702, 13704, 13701, 13700, 13701, 13704, 13702, 13702, 13704, 13708, 13707, 13707, 13710, 13713, 13711, 13710, 13711, 13714, 13711, 13711, 13713, 13716, 13714, 13714, 13716, 13720, 13719, 13719, 13722, 13725, 13723, 13721, 13722, 13724, 13721, 13720, 13721, 13724, 13721, 13721, 13722, 13726, 13724, 13724, 13726, 13729, 13727, 13725, 13726, 13728, 13725, 13724, 13726, 13729, 13727, 13726, 13728, 13732, 13731, 13731, 13734, 13737, 13735, 13734, 13734, 13737, 13734, 13733, 13734, 13738, 13735, 13735, 13737, 13741, 13739, 13740, 13742, 13745, 13743, 13742, 13742, 13745, 13742, 13741, 13742, 13746, 13743, 13743, 13745, 13749, 13747, 13748, 13750, 13753, 13751, 13750, 13750, 13753, 13750, 13749, 13750, 13754, 13751, 13751, 13753, 13757, 13755, 13756, 13758, 13761, 13759, 13758, 13758, 13761, 13758, 13757, 13758, 13762, 13759, 13759, 13761, 13765, 13763, 13764, 13766, 13769, 13767, 13766, 13766, 13769, 13766, 13765, 13766, 13770, 13767, 13767, 13769, 13773, 13771, 13772, 13774, 13777, 13775, 13774, 13774, 13777, 13774, 13773, 13774, 13778, 13775, 13775, 13777, 13781, 13779, 13780, 13782, 13785, 13783, 13782, 13782, 13785, 13782, 13781, 13782, 13786, 13783, 13783, 13785, 13789, 13787, 13788, 13790, 13793, 13791, 13790, 13790, 13793, 13790, 13789, 13790, 13794, 13791, 13791, 13793, 13797, 13795, 13796, 13798, 13801, 13799, 13798, 13798, 13801, 13798, 13797, 13798, 13802, 13799, 13799, 13801, 13805, 13803, 13804, 13806, 13809, 13807, 13806, 13806, 13809, 13806, 13805, 13806, 13810, 13807, 13807, 13809, 13813, 13811, 13812, 13814, 13817, 13815, 13814, 13814, 13817, 13814, 13813, 13814, 13818, 13815, 13815, 13817, 13821, 13819, 13820, 13822, 13825, 13823, 13822, 13822, 13825, 13822, 13821, 13822, 13826, 13823, 13823, 13825, 13829, 13827, 13828, 13830, 13833, 13831, 13830, 13830, 13833, 13830, 13829, 13830, 13834, 13831, 13831, 13833, 13837, 13835, 13836, 13838, 13841, 13839, 13838, 13838, 13841, 13838, 13837, 13838, 13842, 13839, 13839, 13841, 13845, 13843, 13844, 13846, 13849, 13847, 13846, 13846, 13849, 13846, 13845, 13846, 13850, 13847, 13847, 13849, 13853, 13851, 13852, 13854, 13857, 13855, 13853, 13854, 13857, 13854, 13853, 13854, 13857, 13855, 13855, 13857, 13860, 13859, 13859, 13862, 13865, 13863, 13862, 13862, 13865, 13862, 13861, 13863, 13866, 13864, 13863, 13865, 13869, 13868, 13868, 13870, 13873, 13871, 13869, 13869, 13871, 13868, 13867, 13868, 13871, 13868, 13868, 13869, 13873, 13872, 13872, 13874, 13877, 13875, 13874, 13874, 13877, 13874, 13874, 13875, 13879, 13877, 13877, 13879, 13883, 13882, 13883, 13886, 13889, 13887, 13886, 13887, 13889, 13887, 13886, 13887, 13890, 13888, 13888, 13890, 13893, 13892, 13892, 13894, 13897, 13895, 13893, 13894, 13896, 13893, 13891, 13892, 13895, 13893, 13892, 13894, 13898, 13896, 13896, 13898, 13901, 13899, 13897, 13898, 13900, 13897, 13896, 13897, 13900, 13898, 13898, 13900, 13904, 13903, 13903, 13906, 13909, 13907, 13906, 13907, 13910, 13907, 13907, 13908, 13912, 13910, 13910, 13912, 13916, 13915, 13915, 13918, 13921, 13919, 13917, 13918, 13920, 13917, 13916, 13917, 13920, 13917, 13916, 13918, 13922, 13920, 13920, 13922, 13925, 13923, 13921, 13922, 13924, 13921, 13920, 13922, 13925, 13923, 13922, 13924, 13928, 13927, 13927, 13930, 13933, 13931, 13930, 13930, 13933, 13930, 13929, 13930, 13934, 13931, 13931, 13933, 13937, 13935, 13936, 13938, 13941, 13939, 13937, 13938, 13941, 13938, 13937, 13938, 13941, 13939, 13939, 13941, 13945, 13943, 13943, 13946, 13949, 13947, 13945, 13946, 13949, 13946, 13945, 13946, 13949, 13947, 13947, 13949, 13953, 13951, 13951, 13954, 13957, 13955, 13953, 13954, 13957, 13954, 13953, 13954, 13957, 13955, 13955, 13957, 13961, 13959, 13959, 13962, 13965, 13963, 13961, 13962, 13965, 13962, 13961, 13962, 13965, 13963, 13963, 13965, 13969, 13967, 13967, 13970, 13973, 13971, 13969, 13970, 13972, 13970, 13968, 13970, 13973, 13971, 13970, 13973, 13976, 13975, 13975, 13978, 13981, 13979, 13978, 13978, 13981, 13978, 13977, 13979, 13982, 13980, 13979, 13981, 13985, 13984, 13984, 13986, 13989, 13987, 13985, 13985, 13987, 13984, 13983, 13984, 13987, 13984, 13984, 13985, 13989, 13987, 13988, 13990, 13993, 13991, 13990, 13990, 13993, 13990, 13990, 13991, 13995, 13993, 13993, 13995, 13999, 13998, 13999, 14001, 14005, 14003, 14002, 14003, 14005, 14002, 14002, 14003, 14006, 14004, 14004, 14005, 14009, 14008, 14008, 14010, 14013, 14011, 14009, 14009, 14012, 14008, 14007, 14008, 14011, 14009, 14008, 14010, 14013, 14012, 14012, 14014, 14017, 14015, 14013, 14014, 14016, 14013, 14012, 14013, 14016, 14014, 14014, 14016, 14020, 14019, 14019, 14021, 14025, 14023, 14022, 14023, 14026, 14023, 14023, 14024, 14028, 14026, 14026, 14028, 14032, 14031, 14031, 14034, 14037, 14035, 14033, 14034, 14036, 14033, 14032, 14033, 14036, 14033, 14032, 14034, 14038, 14036, 14036, 14038, 14041, 14039, 14037, 14038, 14040, 14037, 14036, 14037, 14041, 14039, 14038, 14040, 14044, 14043, 14043, 14046, 14049, 14047, 14045, 14046, 14049, 14046, 14045, 14046, 14050, 14047, 14047, 14049, 14053, 14051, 14051, 14054, 14057, 14055, 14053, 14054, 14057, 14054, 14053, 14054, 14057, 14055, 14055, 14057, 14061, 14059, 14059, 14062, 14065, 14063, 14061, 14062, 14065, 14062, 14061, 14062, 14065, 14063, 14063, 14065, 14069, 14067, 14067, 14070, 14073, 14071, 14069, 14070, 14073, 14070, 14069, 14070, 14073, 14071, 14071, 14073, 14077, 14075, 14075, 14078, 14081, 14079, 14077, 14078, 14080, 14077, 14076, 14078, 14081, 14079, 14078, 14080, 14084, 14083, 14083, 14086, 14089, 14087, 14085, 14086, 14089, 14086, 14085, 14086, 14090, 14087, 14087, 14089, 14093, 14091, 14092, 14094, 14097, 14095, 14093, 14094, 14096, 14093, 14091, 14092, 14096, 14093, 14092, 14094, 14098, 14096, 14096, 14098, 14101, 14098, 14097, 14097, 14100, 14097, 14096, 14097, 14100, 14098, 14098, 14100, 14104, 14102, 14103, 14105, 14109, 14107, 14106, 14107, 14110, 14107, 14106, 14108, 14112, 14110, 14110, 14112, 14116, 14115, 14115, 14118, 14121, 14119, 14117, 14118, 14120, 14117, 14116, 14117, 14120, 14117, 14116, 14118, 14122, 14120, 14120, 14122, 14125, 14123, 14121, 14122, 14124, 14121, 14120, 14121, 14125, 14122, 14122, 14124, 14128, 14127, 14127, 14130, 14133, 14131, 14129, 14130, 14133, 14130, 14129, 14130, 14133, 14131, 14131, 14133, 14137, 14135, 14135, 14138, 14141, 14139, 14137, 14138, 14141, 14138, 14137, 14138, 14142, 14139, 14139, 14141, 14145, 14143, 14144, 14146, 14149, 14147, 14145, 14145, 14148, 14144, 14143, 14144, 14148, 14145, 14144, 14146, 14150, 14148, 14148, 14150, 14153, 14150, 14149, 14149, 14152, 14149, 14148, 14149, 14152, 14150, 14150, 14152, 14156, 14154, 14155, 14157, 14161, 14159, 14158, 14159, 14162, 14159, 14158, 14160, 14164, 14162, 14162, 14164, 14168, 14167, 14167, 14170, 14173, 14171, 14169, 14170, 14172, 14169, 14167, 14169, 14172, 14169, 14168, 14170, 14174, 14172, 14172, 14174, 14177, 14174, 14173, 14174, 14176, 14173, 14172, 14173, 14177, 14174, 14174, 14176, 14180, 14179, 14179, 14182, 14185, 14183, 14181, 14182, 14185, 14182, 14181, 14182, 14185, 14183, 14183, 14185, 14188, 14187, 14187, 14190, 14193, 14191, 14189, 14190, 14193, 14190, 14189, 14190, 14194, 14191, 14191, 14193, 14197, 14195, 14196, 14198, 14201, 14198, 14197, 14197, 14200, 14196, 14195, 14196, 14199, 14197, 14196, 14198, 14201, 14200, 14200, 14202, 14205, 14203, 14201, 14202, 14204, 14201, 14200, 14201, 14205, 14203, 14202, 14204, 14208, 14207, 14207, 14210, 14213, 14211, 14209, 14210, 14213, 14210, 14209, 14210, 14213, 14211, 14211, 14213, 14217, 14215, 14215, 14218, 14221, 14219, 14217, 14218, 14220, 14217, 14216, 14218, 14221, 14219, 14218, 14220, 14224, 14223, 14223, 14226, 14229, 14227, 14225, 14226, 14228, 14225, 14224, 14226, 14229, 14227, 14226, 14228, 14232, 14231, 14231, 14234, 14237, 14235, 14233, 14234, 14237, 14234, 14233, 14234, 14238, 14235, 14235, 14237, 14241, 14239, 14240, 14242, 14245, 14242, 14241, 14241, 14244, 14240, 14239, 14240, 14243, 14241, 14240, 14242, 14245, 14244, 14244, 14246, 14249, 14246, 14245, 14246, 14248, 14245, 14244, 14245, 14249, 14247, 14246, 14248, 14252, 14251, 14251, 14254, 14257, 14255, 14253, 14254, 14256, 14253, 14252, 14254, 14257, 14255, 14254, 14256, 14260, 14259, 14259, 14262, 14265, 14263, 14261, 14262, 14265, 14262, 14261, 14262, 14266, 14263, 14263, 14265, 14269, 14267, 14268, 14270, 14273, 14270, 14269, 14269, 14272, 14268, 14267, 14268, 14271, 14269, 14268, 14270, 14273, 14272, 14272, 14274, 14277, 14274, 14273, 14274, 14276, 14273, 14272, 14273, 14277, 14274, 14274, 14276, 14280, 14279, 14279, 14282, 14285, 14283, 14281, 14282, 14285, 14282, 14281, 14282, 14285, 14283, 14283, 14285, 14289, 14287, 14287, 14290, 14293, 14291, 14289, 14290, 14292, 14289, 14288, 14290, 14293, 14291, 14290, 14292, 14296, 14295, 14295, 14298, 14301, 14299, 14297, 14298, 14300, 14297, 14296, 14298, 14301, 14299, 14298, 14300, 14304, 14303, 14303, 14306, 14309, 14307, 14305, 14306, 14309, 14306, 14305, 14306, 14310, 14307, 14307, 14309, 14313, 14311, 14312, 14314, 14317, 14314, 14313, 14313, 14316, 14312, 14311, 14312, 14315, 14313, 14312, 14314, 14317, 14316, 14316, 14318, 14321, 14318, 14317, 14318, 14320, 14317, 14316, 14317, 14321, 14318, 14318, 14320, 14324, 14323, 14323, 14326, 14329, 14327, 14325, 14326, 14328, 14325, 14324, 14326, 14329, 14327, 14326, 14328, 14332, 14331, 14331, 14334, 14337, 14335, 14333, 14334, 14337, 14334, 14333, 14334, 14338, 14335, 14335, 14337, 14341, 14339, 14339, 14342, 14345, 14342, 14341, 14341, 14344, 14340, 14339, 14340, 14343, 14341, 14340, 14342, 14345, 14344, 14344, 14346, 14349, 14346, 14345, 14346, 14348, 14345, 14344, 14345, 14349, 14346, 14346, 14348, 14352, 14351, 14351, 14354, 14357, 14355, 14353, 14354, 14357, 14354, 14353, 14354, 14357, 14355, 14354, 14357, 14361, 14359, 14359, 14362, 14365, 14363, 14361, 14362, 14364, 14361, 14360, 14362, 14365, 14363, 14362, 14364, 14368, 14367, 14367, 14370, 14373, 14371, 14369, 14370, 14373, 14370, 14369, 14370, 14374, 14371, 14371, 14373, 14377, 14375, 14375, 14378, 14381, 14378, 14377, 14377, 14380, 14376, 14375, 14376, 14379, 14377, 14376, 14378, 14381, 14380, 14380, 14382, 14385, 14382, 14381, 14382, 14384, 14381, 14380, 14381, 14385, 14382, 14382, 14384, 14388, 14387, 14387, 14390, 14393, 14391, 14389, 14390, 14392, 14389, 14388, 14390, 14393, 14391, 14390, 14392, 14396, 14395, 14395, 14398, 14401, 14399, 14397, 14398, 14401, 14398, 14397, 14398, 14402, 14399, 14399, 14401, 14405, 14403, 14403, 14406, 14409, 14406, 14405, 14405, 14407, 14404, 14403, 14404, 14407, 14405, 14404, 14406, 14409, 14408, 14408, 14410, 14413, 14410, 14409, 14410, 14412, 14409, 14408, 14409, 14413, 14410, 14410, 14412, 14416, 14415, 14415, 14418, 14421, 14419, 14417, 14418, 14420, 14417, 14416, 14418, 14421, 14419, 14418, 14420, 14424, 14423, 14423, 14426, 14429, 14427, 14425, 14426, 14429, 14426, 14425, 14426, 14430, 14427, 14427, 14429, 14433, 14431, 14431, 14434, 14437, 14434, 14433, 14433, 14436, 14432, 14431, 14432, 14435, 14433, 14432, 14434, 14437, 14436, 14436, 14438, 14441, 14438, 14437, 14438, 14440, 14437, 14436, 14437, 14441, 14438, 14438, 14440, 14444, 14443, 14443, 14445, 14449, 14447, 14445, 14446, 14449, 14446, 14445, 14446, 14450, 14447, 14447, 14449, 14453, 14451, 14451, 14454, 14457, 14454, 14453, 14453, 14455, 14452, 14451, 14452, 14455, 14452, 14452, 14453, 14457, 14456, 14456, 14458, 14461, 14458, 14457, 14458, 14460, 14457, 14456, 14457, 14461, 14458, 14458, 14460, 14464, 14463, 14463, 14466, 14469, 14467, 14465, 14466, 14468, 14465, 14464, 14466, 14469, 14467, 14466, 14468, 14472, 14471, 14471, 14474, 14477, 14475, 14473, 14474, 14477, 14474, 14473, 14474, 14478, 14475, 14475, 14477, 14481, 14479, 14479, 14482, 14485, 14482, 14481, 14481, 14483, 14480, 14478, 14480, 14483, 14480, 14479, 14481, 14485, 14483, 14483, 14486, 14489, 14487, 14485, 14486, 14489, 14486, 14485, 14487, 14491, 14489, 14489, 14491, 14495, 14494, 14495, 14497, 14501, 14499, 14497, 14498, 14500, 14497, 14496, 14497, 14500, 14498, 14497, 14498, 14502, 14500, 14500, 14502, 14505, 14502, 14500, 14501, 14503, 14499, 14498, 14499, 14502, 14499, 14499, 14500, 14504, 14503, 14503, 14505, 14509, 14507, 14506, 14506, 14509, 14507, 14506, 14508, 14511, 14509, 14509, 14511, 14516, 14514, 14515, 14517, 14521, 14519, 14517, 14518, 14520, 14517, 14515, 14517, 14520, 14517, 14516, 14518, 14522, 14520, 14520, 14522, 14525, 14522, 14521, 14521, 14524, 14521, 14520, 14521, 14525, 14522, 14522, 14524, 14528, 14527, 14527, 14529, 14533, 14531, 14529, 14530, 14532, 14529, 14528, 14530, 14533, 14531, 14530, 14532, 14536, 14535, 14535, 14537, 14541, 14539, 14537, 14538, 14541, 14538, 14537, 14538, 14542, 14539, 14539, 14541, 14545, 14543, 14543, 14546, 14549, 14546, 14545, 14545, 14547, 14544, 14543, 14544, 14547, 14544, 14544, 14545, 14549, 14548, 14548, 14550, 14553, 14550, 14549, 14549, 14552, 14549, 14548, 14549, 14553, 14550, 14550, 14552, 14556, 14555, 14555, 14557, 14561, 14559, 14557, 14558, 14561, 14558, 14557, 14558, 14562, 14559, 14559, 14561, 14565, 14563, 14563, 14566, 14569, 14566, 14565, 14565, 14567, 14564, 14563, 14564, 14567, 14564, 14564, 14565, 14569, 14567, 14567, 14570, 14573, 14570, 14569, 14570, 14572, 14569, 14568, 14569, 14573, 14570, 14570, 14572, 14576, 14575, 14575, 14577, 14581, 14579, 14577, 14578, 14580, 14577, 14576, 14578, 14581, 14579, 14578, 14580, 14584, 14583, 14583, 14585, 14589, 14587, 14585, 14586, 14589, 14586, 14585, 14586, 14590, 14587, 14587, 14589, 14593, 14591, 14591, 14594, 14597, 14594, 14593, 14593, 14595, 14592, 14591, 14592, 14595, 14592, 14592, 14593, 14597, 14595, 14596, 14598, 14601, 14598, 14597, 14597, 14600, 14597, 14596, 14597, 14601, 14598, 14598, 14600, 14604, 14603, 14603, 14605, 14609, 14607, 14605, 14606, 14609, 14606, 14605, 14606, 14610, 14607, 14607, 14609, 14613, 14611, 14611, 14614, 14617, 14614, 14613, 14613, 14615, 14612, 14611, 14612, 14615, 14612, 14612, 14613, 14617, 14615, 14615, 14618, 14621, 14618, 14617, 14617, 14620, 14617, 14616, 14617, 14621, 14618, 14618, 14620, 14624, 14623, 14623, 14625, 14629, 14627, 14625, 14626, 14628, 14625, 14624, 14626, 14629, 14627, 14626, 14628, 14632, 14631, 14631, 14633, 14637, 14635, 14633, 14634, 14637, 14634, 14633, 14634, 14638, 14635, 14635, 14637, 14641, 14639, 14639, 14642, 14645, 14642, 14641, 14641, 14643, 14640, 14639, 14640, 14643, 14640, 14640, 14641, 14645, 14643, 14643, 14646, 14649, 14646, 14645, 14645, 14648, 14645, 14644, 14645, 14649, 14646, 14646, 14648, 14652, 14651, 14651, 14653, 14657, 14655, 14653, 14654, 14657, 14654, 14653, 14654, 14658, 14655, 14655, 14657, 14661, 14659, 14659, 14662, 14665, 14662, 14661, 14661, 14663, 14660, 14659, 14660, 14663, 14660, 14660, 14661, 14665, 14663, 14663, 14666, 14669, 14666, 14665, 14665, 14668, 14665, 14664, 14665, 14669, 14666, 14666, 14668, 14672, 14671, 14671, 14673, 14677, 14674, 14673, 14674, 14676, 14673, 14672, 14674, 14677, 14675, 14674, 14676, 14680, 14679, 14679, 14681, 14685, 14683, 14681, 14682, 14685, 14681, 14680, 14682, 14686, 14683, 14683, 14685, 14689, 14687, 14687, 14690, 14693, 14690, 14689, 14689, 14691, 14688, 14687, 14688, 14691, 14688, 14688, 14689, 14693, 14691, 14691, 14694, 14697, 14694, 14693, 14693, 14696, 14693, 14692, 14693, 14697, 14694, 14694, 14696, 14700, 14698, 14699, 14701, 14705, 14703, 14701, 14702, 14705, 14702, 14701, 14702, 14706, 14703, 14703, 14705, 14709, 14707, 14707, 14710, 14713, 14710, 14709, 14709, 14711, 14708, 14707, 14708, 14711, 14708, 14708, 14709, 14713, 14711, 14711, 14714, 14717, 14714, 14713, 14713, 14716, 14713, 14712, 14713, 14717, 14714, 14714, 14716, 14720, 14718, 14719, 14721, 14725, 14723, 14721, 14722, 14725, 14722, 14721, 14722, 14726, 14723, 14723, 14725, 14729, 14727, 14727, 14730, 14733, 14730, 14729, 14729, 14731, 14728, 14727, 14728, 14731, 14728, 14727, 14729, 14733, 14731, 14731, 14734, 14737, 14734, 14733, 14733, 14736, 14733, 14732, 14733, 14737, 14734, 14734, 14736, 14740, 14739, 14739, 14741, 14745, 14742, 14741, 14742, 14744, 14741, 14740, 14742, 14745, 14743, 14742, 14744, 14748, 14747, 14747, 14749, 14753, 14750, 14749, 14750, 14753, 14749, 14748, 14750, 14753, 14751, 14750, 14753, 14757, 14755, 14755, 14758, 14761, 14758, 14757, 14757, 14759, 14756, 14755, 14756, 14759, 14756, 14756, 14757, 14761, 14759, 14759, 14762, 14765, 14762, 14761, 14761, 14764, 14761, 14759, 14761, 14764, 14762, 14762, 14764, 14768, 14766, 14767, 14769, 14773, 14771, 14769, 14770, 14773, 14770, 14769, 14770, 14774, 14771, 14771, 14773, 14777, 14775, 14775, 14778, 14781, 14778, 14777, 14777, 14779, 14776, 14775, 14776, 14779, 14776, 14775, 14777, 14781, 14779, 14779, 14782, 14785, 14782, 14781, 14781, 14784, 14781, 14779, 14781, 14784, 14782, 14782, 14784, 14788, 14786, 14787, 14789, 14793, 14791, 14789, 14790, 14793, 14790, 14789, 14790, 14794, 14791, 14791, 14793, 14797, 14795, 14795, 14798, 14801, 14798, 14797, 14797, 14799, 14796, 14795, 14796, 14799, 14796, 14795, 14797, 14801, 14799, 14799, 14802, 14805, 14802, 14801, 14801, 14804, 14801, 14800, 14801, 14805, 14802, 14802, 14804, 14808, 14807, 14807, 14809, 14813, 14810, 14809, 14810, 14812, 14809, 14808, 14810, 14813, 14811, 14810, 14812, 14816, 14815, 14815, 14817, 14821, 14818, 14817, 14818, 14820, 14817, 14816, 14818, 14821, 14819, 14818, 14821, 14825, 14823, 14823, 14826, 14829, 14826, 14825, 14825, 14827, 14824, 14823, 14824, 14827, 14824, 14823, 14825, 14829, 14827, 14827, 14830, 14833, 14830, 14829, 14829, 14832, 14829, 14827, 14829, 14832, 14830, 14829, 14832, 14836, 14834, 14835, 14837, 14841, 14838, 14837, 14838, 14841, 14838, 14836, 14838, 14842, 14839, 14839, 14841, 14845, 14843, 14843, 14846, 14849, 14846, 14845, 14845, 14847, 14844, 14843, 14844, 14847, 14844, 14843, 14845, 14849, 14847, 14847, 14850, 14853, 14850, 14849, 14849, 14852, 14849, 14847, 14849, 14852, 14850, 14849, 14852, 14856, 14854, 14855, 14857, 14861, 14858, 14857, 14858, 14861, 14858, 14856, 14858, 14862, 14859, 14859, 14861, 14865, 14863, 14863, 14866, 14869, 14866, 14865, 14865, 14867, 14864, 14863, 14864, 14867, 14864, 14863, 14865, 14869, 14867, 14867, 14870, 14873, 14870, 14869, 14869, 14872, 14869, 14868, 14869, 14873, 14870, 14870, 14872, 14876, 14875, 14875, 14877, 14881, 14878, 14877, 14878, 14880, 14877, 14876, 14878, 14881, 14879, 14878, 14880, 14884, 14883, 14883, 14885, 14889, 14886, 14885, 14886, 14888, 14885, 14884, 14886, 14889, 14887, 14886, 14888, 14892, 14891, 14891, 14893, 14897, 14894, 14893, 14893, 14896, 14892, 14891, 14892, 14896, 14893, 14892, 14894, 14898, 14896, 14896, 14898, 14901, 14898, 14896, 14896, 14899, 14895, 14894, 14895, 14898, 14895, 14894, 14896, 14900, 14899, 14899, 14901, 14905, 14903, 14901, 14902, 14905, 14902, 14901, 14903, 14907, 14905, 14905, 14907, 14912, 14910, 14911, 14913, 14917, 14914, 14913, 14913, 14916, 14912, 14911, 14912, 14915, 14913, 14912, 14913, 14917, 14915, 14915, 14918, 14921, 14918, 14917, 14917, 14920, 14917, 14916, 14917, 14921, 14918, 14918, 14920, 14924, 14923, 14923, 14925, 14929, 14926, 14924, 14925, 14927, 14924, 14922, 14923, 14927, 14924, 14923, 14925, 14929, 14927, 14927, 14929, 14933, 14930, 14929, 14930, 14933, 14930, 14929, 14931, 14935, 14933, 14932, 14935, 14939, 14938, 14939, 14941, 14945, 14942, 14941, 14942, 14944, 14941, 14939, 14941, 14944, 14941, 14940, 14942, 14946, 14944, 14944, 14946, 14949, 14946, 14944, 14945, 14947, 14943, 14942, 14943, 14946, 14944, 14943, 14945, 14949, 14947, 14947, 14949, 14953, 14950, 14949, 14949, 14952, 14949, 14948, 14949, 14953, 14950, 14950, 14952, 14956, 14955, 14955, 14957, 14961, 14958, 14957, 14958, 14960, 14957, 14956, 14957, 14961, 14958, 14958, 14960, 14964, 14963, 14963, 14965, 14969, 14966, 14965, 14966, 14968, 14965, 14964, 14966, 14969, 14967, 14966, 14968, 14973, 14971, 14971, 14973, 14977, 14974, 14972, 14973, 14975, 14972, 14970, 14972, 14975, 14972, 14971, 14973, 14977, 14975, 14975, 14978, 14981, 14978, 14977, 14977, 14980, 14977, 14975, 14977, 14981, 14978, 14978, 14980, 14984, 14982, 14983, 14985, 14989, 14986, 14985, 14986, 14988, 14985, 14984, 14985, 14989, 14986, 14986, 14988, 14992, 14991, 14991, 14993, 14997, 14994, 14993, 14994, 14996, 14993, 14992, 14994, 14997, 14995, 14994, 14996, 15001, 14999, 14999, 15001, 15005, 15002, 15000, 15001, 15003, 15000, 14998, 15000, 15003, 15000, 14999, 15001, 15005, 15003, 15003, 15006, 15009, 15006, 15005, 15005, 15008, 15005, 15003, 15005, 15009, 15006, 15006, 15008, 15012, 15010, 15011, 15013, 15017, 15014, 15013, 15014, 15016, 15013, 15012, 15013, 15017, 15014, 15014, 15016, 15020, 15019, 15019, 15021, 15025, 15022, 15021, 15022, 15024, 15021, 15020, 15022, 15025, 15023, 15022, 15024, 15029, 15027, 15027, 15029, 15033, 15030, 15028, 15029, 15031, 15028, 15026, 15028, 15031, 15028, 15027, 15029, 15033, 15031, 15031, 15033, 15037, 15034, 15033, 15033, 15036, 15033, 15031, 15033, 15037, 15034, 15033, 15036, 15040, 15038, 15039, 15041, 15045, 15042, 15041, 15042, 15044, 15041, 15040, 15041, 15045, 15042, 15042, 15044, 15048, 15047, 15047, 15049, 15053, 15050, 15049, 15050, 15052, 15049, 15048, 15050, 15053, 15051, 15050, 15052, 15057, 15055, 15055, 15057, 15061, 15058, 15056, 15057, 15059, 15056, 15054, 15056, 15059, 15056, 15055, 15057, 15061, 15059, 15059, 15061, 15065, 15062, 15061, 15061, 15064, 15061, 15059, 15061, 15065, 15062, 15061, 15064, 15068, 15066, 15067, 15069, 15073, 15070, 15069, 15070, 15072, 15069, 15068, 15069, 15073, 15070, 15070, 15072, 15076, 15075, 15075, 15077, 15081, 15078, 15077, 15078, 15080, 15077, 15076, 15078, 15081, 15079, 15078, 15080, 15084, 15083, 15083, 15085, 15089, 15086, 15084, 15085, 15087, 15084, 15082, 15084, 15087, 15084, 15083, 15085, 15089, 15087, 15087, 15089, 15093, 15090, 15089, 15089, 15092, 15089, 15087, 15089, 15093, 15090, 15089, 15092, 15096, 15094, 15095, 15097, 15101, 15098, 15097, 15098, 15100, 15097, 15096, 15097, 15101, 15098, 15098, 15100, 15104, 15103, 15103, 15105, 15109, 15106, 15105, 15106, 15108, 15105, 15104, 15106, 15109, 15107, 15106, 15108, 15112, 15111, 15111, 15113, 15117, 15114, 15112, 15113, 15115, 15112, 15110, 15112, 15115, 15112, 15111, 15113, 15117, 15115, 15115, 15117, 15121, 15118, 15117, 15117, 15120, 15116, 15115, 15117, 15120, 15118, 15117, 15120, 15124, 15122, 15123, 15125, 15129, 15126, 15125, 15126, 15128, 15125, 15124, 15125, 15129, 15126, 15126, 15128, 15132, 15131, 15131, 15133, 15137, 15134, 15133, 15133, 15136, 15133, 15132, 15133, 15137, 15134, 15134, 15136, 15140, 15138, 15139, 15141, 15145, 15142, 15141, 15142, 15144, 15141, 15140, 15142, 15145, 15143, 15142, 15144, 15148, 15147, 15147, 15149, 15153, 15150, 15148, 15149, 15151, 15148, 15146, 15148, 15151, 15148, 15147, 15149, 15153, 15151, 15151, 15153, 15157, 15154, 15153, 15153, 15156, 15152, 15151, 15153, 15156, 15154, 15153, 15156, 15160, 15158, 15159, 15161, 15165, 15162, 15161, 15162, 15164, 15161, 15160, 15161, 15165, 15162, 15162, 15164, 15168, 15167, 15167, 15169, 15173, 15170, 15169, 15169, 15172, 15169, 15168, 15169, 15173, 15170, 15170, 15172, 15176, 15174, 15175, 15177, 15181, 15178, 15177, 15178, 15180, 15177, 15176, 15178, 15181, 15179, 15178, 15180, 15184, 15183, 15183, 15185, 15189, 15186, 15184, 15185, 15187, 15184, 15182, 15184, 15187, 15184, 15183, 15185, 15189, 15187, 15187, 15189, 15193, 15190, 15189, 15189, 15192, 15188, 15187, 15189, 15192, 15190, 15189, 15192, 15196, 15194, 15195, 15197, 15201, 15198, 15197, 15198, 15200, 15197, 15196, 15197, 15201, 15198, 15198, 15200, 15204, 15203, 15203, 15205, 15209, 15206, 15205, 15205, 15208, 15205, 15204, 15205, 15209, 15206, 15206, 15208, 15212, 15210, 15211, 15213, 15217, 15214, 15213, 15214, 15216, 15213, 15212, 15214, 15217, 15215, 15214, 15216, 15220, 15219, 15219, 15221, 15225, 15222, 15220, 15221, 15223, 15220, 15218, 15220, 15223, 15220, 15219, 15221, 15225, 15223, 15223, 15225, 15229, 15226, 15225, 15225, 15228, 15224, 15223, 15225, 15228, 15226, 15225, 15228, 15232, 15230, 15231, 15233, 15237, 15234, 15233, 15234, 15236, 15233, 15232, 15233, 15237, 15234, 15234, 15236, 15240, 15239, 15239, 15241, 15245, 15242, 15241, 15241, 15244, 15241, 15240, 15241, 15245, 15242, 15242, 15244, 15248, 15246, 15247, 15249, 15253, 15250, 15249, 15250, 15252, 15249, 15248, 15250, 15253, 15251, 15250, 15252, 15256, 15255, 15255, 15257, 15261, 15258, 15256, 15257, 15259, 15256, 15254, 15256, 15259, 15256, 15255, 15257, 15261, 15259, 15259, 15261, 15265, 15262, 15260, 15261, 15264, 15260, 15259, 15261, 15264, 15262, 15261, 15263, 15268, 15266, 15267, 15269, 15273, 15270, 15269, 15270, 15272, 15269, 15268, 15269, 15273, 15270, 15270, 15272, 15276, 15275, 15275, 15277, 15281, 15278, 15277, 15277, 15280, 15277, 15276, 15277, 15281, 15278, 15278, 15280, 15284, 15282, 15283, 15285, 15289, 15286, 15285, 15285, 15288, 15285, 15284, 15285, 15289, 15286, 15286, 15288, 15292, 15290, 15291, 15293, 15297, 15294, 15293, 15294, 15296, 15293, 15292, 15294, 15297, 15295, 15294, 15296, 15300, 15299, 15299, 15301, 15305, 15302, 15300, 15301, 15303, 15300, 15298, 15299, 15303, 15300, 15299, 15301, 15305, 15303, 15303, 15305, 15309, 15306, 15304, 15305, 15308, 15304, 15303, 15305, 15308, 15306, 15305, 15307, 15312, 15310, 15311, 15313, 15317, 15314, 15313, 15314, 15316, 15313, 15312, 15313, 15317, 15314, 15314, 15316, 15320, 15319, 15319, 15321, 15325, 15322, 15321, 15321, 15324, 15321, 15319, 15321, 15325, 15322, 15321, 15324, 15328, 15326, 15327, 15329, 15333, 15330, 15329, 15330, 15332, 15329, 15328, 15330, 15333, 15331, 15330, 15332, 15336, 15335, 15335, 15337, 15341, 15338, 15336, 15337, 15339, 15336, 15334, 15335, 15339, 15336, 15335, 15337, 15341, 15339, 15339, 15341, 15345, 15342, 15340, 15341, 15344, 15340, 15339, 15341, 15344, 15342, 15341, 15343, 15348, 15346, 15347, 15349, 15353, 15350, 15349, 15350, 15352, 15349, 15348, 15349, 15353, 15350, 15350, 15352, 15356, 15355, 15355, 15357, 15361, 15358, 15357, 15357, 15360, 15357, 15355, 15357, 15361, 15358, 15357, 15360, 15364, 15362, 15363, 15365, 15369, 15366, 15365, 15366, 15368, 15365, 15364, 15366, 15369, 15367, 15366, 15368, 15372, 15371, 15371, 15373, 15377, 15374, 15372, 15373, 15375, 15372, 15370, 15371, 15375, 15372, 15371, 15373, 15377, 15375, 15375, 15377, 15381, 15378, 15376, 15377, 15380, 15376, 15375, 15377, 15380, 15378, 15377, 15379, 15384, 15382, 15382, 15385, 15389, 15386, 15385, 15386, 15388, 15385, 15384, 15386, 15389, 15387, 15386, 15388, 15392, 15391, 15391, 15393, 15397, 15394, 15392, 15393, 15395, 15392, 15390, 15391, 15395, 15392, 15391, 15393, 15397, 15395, 15395, 15397, 15401, 15398, 15396, 15397, 15400, 15396, 15395, 15397, 15400, 15398, 15397, 15399, 15404, 15402, 15403, 15405, 15409, 15406, 15405, 15406, 15408, 15405, 15404, 15405, 15409, 15406, 15406, 15408, 15412, 15410, 15411, 15413, 15417, 15414, 15413, 15413, 15416, 15413, 15411, 15413, 15417, 15414, 15413, 15416, 15420, 15418, 15419, 15421, 15425, 15422, 15421, 15422, 15424, 15421, 15420, 15422, 15425, 15423, 15422, 15424, 15428, 15427, 15427, 15429, 15433, 15430, 15428, 15429, 15431, 15428, 15426, 15427, 15431, 15428, 15427, 15429, 15433, 15431, 15431, 15433, 15437, 15434, 15432, 15433, 15436, 15432, 15431, 15433, 15436, 15434, 15433, 15435, 15440, 15438, 15439, 15441, 15445, 15442, 15441, 15441, 15444, 15441, 15440, 15441, 15445, 15442, 15442, 15444, 15448, 15446, 15447, 15449, 15453, 15450, 15449, 15449, 15452, 15449, 15447, 15449, 15453, 15450, 15449, 15452, 15456, 15454, 15455, 15457, 15461, 15458, 15457, 15458, 15460, 15457, 15456, 15458, 15461, 15459, 15458, 15460, 15464, 15463, 15463, 15465, 15469, 15466, 15464, 15465, 15467, 15464, 15462, 15463, 15467, 15464, 15463, 15465, 15469, 15467, 15467, 15469, 15473, 15470, 15468, 15469, 15472, 15468, 15467, 15469, 15472, 15470, 15469, 15471, 15476, 15474, 15475, 15477, 15481, 15478, 15477, 15477, 15480, 15477, 15476, 15477, 15481, 15478, 15478, 15480, 15484, 15482, 15483, 15485, 15489, 15486, 15485, 15486, 15488, 15485, 15484, 15485, 15489, 15487, 15486, 15488, 15492, 15491, 15491, 15493, 15497, 15494, 15492, 15493, 15495, 15492, 15490, 15491, 15495, 15492, 15491, 15493, 15497, 15495, 15495, 15497, 15501, 15498, 15496, 15497, 15500, 15496, 15495, 15497, 15500, 15498, 15497, 15499, 15504, 15502, 15502, 15505, 15509, 15506, 15505, 15505, 15508, 15505, 15504, 15505, 15509, 15506, 15506, 15508, 15512, 15510, 15511, 15513, 15517, 15514, 15513, 15513, 15516, 15513, 15511, 15513, 15517, 15514, 15513, 15516, 15520, 15518, 15519, 15521, 15525, 15522, 15521, 15522, 15524, 15521, 15520, 15521, 15525, 15523, 15522, 15524, 15528, 15527, 15527, 15529, 15533, 15530, 15528, 15529, 15531, 15527, 15526, 15527, 15531, 15528, 15527, 15529, 15533, 15531, 15531, 15533, 15537, 15534, 15532, 15533, 15536, 15533, 15531, 15533, 15537, 15534, 15534, 15536, 15540, 15538, 15539, 15541, 15545, 15542, 15540, 15541, 15543, 15540, 15538, 15539, 15543, 15540, 15539, 15541, 15545, 15543, 15543, 15545, 15549, 15546, 15544, 15545, 15548, 15544, 15543, 15545, 15548, 15546, 15545, 15547, 15552, 15550, 15550, 15553, 15557, 15554, 15553, 15553, 15556, 15553, 15551, 15553, 15557, 15554, 15553, 15556, 15560, 15558, 15559, 15561, 15565, 15562, 15561, 15561, 15564, 15561, 15560, 15561, 15565, 15562, 15562, 15564, 15568, 15567, 15567, 15569, 15573, 15570, 15568, 15569, 15571, 15567, 15566, 15567, 15571, 15568, 15567, 15569, 15573, 15571, 15571, 15573, 15577, 15574, 15572, 15573, 15576, 15572, 15571, 15573, 15576, 15574, 15573, 15575, 15580, 15578, 15578, 15581, 15585, 15582, 15581, 15581, 15584, 15581, 15579, 15581, 15585, 15582, 15581, 15584, 15588, 15586, 15587, 15589, 15593, 15590, 15589, 15589, 15592, 15589, 15588, 15589, 15593, 15590, 15590, 15592, 15596, 15595, 15595, 15597, 15601, 15598, 15596, 15597, 15599, 15595, 15594, 15595, 15599, 15596, 15595, 15597, 15601, 15599, 15599, 15601, 15605, 15602, 15600, 15601, 15604, 15601, 15599, 15601, 15605, 15602, 15601, 15604, 15608, 15606, 15607, 15609, 15613, 15610, 15608, 15609, 15611, 15608, 15606, 15607, 15611, 15608, 15607, 15609, 15613, 15611, 15611, 15613, 15617, 15614, 15612, 15613, 15616, 15612, 15611, 15613, 15616, 15614, 15613, 15615, 15620, 15618, 15618, 15621, 15625, 15622, 15621, 15621, 15624, 15621, 15619, 15621, 15625, 15622, 15621, 15624, 15628, 15626, 15627, 15629, 15633, 15630, 15629, 15629, 15632, 15629, 15628, 15629, 15633, 15630, 15630, 15632, 15636, 15635, 15635, 15637, 15641, 15638, 15636, 15637, 15639, 15635, 15634, 15635, 15639, 15636, 15635, 15637, 15641, 15639, 15639, 15641, 15645, 15642, 15640, 15641, 15644, 15640, 15639, 15641, 15644, 15642, 15641, 15643, 15648, 15646, 15646, 15649, 15653, 15650, 15649, 15649, 15652, 15649, 15647, 15649, 15653, 15650, 15649, 15652, 15656, 15654, 15654, 15657, 15661, 15658, 15657, 15657, 15660, 15657, 15656, 15657, 15661, 15658, 15658, 15660, 15664, 15663, 15663, 15665, 15669, 15666, 15664, 15665, 15667, 15663, 15662, 15663, 15667, 15664, 15663, 15665, 15669, 15667, 15667, 15669, 15673, 15670, 15668, 15669, 15672, 15668, 15667, 15669, 15673, 15670, 15669, 15672, 15676, 15674, 15675, 15677, 15681, 15678, 15676, 15677, 15679, 15676, 15674, 15675, 15679, 15676, 15675, 15677, 15681, 15679, 15679, 15681, 15685, 15682, 15680, 15681, 15684, 15680, 15679, 15681, 15684, 15682, 15681, 15683, 15688, 15686, 15686, 15689, 15693, 15690, 15689, 15689, 15692, 15689, 15687, 15689, 15693, 15690, 15689, 15692, 15696, 15694, 15694, 15697, 15701, 15698, 15697, 15697, 15700, 15697, 15696, 15697, 15701, 15698, 15698, 15700, 15704, 15703, 15703, 15705, 15709, 15706, 15704, 15705, 15707, 15703, 15702, 15703, 15707, 15704, 15703, 15705, 15709, 15707, 15707, 15709, 15713, 15710, 15708, 15709, 15712, 15708, 15707, 15709, 15712, 15710, 15709, 15711, 15716, 15714, 15714, 15717, 15721, 15718, 15717, 15717, 15720, 15717, 15715, 15717, 15721, 15718, 15717, 15720, 15724, 15722, 15722, 15725, 15729, 15726, 15725, 15725, 15728, 15725, 15724, 15725, 15729, 15726, 15726, 15728, 15732, 15731, 15731, 15733, 15737, 15734, 15732, 15733, 15735, 15731, 15730, 15731, 15734, 15732, 15731, 15733, 15737, 15735, 15735, 15737, 15741, 15738, 15736, 15737, 15740, 15736, 15735, 15737, 15741, 15738, 15737, 15740, 15744, 15742, 15743, 15745, 15749, 15746, 15744, 15745, 15747, 15743, 15742, 15743, 15747, 15744, 15743, 15745, 15749, 15747, 15747, 15749, 15753, 15750, 15748, 15749, 15751, 15748, 15747, 15748, 15752, 15749, 15749, 15751, 15756, 15754, 15754, 15757, 15761, 15758, 15757, 15757, 15760, 15757, 15755, 15757, 15761, 15758, 15757, 15759, 15764, 15762, 15762, 15765, 15769, 15766, 15765, 15765, 15768, 15765, 15764, 15765, 15769, 15766, 15766, 15768, 15772, 15771, 15771, 15773, 15777, 15774, 15772, 15773, 15775, 15771, 15770, 15771, 15775, 15772, 15771, 15773, 15777, 15775, 15775, 15777, 15781, 15778, 15776, 15777, 15779, 15776, 15775, 15776, 15780, 15777, 15777, 15779, 15784, 15782, 15782, 15785, 15789, 15786, 15784, 15785, 15788, 15785, 15783, 15785, 15789, 15786, 15785, 15787, 15792, 15790, 15790, 15793, 15797, 15794, 15793, 15793, 15796, 15793, 15792, 15793, 15797, 15794, 15794, 15796, 15800, 15799, 15799, 15801, 15805, 15802, 15800, 15800, 15803, 15799, 15798, 15799, 15802, 15799, 15799, 15801, 15805, 15803, 15803, 15805, 15809, 15806, 15804, 15805, 15808, 15804, 15803, 15805, 15809, 15806, 15805, 15808, 15812, 15810, 15811, 15813, 15817, 15814, 15812, 15813, 15815, 15811, 15810, 15811, 15815, 15812, 15811, 15813, 15817, 15815, 15815, 15817, 15821, 15818, 15816, 15817, 15819, 15816, 15815, 15816, 15820, 15817, 15817, 15819, 15823, 15822, 15822, 15825, 15829, 15826, 15825, 15825, 15828, 15825, 15824, 15825, 15829, 15826, 15826, 15828, 15832, 15831, 15831, 15833, 15837, 15834, 15832, 15832, 15835, 15831, 15830, 15831, 15834, 15831, 15831, 15832, 15837, 15835, 15835, 15837, 15841, 15838, 15836, 15837, 15840, 15836, 15835, 15837, 15841, 15838, 15837, 15840, 15844, 15842, 15843, 15845, 15849, 15846, 15844, 15845, 15847, 15843, 15842, 15843, 15847, 15844, 15843, 15845, 15849, 15847, 15847, 15849, 15853, 15850, 15848, 15849, 15851, 15848, 15847, 15848, 15852, 15849, 15849, 15851, 15856, 15854, 15854, 15857, 15861, 15858, 15856, 15857, 15860, 15856, 15855, 15857, 15861, 15858, 15857, 15859, 15864, 15862, 15862, 15865, 15869, 15866, 15865, 15865, 15868, 15865, 15864, 15865, 15869, 15866, 15866, 15868, 15872, 15870, 15871, 15873, 15877, 15874, 15872, 15873, 15875, 15871, 15870, 15871, 15875, 15872, 15871, 15873, 15877, 15875, 15875, 15877, 15881, 15878, 15876, 15877, 15879, 15876, 15875, 15876, 15880, 15877, 15877, 15879, 15884, 15882, 15882, 15885, 15889, 15886, 15884, 15885, 15888, 15884, 15883, 15885, 15889, 15886, 15885, 15887, 15892, 15890, 15890, 15893, 15897, 15894, 15893, 15893, 15896, 15893, 15892, 15893, 15897, 15894, 15894, 15896, 15900, 15898, 15899, 15901, 15905, 15902, 15900, 15900, 15903, 15899, 15898, 15899, 15902, 15899, 15899, 15900, 15905, 15903, 15903, 15905, 15909, 15906, 15904, 15905, 15908, 15904, 15903, 15905, 15909, 15906, 15905, 15908, 15912, 15910, 15911, 15913, 15917, 15914, 15912, 15913, 15915, 15911, 15910, 15911, 15915, 15912, 15911, 15913, 15917, 15915, 15915, 15917, 15921, 15918, 15916, 15917, 15919, 15916, 15915, 15916, 15920, 15917, 15917, 15919, 15924, 15922, 15922, 15925, 15929, 15926, 15924, 15925, 15928, 15925, 15923, 15925, 15929, 15926, 15925, 15928, 15932, 15930, 15930, 15933, 15937, 15934, 15932, 15933, 15936, 15932, 15931, 15933, 15936, 15934, 15933, 15935, 15940, 15938, 15938, 15941, 15945, 15942, 15941, 15941, 15944, 15941, 15940, 15941, 15945, 15942, 15942, 15944, 15948, 15946, 15947, 15949, 15953, 15950, 15948, 15948, 15951, 15947, 15946, 15947, 15950, 15947, 15946, 15948, 15953, 15951, 15951, 15953, 15957, 15954, 15952, 15953, 15956, 15952, 15951, 15953, 15957, 15954, 15953, 15955, 15960, 15958, 15958, 15961, 15965, 15962, 15960, 15961, 15963, 15959, 15958, 15959, 15963, 15960, 15959, 15961, 15965, 15963, 15963, 15965, 15969, 15966, 15964, 15965, 15967, 15964, 15963, 15964, 15968, 15965, 15965, 15967, 15972, 15970, 15970, 15973, 15977, 15974, 15972, 15973, 15976, 15972, 15971, 15973, 15976, 15974, 15973, 15975, 15980, 15978, 15978, 15981, 15985, 15982, 15980, 15981, 15984, 15981, 15980, 15981, 15985, 15982, 15982, 15984, 15988, 15986, 15987, 15989, 15993, 15990, 15988, 15988, 15991, 15987, 15986, 15987, 15990, 15987, 15987, 15989, 15993, 15991, 15991, 15993, 15997, 15994, 15992, 15993, 15995, 15992, 15991, 15992, 15996, 15993, 15993, 15995, 16000, 15998, 15998, 16001, 16005, 16002, 16000, 16001, 16004, 16000, 15999, 16001, 16004, 16002, 16001, 16003, 16008, 16006, 16006, 16009, 16013, 16010, 16008, 16009, 16012, 16009, 16008, 16009, 16013, 16010, 16010, 16012, 16016, 16014, 16015, 16017, 16021, 16018, 16016, 16016, 16019, 16015, 16014, 16015, 16018, 16015, 16014, 16016, 16021, 16019, 16019, 16021, 16025, 16022, 16020, 16021, 16024, 16020, 16019, 16021, 16024, 16022, 16021, 16023, 16028, 16026, 16026, 16029, 16033, 16030, 16028, 16029, 16031, 16027, 16026, 16027, 16031, 16028, 16027, 16029, 16033, 16031, 16031, 16033, 16037, 16034, 16032, 16033, 16035, 16032, 16031, 16032, 16036, 16033, 16033, 16035, 16039, 16038, 16038, 16041, 16045, 16042, 16040, 16041, 16044, 16040, 16039, 16041, 16044, 16042, 16041, 16043, 16048, 16046, 16046, 16049, 16053, 16050, 16048, 16049, 16052, 16049, 16047, 16049, 16053, 16050, 16050, 16052, 16056, 16054, 16055, 16057, 16061, 16058, 16056, 16056, 16059, 16055, 16054, 16055, 16058, 16055, 16054, 16056, 16061, 16059, 16059, 16061, 16065, 16062, 16060, 16061, 16064, 16060, 16059, 16061, 16064, 16062, 16061, 16063, 16068, 16066, 16066, 16069, 16073, 16070, 16068, 16069, 16071, 16067, 16066, 16067, 16071, 16068, 16067, 16069, 16073, 16071, 16071, 16073, 16077, 16074, 16072, 16073, 16075, 16072, 16071, 16072, 16076, 16073, 16073, 16075, 16079, 16078, 16078, 16081, 16085, 16082, 16080, 16081, 16084, 16080, 16079, 16081, 16085, 16082, 16081, 16083, 16088, 16086, 16086, 16089, 16093, 16090, 16088, 16089, 16092, 16088, 16087, 16089, 16092, 16090, 16089, 16091, 16096, 16094, 16094, 16097, 16101, 16098, 16096, 16097, 16100, 16097, 16095, 16097, 16101, 16098, 16098, 16100, 16104, 16102, 16103, 16105, 16109, 16106, 16104, 16104, 16107, 16103, 16101, 16103, 16106, 16103, 16102, 16104, 16109, 16107, 16107, 16109, 16113, 16110, 16108, 16109, 16112, 16108, 16107, 16109, 16112, 16110, 16109, 16111, 16116, 16114, 16114, 16117, 16121, 16118, 16116, 16116, 16119, 16115, 16114, 16115, 16119, 16116, 16115, 16117, 16121, 16119, 16119, 16121, 16125, 16122, 16120, 16121, 16123, 16120, 16119, 16120, 16124, 16121, 16121, 16123, 16127, 16126, 16126, 16129, 16133, 16130, 16128, 16129, 16132, 16128, 16127, 16129, 16132, 16130, 16129, 16131, 16136, 16134, 16134, 16137, 16141, 16138, 16136, 16137, 16140, 16137, 16135, 16137, 16141, 16138, 16137, 16140, 16144, 16142, 16143, 16145, 16149, 16146, 16144, 16144, 16147, 16143, 16141, 16143, 16146, 16143, 16142, 16144, 16149, 16147, 16147, 16149, 16153, 16150, 16148, 16149, 16152, 16148, 16147, 16149, 16152, 16150, 16149, 16151, 16156, 16154, 16154, 16157, 16161, 16158, 16156, 16156, 16159, 16155, 16154, 16155, 16159, 16155, 16155, 16157, 16161, 16159, 16159, 16161, 16165, 16162, 16160, 16161, 16163, 16160, 16159, 16160, 16164, 16161, 16161, 16163, 16167, 16166, 16166, 16169, 16173, 16170, 16168, 16169, 16172, 16168, 16167, 16169, 16173, 16170, 16169, 16171, 16176, 16174, 16174, 16177, 16181, 16178, 16176, 16177, 16180, 16176, 16175, 16176, 16180, 16177, 16177, 16179, 16184, 16182, 16182, 16185, 16189, 16186, 16184, 16185, 16188, 16185, 16183, 16185, 16189, 16186, 16185, 16188, 16192, 16190, 16191, 16193, 16197, 16194, 16192, 16192, 16195, 16191, 16189, 16191, 16194, 16191, 16190, 16192, 16196, 16195, 16195, 16197, 16201, 16198, 16196, 16197, 16200, 16196, 16195, 16197, 16200, 16198, 16197, 16199, 16204, 16202, 16202, 16205, 16209, 16206, 16204, 16204, 16207, 16203, 16202, 16203, 16207, 16203, 16203, 16204, 16209, 16207, 16207, 16209, 16213, 16210, 16208, 16209, 16211, 16208, 16207, 16208, 16212, 16209, 16209, 16211, 16215, 16214, 16214, 16217, 16221, 16218, 16216, 16217, 16220, 16216, 16215, 16217, 16220, 16218, 16217, 16219, 16224, 16222, 16222, 16225, 16229, 16226, 16224, 16225, 16228, 16225, 16223, 16225, 16229, 16226, 16225, 16228, 16232, 16230, 16230, 16233, 16237, 16234, 16232, 16232, 16235, 16231, 16229, 16231, 16234, 16231, 16230, 16232, 16236, 16235, 16235, 16237, 16241, 16238, 16236, 16237, 16240, 16236, 16235, 16237, 16240, 16238, 16237, 16239, 16244, 16242, 16242, 16245, 16249, 16246, 16244, 16244, 16247, 16243, 16242, 16243, 16247, 16243, 16243, 16244, 16249, 16247, 16247, 16249, 16253, 16250, 16248, 16249, 16251, 16248, 16246, 16248, 16252, 16249, 16249, 16251, 16255, 16254, 16254, 16257, 16261, 16258, 16256, 16257, 16260, 16256, 16255, 16257, 16261, 16258, 16257, 16259, 16264, 16262, 16262, 16265, 16269, 16266, 16264, 16265, 16268, 16264, 16263, 16264, 16268, 16265, 16265, 16267, 16272, 16270, 16270, 16273, 16277, 16274, 16272, 16273, 16276, 16273, 16271, 16273, 16277, 16274, 16273, 16276, 16280, 16278, 16278, 16281, 16285, 16282, 16280, 16280, 16283, 16279, 16277, 16279, 16282, 16279, 16278, 16280, 16284, 16282, 16283, 16285, 16289, 16286, 16284, 16285, 16288, 16284, 16283, 16285, 16288, 16286, 16285, 16287, 16292, 16290, 16290, 16293, 16297, 16294, 16292, 16292, 16295, 16291, 16290, 16291, 16294, 16291, 16290, 16292, 16297, 16295, 16295, 16297, 16301, 16298, 16296, 16297, 16299, 16296, 16294, 16296, 16300, 16297, 16297, 16299, 16303, 16302, 16302, 16305, 16309, 16306, 16304, 16305, 16308, 16304, 16303, 16305, 16308, 16306, 16305, 16307, 16312, 16310, 16310, 16313, 16317, 16314, 16312, 16313, 16316, 16312, 16311, 16313, 16317, 16314, 16313, 16316, 16320, 16318, 16318, 16321, 16325, 16322, 16320, 16320, 16323, 16319, 16317, 16319, 16322, 16319, 16318, 16320, 16324, 16322, 16322, 16325, 16329, 16326, 16324, 16325, 16328, 16324, 16323, 16324, 16328, 16326, 16325, 16327, 16332, 16330, 16330, 16333, 16337, 16334, 16332, 16332, 16335, 16331, 16330, 16331, 16334, 16331, 16330, 16332, 16337, 16335, 16335, 16337, 16341, 16338, 16336, 16337, 16339, 16336, 16334, 16336, 16340, 16337, 16336, 16339, 16343, 16342, 16342, 16345, 16349, 16346, 16344, 16345, 16348, 16344, 16343, 16345, 16349, 16346, 16345, 16347, 16352, 16350, 16350, 16353, 16357, 16354, 16352, 16353, 16355, 16352, 16351, 16352, 16356, 16353, 16353, 16355, 16359, 16358, 16358, 16361, 16365, 16362, 16360, 16361, 16364, 16361, 16360, 16362, 16366, 16363, 16363, 16366, 16370, 16369, 16369, 16372, 16377, 16374, 16373, 16374, 16377, 16374, 16373, 16375, 16379, 16376, 16376, 16379, 16383, 16381, 16381, 16383] + is_save: false + +auto_exposure: + is_enable: true + is_debug: true + center_illuminance: 90 + histogram_skewness: 0.9 + + +color_space_conversion: + conv_standard: 2 + # Bt.709 HD = 1 + # Bt.601/4407 = 2 + is_save: false + + +ldci: + is_enable: false + clip_limit: 1 + wind: 16 + is_save: false + +sharpen: + is_enable: true + sharpen_sigma: 5 + sharpen_strength: 1 + is_save: false + +2d_noise_reduction: + is_enable: false + # nlm + window_size: 21 + patch_size: 9 + wts: 10 + is_save: false + +rgb_conversion: + is_enable: true + is_save: false + +scale: + is_enable: false + is_debug: true + new_width: 1920 + new_height: 1080 + isHardware: true + # Nearest_Neighbor # Bilinear + Algo: "Nearest_Neighbor" + upscale_method: "Nearest_Neighbor" + downscale_method: "Bilinear" + is_save: false + +yuv_conversion_format: + # The conversion wont run if csc is false + is_enable: false + conv_type: '444' + is_save: false + +pre_gamma: + is_enable: false + is_save: false + +tone_mapping: + is_enable: false + is_save: false + +jpeg_conversion: + is_enable: false + is_save: false diff --git a/in_frames/normal/Indoor1_2592x1536_12bit_RGGB.raw b/in_frames/normal/data/Indoor1_2592x1536_12bit_RGGB.raw similarity index 100% rename from in_frames/normal/Indoor1_2592x1536_12bit_RGGB.raw rename to in_frames/normal/data/Indoor1_2592x1536_12bit_RGGB.raw diff --git a/in_frames/normal/data/Outdoor1_2592x1536_12bit_RGGB-configs.yml b/in_frames/normal/data/Outdoor1_2592x1536_12bit_RGGB-configs.yml new file mode 100644 index 0000000..a395d64 --- /dev/null +++ b/in_frames/normal/data/Outdoor1_2592x1536_12bit_RGGB-configs.yml @@ -0,0 +1,184 @@ +platform: + filename: "Outdoor1_2592x1536_12bit_RGGB.raw" + disable_progress_bar: false + leave_pbar_string: false + render_3a: false + # npy, png or both + save_format: both + +sensor_info: + bayer_pattern: "rggb" + range: 1023 + bit_depth: 12 + width: 2592 + height: 1536 + +crop: + is_enable: false + is_debug: false + new_width: 1280 + new_height: 720 + is_save: false + +dead_pixel_correction: + is_enable: false + dp_threshold: 80 + is_debug: true + is_save: false + +hdr_stitching: + is_enable: false + +black_level_correction: + is_enable: true + r_offset: 200 + gr_offset: 200 + gb_offset: 200 + b_offset: 200 + is_linear: false + r_sat: 4095 + gr_sat: 4095 + gb_sat: 4095 + b_sat: 4095 + is_save: false + +OECF: + is_enable: false + # Make sure the LUT has the right bit range i.e. if image is of 10 bit LUT should be from [0 - (2^10)-1] + # LUT here does nothing to the sensor response i.e. a value of 800 maps to 800 and 2000 maps to 2000 + r_lut: [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2094,2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,2480,2481,2482,2483,2484,2485,2486,2487,2488,2489,2490,2491,2492,2493,2494,2495,2496,2497,2498,2499,2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559,2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574,2575,2576,2577,2578,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2601,2602,2603,2604,2605,2606,2607,2608,2609,2610,2611,2612,2613,2614,2615,2616,2617,2618,2619,2620,2621,2622,2623,2624,2625,2626,2627,2628,2629,2630,2631,2632,2633,2634,2635,2636,2637,2638,2639,2640,2641,2642,2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658,2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,2691,2692,2693,2694,2695,2696,2697,2698,2699,2700,2701,2702,2703,2704,2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2729,2730,2731,2732,2733,2734,2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,2751,2752,2753,2754,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,2766,2767,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2780,2781,2782,2783,2784,2785,2786,2787,2788,2789,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,2810,2811,2812,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2857,2858,2859,2860,2861,2862,2863,2864,2865,2866,2867,2868,2869,2870,2871,2872,2873,2874,2875,2876,2877,2878,2879,2880,2881,2882,2883,2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,2962,2963,2964,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020,3021,3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069,3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3113,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174,3175,3176,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,3188,3189,3190,3191,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,3278,3279,3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295,3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327,3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343,3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,3388,3389,3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405,3406,3407,3408,3409,3410,3411,3412,3413,3414,3415,3416,3417,3418,3419,3420,3421,3422,3423,3424,3425,3426,3427,3428,3429,3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443,3444,3445,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3456,3457,3458,3459,3460,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,3512,3513,3514,3515,3516,3517,3518,3519,3520,3521,3522,3523,3524,3525,3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541,3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557,3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573,3574,3575,3576,3577,3578,3579,3580,3581,3582,3583,3584,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695,3696,3697,3698,3699,3700,3701,3702,3703,3704,3705,3706,3707,3708,3709,3710,3711,3712,3713,3714,3715,3716,3717,3718,3719,3720,3721,3722,3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744,3745,3746,3747,3748,3749,3750,3751,3752,3753,3754,3755,3756,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,3767,3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,3779,3780,3781,3782,3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3802,3803,3804,3805,3806,3807,3808,3809,3810,3811,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,3822,3823,3824,3825,3826,3827,3828,3829,3830,3831,3832,3833,3834,3835,3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847,3848,3849,3850,3851,3852,3853,3854,3855,3856,3857,3858,3859,3860,3861,3862,3863,3864,3865,3866,3867,3868,3869,3870,3871,3872,3873,3874,3875,3876,3877,3878,3879,3880,3881,3882,3883,3884,3885,3886,3887,3888,3889,3890,3891,3892,3893,3894,3895,3896,3897,3898,3899,3900,3901,3902,3903,3904,3905,3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,3940,3941,3942,3943,3944,3945,3946,3947,3948,3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,3978,3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,3992,3993,3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,4056,4057,4058,4059,4060,4061,4062,4063,4064,4065,4066,4067,4068,4069,4070,4071,4072,4073,4074,4075,4076,4077,4078,4079,4080,4081,4082,4083,4084,4085,4086,4087,4088,4089,4090,4091,4092,4093,4094,4095] + is_save: false + +digital_gain: + is_debug: true + is_auto: true + # Array of pre-define Gains + gain_array: [1, 2, 4, 6, 8, 10, 12, 16, 32, 64] + # Index of default gain + current_gain: 0 + ae_feedback: 0 + is_save: false + +lens_shading_correction: + is_enable: false + is_save: false + +bayer_noise_reduction: + is_enable: true + filter_window: 9 + r_std_dev_s: 1 + r_std_dev_r: 0.1 + g_std_dev_s: 1 + g_std_dev_r: 0.08 + b_std_dev_s: 1 + b_std_dev_r: 0.1 + is_save: false + +auto_white_balance: + is_enable: true + is_debug: true + underexposed_percentage: 5 + overexposed_percentage: 5 + algorithm: "norm_2" + # grey_world, norm_2, pca + percentage: 3.5 # pca + +white_balance: + is_enable: true + # is_auto refers to auto white balance module + is_debug: true + is_auto: true + r_gain: 1.768566 + b_gain: 1.641026 + is_save: false + +demosaic: + is_save: false + +color_correction_matrix: + #Row sum to 1 convention + is_enable: true + corrected_red: [ 1.87578, -0.59375, -0.08203125 ] + corrected_green: [ -0.2421875, 1.5078125, -0.265625 ] + corrected_blue: [ -0.0078125, -0.44921875, 1.35703125 ] + is_save: false + +gamma_correction: + is_enable: true + # 8-bit + gamma_lut_8: [0, 5, 9, 13, 17, 22, 25, 29, 33, 37, 40, 44, 47, 50, 54, 57, 60, 63, 66, 69, 72, 75, 78, 80, 83, 85, 88, 90, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113, 115, 117, 118, 120, 122, 123, 125, 126, 128, 129, 131, 132, 134, 135, 136, 138, 139, 140, 141, 142, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 162, 163, 164, 165, 166, 167, 167, 168, 169, 170, 171, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 179, 179, 180, 181, 181, 182, 183, 183, 184, 185, 185, 186, 187, 187, 188, 188, 189, 190, 190, 191, 191, 192, 193, 193, 194, 194, 195, 195, 196, 197, 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 205, 205, 206, 206, 207, 207, 208, 208, 209, 209, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 216, 217, 217, 218, 218, 219, 219, 220, 220, 221, 221, 221, 222, 222, 223, 223, 224, 224, 225, 225, 225, 226, 226, 227, 227, 228, 228, 228, 229, 229, 230, 230, 231, 231, 231, 232, 232, 233, 233, 234, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240, 241, 241, 241, 242, 242, 243, 243, 244, 244, 244, 245, 245, 246, 246, 247, 247, 247, 248, 248, 249, 249, 250, 250, 250, 251, 251, 252, 252, 252, 253, 253, 254, 254, 255] + # 10-bit + gamma_lut_10: [0, 9, 13, 17, 21, 25, 29, 34, 38, 42, 46, 50, 54, 58, 62, 66, 70, 74, 78, 82, 86, 90, 94, 98, 102, 106, 110, 114, 117, 121, 125, 129, 132, 136, 140, 143, 147, 150, 154, 157, 161, 165, 168, 172, 175, 179, 182, 185, 189, 192, 196, 199, 202, 205, 209, 212, 215, 219, 222, 225, 228, 231, 235, 238, 241, 244, 247, 250, 253, 256, 259, 262, 265, 268, 271, 274, 277, 280, 283, 286, 289, 292, 295, 297, 300, 303, 306, 308, 311, 314, 317, 319, 322, 325, 327, 330, 332, 335, 337, 340, 342, 345, 347, 350, 352, 355, 357, 359, 362, 364, 367, 369, 371, 374, 376, 378, 380, 383, 385, 387, 389, 392, 394, 396, 398, 400, 402, 404, 406, 409, 411, 413, 415, 417, 419, 421, 423, 425, 427, 429, 431, 433, 435, 437, 439, 441, 443, 444, 446, 448, 450, 452, 454, 455, 457, 459, 461, 463, 464, 466, 468, 469, 471, 473, 474, 476, 478, 479, 481, 483, 484, 486, 488, 489, 491, 492, 494, 495, 497, 499, 500, 502, 503, 505, 506, 508, 509, 511, 513, 514, 516, 517, 519, 520, 521, 523, 524, 526, 527, 529, 530, 532, 533, 534, 536, 537, 539, 540, 541, 543, 544, 545, 547, 548, 549, 550, 552, 553, 554, 555, 557, 558, 559, 560, 562, 563, 564, 565, 567, 568, 569, 570, 571, 573, 574, 575, 576, 577, 578, 580, 581, 582, 583, 584, 585, 586, 588, 589, 590, 591, 592, 593, 594, 595, 596, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 633, 634, 635, 636, 637, 638, 639, 640, 641, 641, 642, 643, 644, 645, 646, 647, 648, 649, 649, 650, 651, 652, 653, 654, 655, 655, 656, 657, 658, 659, 660, 660, 661, 662, 663, 664, 665, 665, 666, 667, 668, 669, 670, 670, 671, 672, 673, 674, 674, 675, 676, 677, 678, 678, 679, 680, 681, 681, 682, 683, 683, 684, 685, 686, 686, 687, 688, 689, 689, 690, 691, 692, 692, 693, 694, 695, 695, 696, 697, 697, 698, 699, 700, 700, 701, 702, 703, 703, 704, 705, 705, 706, 707, 708, 708, 709, 710, 710, 711, 712, 713, 713, 714, 715, 715, 716, 717, 717, 718, 719, 719, 720, 721, 722, 722, 723, 724, 724, 725, 726, 726, 727, 728, 728, 729, 730, 731, 731, 732, 733, 733, 734, 734, 735, 736, 736, 737, 738, 738, 739, 740, 740, 741, 742, 742, 743, 744, 744, 745, 745, 746, 747, 747, 748, 749, 749, 750, 751, 751, 752, 753, 753, 754, 754, 755, 756, 756, 757, 757, 758, 759, 759, 760, 761, 761, 762, 762, 763, 763, 764, 765, 765, 766, 766, 767, 768, 768, 769, 769, 770, 771, 771, 772, 772, 773, 774, 774, 775, 775, 776, 776, 777, 777, 778, 779, 779, 780, 780, 781, 782, 782, 783, 783, 784, 784, 785, 785, 786, 787, 787, 788, 788, 789, 789, 790, 791, 791, 792, 792, 793, 793, 794, 794, 795, 795, 796, 797, 797, 797, 798, 799, 799, 800, 800, 801, 801, 802, 802, 803, 803, 804, 805, 805, 806, 806, 806, 807, 808, 808, 809, 809, 810, 810, 811, 811, 812, 812, 813, 813, 814, 814, 815, 815, 816, 816, 817, 817, 818, 818, 819, 819, 820, 821, 821, 821, 822, 823, 823, 824, 824, 825, 825, 826, 826, 827, 827, 828, 828, 829, 829, 830, 830, 831, 831, 832, 832, 833, 833, 834, 834, 835, 835, 836, 836, 837, 837, 838, 838, 839, 839, 839, 840, 841, 841, 842, 842, 842, 843, 843, 844, 845, 845, 845, 846, 846, 847, 847, 848, 848, 849, 849, 850, 850, 851, 851, 852, 852, 853, 853, 854, 854, 855, 855, 856, 856, 857, 857, 858, 858, 859, 859, 860, 860, 861, 861, 862, 862, 863, 863, 864, 864, 865, 865, 866, 866, 867, 867, 868, 868, 868, 869, 870, 870, 870, 871, 871, 872, 872, 873, 873, 874, 874, 875, 875, 876, 876, 877, 877, 878, 878, 879, 879, 880, 880, 881, 881, 881, 882, 882, 883, 883, 884, 884, 885, 885, 886, 886, 887, 887, 887, 888, 888, 889, 889, 890, 890, 891, 891, 892, 892, 892, 893, 893, 894, 894, 895, 895, 896, 896, 896, 897, 897, 898, 898, 899, 899, 900, 900, 900, 901, 901, 902, 902, 903, 903, 903, 904, 904, 905, 905, 906, 906, 906, 907, 907, 908, 908, 909, 909, 910, 910, 910, 911, 911, 912, 912, 913, 913, 913, 914, 914, 915, 915, 916, 916, 916, 917, 917, 918, 918, 919, 919, 919, 920, 920, 921, 921, 922, 922, 922, 923, 923, 924, 924, 925, 925, 925, 926, 926, 927, 927, 928, 928, 928, 929, 929, 930, 930, 931, 931, 931, 932, 932, 933, 933, 934, 934, 934, 935, 935, 936, 936, 936, 937, 937, 938, 938, 939, 939, 939, 940, 940, 941, 941, 942, 942, 943, 943, 943, 944, 944, 945, 945, 946, 946, 947, 947, 947, 948, 948, 949, 949, 950, 950, 951, 951, 951, 952, 952, 953, 953, 954, 954, 955, 955, 956, 956, 956, 957, 957, 958, 958, 959, 959, 960, 960, 961, 961, 961, 962, 962, 963, 963, 964, 964, 964, 965, 965, 966, 966, 967, 967, 968, 968, 968, 969, 969, 970, 970, 971, 971, 971, 972, 972, 973, 973, 974, 974, 975, 975, 975, 976, 976, 977, 977, 977, 978, 978, 979, 979, 980, 980, 980, 981, 981, 982, 982, 983, 983, 983, 984, 984, 985, 985, 986, 986, 986, 987, 987, 988, 988, 988, 989, 989, 990, 990, 990, 991, 991, 992, 992, 993, 993, 994, 994, 994, 995, 995, 996, 996, 997, 997, 997, 998, 998, 999, 999, 999, 1000, 1000, 1001, 1001, 1002, 1002, 1002, 1003, 1003, 1004, 1004, 1004, 1005, 1005, 1006, 1006, 1007, 1007, 1007, 1008, 1008, 1009, 1009, 1010, 1010, 1010, 1011, 1011, 1012, 1012, 1013, 1013, 1013, 1014, 1014, 1015, 1015, 1015, 1016, 1016, 1017, 1017, 1018, 1018, 1018, 1019, 1019, 1020, 1020, 1021, 1021, 1021, 1022, 1022, 1023, 1023] + # 12-bit + gamma_lut_12: [0, 11, 21, 30, 37, 42, 46, 50, 53, 57, 61, 65, 70, 74, 78, 82, 86, 90, 94, 98, 102, 106, 110, 114, 118, 122, 126, 131, 135, 139, 143, 147, 151, 155, 159, 163, 167, 171, 175, 179, 183, 187, 191, 195, 199, 203, 207, 212, 216, 220, 224, 228, 232, 236, 240, 245, 249, 253, 257, 261, 265, 269, 273, 277, 281, 285, 289, 293, 297, 301, 305, 309, 313, 317, 321, 326, 330, 334, 338, 342, 346, 350, 354, 358, 362, 365, 369, 373, 377, 381, 385, 390, 394, 398, 401, 405, 409, 413, 417, 421, 425, 429, 432, 436, 440, 443, 447, 451, 455, 458, 462, 466, 470, 473, 477, 481, 485, 488, 492, 496, 500, 503, 507, 511, 515, 519, 522, 526, 530, 533, 537, 540, 544, 547, 551, 555, 559, 562, 566, 569, 573, 576, 580, 584, 588, 591, 595, 598, 602, 605, 609, 612, 616, 619, 622, 626, 630, 633, 637, 641, 645, 648, 652, 655, 659, 662, 665, 669, 673, 676, 680, 683, 687, 690, 693, 696, 700, 703, 707, 711, 715, 718, 721, 724, 728, 731, 734, 738, 742, 745, 749, 752, 756, 759, 762, 765, 769, 772, 775, 779, 783, 786, 789, 792, 796, 799, 802, 805, 809, 812, 815, 818, 822, 825, 828, 832, 836, 839, 842, 845, 849, 852, 855, 858, 862, 865, 868, 871, 875, 878, 881, 884, 888, 890, 893, 896, 900, 903, 906, 910, 914, 917, 920, 923, 926, 929, 932, 935, 939, 942, 945, 948, 952, 954, 957, 960, 964, 967, 970, 973, 977, 979, 982, 985, 989, 992, 995, 998, 1002, 1005, 1007, 1010, 1014, 1016, 1019, 1022, 1026, 1028, 1031, 1034, 1038, 1040, 1043, 1046, 1050, 1052, 1055, 1058, 1062, 1064, 1067, 1070, 1074, 1076, 1079, 1082, 1086, 1088, 1091, 1094, 1098, 1100, 1103, 1106, 1110, 1112, 1115, 1118, 1121, 1123, 1126, 1129, 1133, 1135, 1138, 1141, 1145, 1147, 1150, 1153, 1156, 1158, 1161, 1163, 1167, 1169, 1172, 1175, 1179, 1181, 1184, 1187, 1190, 1192, 1195, 1198, 1201, 1203, 1206, 1209, 1212, 1214, 1217, 1220, 1223, 1225, 1228, 1231, 1234, 1236, 1239, 1242, 1245, 1247, 1250, 1253, 1256, 1258, 1261, 1264, 1267, 1269, 1271, 1274, 1277, 1279, 1282, 1284, 1288, 1290, 1293, 1296, 1299, 1301, 1303, 1306, 1309, 1311, 1314, 1317, 1320, 1322, 1324, 1327, 1330, 1332, 1335, 1338, 1341, 1343, 1345, 1347, 1350, 1352, 1355, 1358, 1360, 1363, 1365, 1367, 1369, 1372, 1375, 1378, 1380, 1383, 1385, 1387, 1389, 1392, 1395, 1397, 1400, 1403, 1405, 1407, 1409, 1412, 1414, 1417, 1419, 1422, 1424, 1427, 1429, 1431, 1434, 1436, 1438, 1441, 1443, 1446, 1448, 1451, 1453, 1456, 1458, 1461, 1463, 1465, 1467, 1469, 1471, 1474, 1476, 1479, 1481, 1484, 1486, 1488, 1491, 1493, 1495, 1497, 1499, 1502, 1504, 1506, 1509, 1511, 1513, 1515, 1518, 1520, 1522, 1524, 1527, 1529, 1531, 1533, 1535, 1538, 1540, 1542, 1544, 1547, 1549, 1551, 1553, 1556, 1558, 1560, 1563, 1565, 1567, 1569, 1571, 1573, 1575, 1577, 1579, 1582, 1584, 1586, 1588, 1590, 1592, 1594, 1596, 1599, 1601, 1603, 1605, 1607, 1609, 1611, 1613, 1616, 1618, 1620, 1622, 1624, 1626, 1628, 1630, 1633, 1635, 1637, 1639, 1641, 1643, 1645, 1647, 1650, 1652, 1654, 1656, 1658, 1660, 1662, 1664, 1666, 1668, 1670, 1672, 1674, 1676, 1678, 1680, 1682, 1684, 1686, 1688, 1691, 1693, 1695, 1697, 1699, 1701, 1703, 1705, 1707, 1709, 1711, 1713, 1715, 1717, 1719, 1721, 1723, 1725, 1727, 1728, 1730, 1732, 1734, 1736, 1738, 1740, 1742, 1744, 1746, 1748, 1750, 1751, 1753, 1755, 1757, 1759, 1761, 1763, 1765, 1767, 1769, 1771, 1773, 1774, 1776, 1778, 1780, 1782, 1784, 1786, 1788, 1789, 1791, 1793, 1795, 1796, 1798, 1800, 1802, 1803, 1805, 1807, 1809, 1811, 1813, 1815, 1817, 1818, 1820, 1822, 1824, 1825, 1827, 1829, 1831, 1832, 1834, 1836, 1838, 1839, 1841, 1843, 1845, 1847, 1849, 1851, 1853, 1854, 1856, 1857, 1858, 1860, 1862, 1864, 1866, 1868, 1870, 1872, 1874, 1875, 1876, 1878, 1880, 1881, 1883, 1885, 1887, 1888, 1890, 1892, 1893, 1895, 1896, 1898, 1900, 1901, 1903, 1905, 1907, 1908, 1910, 1912, 1913, 1915, 1916, 1918, 1920, 1921, 1923, 1925, 1927, 1928, 1930, 1932, 1933, 1935, 1936, 1938, 1940, 1941, 1943, 1945, 1947, 1948, 1949, 1951, 1952, 1954, 1955, 1957, 1959, 1960, 1962, 1964, 1965, 1967, 1968, 1970, 1972, 1973, 1975, 1977, 1978, 1979, 1981, 1982, 1983, 1985, 1987, 1989, 1990, 1992, 1993, 1995, 1997, 1998, 2000, 2002, 2003, 2005, 2006, 2008, 2009, 2011, 2012, 2014, 2015, 2017, 2018, 2020, 2021, 2023, 2024, 2026, 2027, 2029, 2030, 2032, 2033, 2035, 2036, 2038, 2039, 2041, 2042, 2044, 2046, 2047, 2049, 2051, 2052, 2053, 2055, 2056, 2057, 2059, 2061, 2063, 2064, 2066, 2067, 2069, 2070, 2072, 2073, 2075, 2076, 2077, 2079, 2080, 2081, 2083, 2084, 2086, 2087, 2089, 2090, 2092, 2093, 2095, 2096, 2098, 2099, 2101, 2102, 2104, 2105, 2107, 2108, 2110, 2111, 2112, 2114, 2115, 2116, 2117, 2119, 2121, 2122, 2124, 2125, 2127, 2128, 2129, 2130, 2132, 2133, 2135, 2136, 2138, 2139, 2140, 2142, 2143, 2144, 2145, 2147, 2149, 2150, 2152, 2153, 2155, 2156, 2157, 2159, 2160, 2161, 2162, 2163, 2165, 2166, 2168, 2169, 2171, 2172, 2173, 2175, 2176, 2177, 2178, 2179, 2181, 2182, 2184, 2185, 2187, 2188, 2189, 2191, 2192, 2193, 2194, 2195, 2197, 2198, 2199, 2200, 2202, 2203, 2205, 2206, 2208, 2209, 2210, 2212, 2213, 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2222, 2223, 2225, 2226, 2228, 2229, 2230, 2232, 2233, 2234, 2235, 2237, 2238, 2239, 2240, 2241, 2242, 2243, 2244, 2245, 2247, 2248, 2249, 2250, 2252, 2253, 2255, 2256, 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274, 2276, 2277, 2278, 2279, 2281, 2282, 2283, 2284, 2286, 2287, 2288, 2289, 2291, 2292, 2293, 2295, 2296, 2297, 2297, 2299, 2300, 2301, 2302, 2303, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2314, 2315, 2316, 2318, 2319, 2320, 2320, 2322, 2323, 2324, 2325, 2326, 2328, 2329, 2330, 2332, 2333, 2334, 2334, 2336, 2337, 2338, 2339, 2340, 2342, 2343, 2343, 2345, 2346, 2347, 2348, 2349, 2351, 2352, 2353, 2354, 2355, 2356, 2356, 2358, 2359, 2360, 2361, 2362, 2364, 2365, 2365, 2367, 2368, 2369, 2370, 2371, 2373, 2374, 2374, 2376, 2377, 2378, 2379, 2380, 2382, 2383, 2383, 2385, 2386, 2387, 2388, 2389, 2391, 2392, 2393, 2394, 2395, 2396, 2396, 2398, 2399, 2400, 2401, 2402, 2404, 2405, 2406, 2407, 2408, 2409, 2409, 2411, 2412, 2413, 2414, 2415, 2417, 2418, 2419, 2420, 2421, 2422, 2422, 2424, 2425, 2426, 2426, 2428, 2429, 2430, 2430, 2432, 2433, 2434, 2434, 2436, 2437, 2438, 2439, 2440, 2442, 2443, 2444, 2445, 2446, 2447, 2447, 2449, 2450, 2451, 2451, 2453, 2454, 2455, 2455, 2457, 2458, 2459, 2459, 2461, 2462, 2463, 2463, 2465, 2466, 2467, 2468, 2469, 2470, 2470, 2471, 2472, 2473, 2473, 2474, 2476, 2477, 2478, 2478, 2480, 2481, 2482, 2482, 2484, 2485, 2486, 2486, 2488, 2489, 2490, 2490, 2492, 2493, 2494, 2494, 2496, 2497, 2498, 2498, 2500, 2501, 2502, 2502, 2504, 2505, 2505, 2506, 2507, 2508, 2509, 2509, 2511, 2512, 2512, 2513, 2514, 2515, 2515, 2516, 2517, 2519, 2520, 2520, 2522, 2523, 2524, 2524, 2526, 2527, 2528, 2528, 2530, 2531, 2531, 2532, 2533, 2534, 2535, 2535, 2537, 2538, 2538, 2539, 2540, 2541, 2542, 2542, 2544, 2545, 2545, 2546, 2547, 2548, 2548, 2549, 2550, 2552, 2553, 2553, 2555, 2556, 2556, 2557, 2558, 2559, 2560, 2560, 2562, 2563, 2563, 2564, 2565, 2566, 2566, 2567, 2568, 2570, 2571, 2571, 2573, 2574, 2574, 2575, 2576, 2577, 2577, 2578, 2580, 2581, 2581, 2582, 2583, 2584, 2584, 2585, 2586, 2587, 2587, 2588, 2589, 2591, 2592, 2592, 2594, 2595, 2595, 2596, 2597, 2598, 2598, 2599, 2600, 2601, 2602, 2602, 2604, 2605, 2605, 2606, 2607, 2608, 2608, 2609, 2610, 2612, 2613, 2613, 2615, 2616, 2616, 2617, 2618, 2619, 2619, 2620, 2621, 2622, 2622, 2623, 2624, 2625, 2625, 2626, 2627, 2629, 2630, 2630, 2632, 2633, 2633, 2634, 2635, 2636, 2636, 2637, 2638, 2639, 2639, 2640, 2641, 2642, 2642, 2643, 2645, 2646, 2646, 2647, 2648, 2649, 2649, 2650, 2651, 2653, 2653, 2654, 2655, 2656, 2656, 2657, 2658, 2659, 2659, 2660, 2661, 2662, 2662, 2663, 2665, 2666, 2666, 2667, 2668, 2669, 2669, 2670, 2671, 2672, 2672, 2673, 2674, 2675, 2675, 2676, 2677, 2679, 2679, 2680, 2681, 2682, 2682, 2683, 2684, 2685, 2685, 2686, 2687, 2688, 2688, 2689, 2690, 2691, 2691, 2692, 2693, 2695, 2695, 2696, 2697, 2698, 2698, 2699, 2700, 2701, 2701, 2702, 2703, 2704, 2704, 2705, 2706, 2707, 2707, 2708, 2709, 2711, 2711, 2712, 2713, 2714, 2714, 2714, 2715, 2716, 2716, 2717, 2718, 2720, 2720, 2721, 2722, 2723, 2723, 2724, 2725, 2726, 2726, 2727, 2728, 2729, 2729, 2730, 2731, 2732, 2732, 2733, 2734, 2735, 2735, 2736, 2737, 2738, 2738, 2739, 2740, 2741, 2741, 2742, 2743, 2744, 2744, 2745, 2746, 2747, 2747, 2748, 2749, 2750, 2750, 2751, 2752, 2753, 2753, 2754, 2755, 2756, 2756, 2757, 2758, 2759, 2759, 2760, 2761, 2762, 2762, 2763, 2764, 2765, 2765, 2766, 2767, 2768, 2768, 2769, 2770, 2771, 2771, 2772, 2773, 2774, 2774, 2775, 2776, 2777, 2777, 2778, 2779, 2780, 2780, 2780, 2781, 2782, 2782, 2782, 2783, 2785, 2785, 2786, 2788, 2789, 2789, 2789, 2790, 2791, 2791, 2792, 2793, 2794, 2794, 2795, 2796, 2797, 2797, 2798, 2799, 2800, 2800, 2801, 2802, 2803, 2803, 2804, 2805, 2806, 2806, 2807, 2808, 2809, 2809, 2810, 2811, 2812, 2812, 2812, 2813, 2814, 2814, 2814, 2815, 2817, 2817, 2818, 2820, 2821, 2821, 2821, 2822, 2823, 2823, 2824, 2825, 2826, 2826, 2827, 2828, 2829, 2829, 2830, 2831, 2832, 2832, 2833, 2834, 2835, 2835, 2835, 2836, 2837, 2837, 2838, 2839, 2841, 2841, 2841, 2842, 2843, 2843, 2843, 2845, 2846, 2846, 2847, 2848, 2849, 2849, 2850, 2851, 2852, 2852, 2853, 2854, 2855, 2855, 2855, 2856, 2857, 2857, 2858, 2859, 2860, 2860, 2861, 2862, 2863, 2863, 2864, 2865, 2866, 2866, 2866, 2867, 2868, 2868, 2869, 2870, 2871, 2871, 2872, 2873, 2874, 2874, 2875, 2876, 2877, 2877, 2877, 2878, 2879, 2879, 2880, 2881, 2883, 2883, 2883, 2884, 2885, 2885, 2885, 2887, 2888, 2888, 2889, 2890, 2891, 2891, 2892, 2893, 2894, 2894, 2894, 2895, 2896, 2896, 2897, 2898, 2899, 2899, 2900, 2901, 2902, 2902, 2903, 2904, 2905, 2905, 2905, 2906, 2907, 2907, 2907, 2908, 2910, 2910, 2911, 2912, 2913, 2913, 2913, 2914, 2915, 2915, 2915, 2917, 2918, 2918, 2919, 2920, 2921, 2921, 2922, 2923, 2924, 2924, 2924, 2925, 2926, 2926, 2926, 2927, 2928, 2928, 2929, 2930, 2932, 2932, 2932, 2933, 2934, 2934, 2934, 2935, 2936, 2936, 2937, 2938, 2939, 2939, 2940, 2941, 2942, 2942, 2943, 2944, 2945, 2945, 2945, 2946, 2947, 2947, 2947, 2948, 2950, 2950, 2951, 2952, 2953, 2953, 2953, 2954, 2955, 2955, 2956, 2957, 2958, 2958, 2958, 2959, 2960, 2960, 2961, 2962, 2963, 2963, 2963, 2964, 2965, 2965, 2965, 2966, 2968, 2968, 2969, 2970, 2971, 2971, 2971, 2972, 2973, 2973, 2973, 2974, 2976, 2976, 2977, 2978, 2979, 2979, 2979, 2980, 2981, 2981, 2981, 2982, 2983, 2983, 2983, 2984, 2986, 2986, 2987, 2988, 2989, 2989, 2989, 2990, 2991, 2991, 2992, 2993, 2994, 2994, 2994, 2995, 2996, 2996, 2997, 2998, 2999, 2999, 2999, 3000, 3001, 3001, 3002, 3003, 3004, 3004, 3004, 3005, 3006, 3006, 3006, 3007, 3009, 3009, 3010, 3011, 3012, 3012, 3012, 3013, 3014, 3014, 3014, 3015, 3016, 3016, 3017, 3018, 3019, 3019, 3019, 3020, 3021, 3021, 3022, 3023, 3024, 3024, 3024, 3025, 3026, 3026, 3027, 3028, 3029, 3029, 3029, 3030, 3031, 3031, 3031, 3033, 3034, 3034, 3034, 3035, 3036, 3036, 3036, 3037, 3038, 3038, 3038, 3039, 3041, 3041, 3042, 3043, 3044, 3044, 3044, 3045, 3046, 3046, 3046, 3047, 3048, 3048, 3049, 3050, 3051, 3051, 3051, 3052, 3053, 3053, 3053, 3054, 3055, 3055, 3056, 3057, 3058, 3058, 3058, 3059, 3060, 3060, 3060, 3061, 3062, 3062, 3063, 3064, 3065, 3065, 3065, 3066, 3067, 3067, 3067, 3068, 3069, 3069, 3070, 3071, 3072, 3072, 3072, 3073, 3074, 3074, 3074, 3076, 3077, 3077, 3077, 3078, 3079, 3079, 3079, 3080, 3082, 3082, 3082, 3083, 3084, 3084, 3084, 3085, 3086, 3086, 3086, 3088, 3089, 3089, 3089, 3090, 3091, 3091, 3091, 3092, 3093, 3093, 3093, 3095, 3096, 3096, 3096, 3097, 3098, 3098, 3098, 3099, 3100, 3100, 3100, 3102, 3103, 3103, 3103, 3104, 3105, 3105, 3105, 3106, 3107, 3107, 3107, 3108, 3109, 3109, 3109, 3110, 3111, 3111, 3111, 3112, 3114, 3114, 3114, 3115, 3116, 3116, 3116, 3117, 3118, 3118, 3118, 3119, 3121, 3121, 3121, 3122, 3123, 3123, 3123, 3124, 3125, 3125, 3125, 3126, 3128, 3128, 3128, 3129, 3130, 3130, 3130, 3131, 3132, 3132, 3132, 3133, 3134, 3134, 3134, 3135, 3137, 3137, 3137, 3138, 3139, 3139, 3139, 3140, 3141, 3141, 3141, 3142, 3143, 3143, 3143, 3144, 3145, 3145, 3145, 3146, 3148, 3148, 3148, 3149, 3150, 3150, 3150, 3151, 3152, 3152, 3152, 3153, 3155, 3155, 3155, 3156, 3157, 3157, 3157, 3158, 3159, 3159, 3159, 3160, 3161, 3161, 3162, 3163, 3164, 3163, 3163, 3164, 3165, 3165, 3165, 3166, 3168, 3168, 3168, 3169, 3170, 3170, 3170, 3171, 3172, 3172, 3172, 3173, 3175, 3175, 3175, 3176, 3177, 3177, 3177, 3178, 3179, 3179, 3179, 3180, 3181, 3181, 3181, 3182, 3183, 3183, 3183, 3184, 3185, 3185, 3185, 3186, 3188, 3188, 3188, 3189, 3190, 3189, 3189, 3190, 3191, 3191, 3191, 3192, 3194, 3194, 3194, 3195, 3196, 3196, 3196, 3197, 3198, 3198, 3199, 3200, 3201, 3201, 3201, 3201, 3202, 3201, 3202, 3202, 3204, 3204, 3204, 3205, 3207, 3207, 3207, 3208, 3209, 3209, 3209, 3210, 3211, 3211, 3211, 3212, 3213, 3213, 3213, 3214, 3215, 3215, 3215, 3216, 3217, 3217, 3218, 3219, 3220, 3219, 3219, 3220, 3221, 3221, 3221, 3222, 3224, 3224, 3224, 3225, 3226, 3225, 3225, 3226, 3227, 3227, 3227, 3228, 3230, 3230, 3230, 3231, 3232, 3232, 3232, 3233, 3234, 3234, 3234, 3235, 3236, 3236, 3236, 3237, 3238, 3238, 3238, 3239, 3240, 3240, 3240, 3242, 3243, 3243, 3243, 3243, 3244, 3243, 3244, 3244, 3246, 3246, 3247, 3248, 3249, 3248, 3248, 3249, 3250, 3250, 3250, 3251, 3253, 3253, 3253, 3254, 3255, 3255, 3255, 3256, 3257, 3257, 3257, 3258, 3259, 3259, 3259, 3260, 3261, 3261, 3261, 3262, 3263, 3263, 3263, 3264, 3265, 3265, 3265, 3266, 3267, 3267, 3267, 3268, 3269, 3269, 3269, 3270, 3271, 3271, 3271, 3272, 3273, 3273, 3273, 3274, 3275, 3275, 3275, 3276, 3278, 3278, 3278, 3278, 3279, 3278, 3279, 3279, 3281, 3281, 3281, 3282, 3284, 3284, 3284, 3285, 3286, 3285, 3285, 3286, 3287, 3287, 3287, 3288, 3290, 3290, 3290, 3291, 3292, 3291, 3291, 3292, 3293, 3293, 3293, 3294, 3296, 3296, 3296, 3297, 3298, 3298, 3298, 3299, 3300, 3300, 3300, 3301, 3302, 3302, 3302, 3303, 3304, 3304, 3304, 3305, 3306, 3306, 3306, 3307, 3308, 3308, 3308, 3309, 3310, 3310, 3310, 3311, 3312, 3312, 3312, 3313, 3314, 3314, 3314, 3315, 3316, 3316, 3316, 3317, 3318, 3318, 3318, 3319, 3320, 3320, 3320, 3321, 3322, 3322, 3322, 3323, 3324, 3324, 3324, 3325, 3326, 3326, 3326, 3327, 3328, 3328, 3328, 3329, 3330, 3330, 3330, 3331, 3332, 3332, 3332, 3333, 3334, 3334, 3334, 3335, 3336, 3336, 3336, 3337, 3338, 3338, 3338, 3339, 3340, 3340, 3340, 3341, 3342, 3342, 3342, 3343, 3344, 3344, 3344, 3345, 3346, 3346, 3346, 3347, 3348, 3348, 3348, 3349, 3350, 3350, 3350, 3351, 3352, 3352, 3352, 3353, 3354, 3354, 3354, 3355, 3356, 3356, 3356, 3357, 3358, 3357, 3357, 3358, 3359, 3359, 3359, 3360, 3362, 3362, 3362, 3363, 3364, 3363, 3363, 3364, 3365, 3365, 3365, 3366, 3368, 3368, 3368, 3369, 3370, 3369, 3369, 3370, 3371, 3371, 3371, 3372, 3374, 3373, 3373, 3374, 3375, 3374, 3375, 3375, 3377, 3377, 3377, 3378, 3380, 3379, 3379, 3380, 3381, 3380, 3381, 3381, 3383, 3383, 3383, 3384, 3385, 3385, 3385, 3386, 3387, 3387, 3387, 3388, 3389, 3389, 3389, 3390, 3391, 3391, 3391, 3392, 3393, 3393, 3393, 3394, 3395, 3395, 3395, 3396, 3397, 3397, 3397, 3398, 3399, 3399, 3399, 3400, 3401, 3401, 3401, 3402, 3403, 3403, 3403, 3404, 3405, 3405, 3405, 3406, 3407, 3406, 3406, 3407, 3408, 3408, 3408, 3409, 3411, 3411, 3411, 3412, 3413, 3412, 3412, 3413, 3414, 3414, 3414, 3415, 3417, 3417, 3417, 3418, 3419, 3418, 3418, 3419, 3420, 3419, 3420, 3420, 3422, 3422, 3422, 3423, 3425, 3424, 3424, 3425, 3426, 3425, 3425, 3426, 3428, 3428, 3428, 3429, 3431, 3430, 3430, 3431, 3432, 3431, 3432, 3432, 3434, 3434, 3434, 3435, 3436, 3436, 3436, 3437, 3438, 3438, 3438, 3439, 3440, 3440, 3440, 3441, 3442, 3442, 3442, 3443, 3444, 3444, 3444, 3445, 3446, 3446, 3446, 3447, 3448, 3448, 3448, 3449, 3450, 3450, 3450, 3451, 3452, 3452, 3452, 3453, 3454, 3454, 3454, 3455, 3456, 3456, 3456, 3457, 3458, 3458, 3458, 3459, 3460, 3460, 3460, 3461, 3462, 3462, 3462, 3463, 3464, 3463, 3464, 3464, 3466, 3466, 3466, 3467, 3468, 3467, 3467, 3468, 3469, 3469, 3469, 3470, 3472, 3472, 3472, 3473, 3474, 3473, 3473, 3474, 3475, 3474, 3474, 3475, 3477, 3477, 3477, 3478, 3480, 3479, 3479, 3480, 3481, 3480, 3481, 3481, 3483, 3483, 3483, 3484, 3485, 3485, 3485, 3486, 3487, 3487, 3487, 3488, 3489, 3489, 3489, 3490, 3491, 3491, 3491, 3492, 3493, 3492, 3493, 3493, 3495, 3495, 3495, 3496, 3497, 3496, 3496, 3497, 3498, 3498, 3498, 3499, 3501, 3501, 3501, 3502, 3503, 3502, 3502, 3503, 3504, 3503, 3503, 3504, 3506, 3506, 3506, 3507, 3509, 3508, 3508, 3509, 3510, 3509, 3510, 3510, 3512, 3512, 3512, 3513, 3514, 3513, 3514, 3514, 3516, 3515, 3516, 3516, 3518, 3517, 3518, 3518, 3520, 3519, 3520, 3520, 3522, 3522, 3522, 3523, 3524, 3523, 3523, 3524, 3525, 3524, 3524, 3525, 3527, 3527, 3527, 3528, 3530, 3529, 3529, 3530, 3531, 3530, 3531, 3531, 3533, 3532, 3533, 3533, 3535, 3535, 3535, 3536, 3537, 3536, 3536, 3537, 3538, 3537, 3537, 3538, 3540, 3540, 3540, 3541, 3543, 3542, 3542, 3543, 3544, 3543, 3544, 3544, 3546, 3545, 3546, 3546, 3548, 3548, 3548, 3549, 3550, 3549, 3549, 3550, 3551, 3550, 3551, 3551, 3553, 3552, 3553, 3553, 3555, 3554, 3555, 3555, 3557, 3556, 3557, 3557, 3559, 3559, 3559, 3560, 3561, 3560, 3560, 3561, 3562, 3561, 3562, 3562, 3564, 3563, 3564, 3564, 3566, 3566, 3566, 3567, 3568, 3567, 3567, 3568, 3569, 3568, 3569, 3569, 3571, 3570, 3571, 3571, 3573, 3572, 3573, 3573, 3575, 3574, 3575, 3575, 3577, 3577, 3577, 3578, 3579, 3578, 3578, 3579, 3580, 3579, 3580, 3580, 3582, 3581, 3582, 3582, 3584, 3584, 3584, 3585, 3586, 3585, 3585, 3586, 3587, 3586, 3587, 3587, 3589, 3588, 3589, 3589, 3591, 3590, 3591, 3591, 3593, 3593, 3593, 3594, 3595, 3594, 3594, 3595, 3596, 3595, 3596, 3596, 3598, 3597, 3598, 3598, 3600, 3600, 3600, 3601, 3602, 3601, 3601, 3602, 3603, 3602, 3603, 3603, 3605, 3604, 3605, 3605, 3607, 3606, 3607, 3608, 3609, 3608, 3608, 3609, 3610, 3609, 3610, 3610, 3612, 3612, 3612, 3613, 3614, 3613, 3613, 3614, 3615, 3614, 3615, 3615, 3617, 3616, 3617, 3617, 3619, 3619, 3619, 3620, 3621, 3620, 3620, 3621, 3622, 3622, 3622, 3623, 3625, 3624, 3624, 3625, 3626, 3625, 3625, 3625, 3627, 3627, 3627, 3628, 3630, 3629, 3629, 3630, 3631, 3630, 3630, 3631, 3633, 3632, 3633, 3633, 3635, 3634, 3635, 3636, 3637, 3636, 3636, 3637, 3638, 3637, 3637, 3638, 3640, 3640, 3640, 3641, 3642, 3641, 3641, 3642, 3643, 3642, 3643, 3643, 3645, 3644, 3645, 3645, 3647, 3646, 3647, 3648, 3649, 3648, 3648, 3649, 3650, 3649, 3649, 3650, 3652, 3652, 3652, 3653, 3654, 3653, 3653, 3654, 3655, 3654, 3655, 3655, 3657, 3656, 3657, 3657, 3659, 3658, 3659, 3659, 3661, 3660, 3660, 3661, 3662, 3661, 3661, 3662, 3664, 3663, 3664, 3665, 3666, 3665, 3665, 3666, 3667, 3666, 3667, 3667, 3669, 3668, 3669, 3669, 3671, 3670, 3671, 3671, 3673, 3672, 3672, 3673, 3674, 3673, 3673, 3674, 3676, 3675, 3676, 3677, 3678, 3677, 3677, 3678, 3679, 3678, 3678, 3679, 3681, 3680, 3681, 3682, 3683, 3682, 3682, 3683, 3684, 3683, 3683, 3684, 3686, 3685, 3686, 3686, 3688, 3687, 3688, 3688, 3690, 3689, 3689, 3690, 3691, 3690, 3690, 3691, 3693, 3692, 3693, 3694, 3695, 3694, 3694, 3695, 3696, 3695, 3695, 3696, 3698, 3697, 3698, 3699, 3700, 3699, 3699, 3700, 3701, 3700, 3700, 3701, 3703, 3702, 3703, 3703, 3705, 3704, 3705, 3705, 3707, 3706, 3706, 3707, 3708, 3707, 3707, 3708, 3710, 3709, 3710, 3710, 3712, 3711, 3711, 3712, 3713, 3712, 3712, 3713, 3715, 3714, 3715, 3715, 3717, 3716, 3716, 3717, 3718, 3717, 3717, 3718, 3720, 3719, 3720, 3720, 3722, 3721, 3722, 3722, 3724, 3723, 3723, 3724, 3725, 3724, 3724, 3724, 3726, 3726, 3726, 3727, 3729, 3728, 3728, 3729, 3730, 3729, 3730, 3730, 3732, 3731, 3731, 3731, 3733, 3733, 3733, 3734, 3736, 3735, 3735, 3736, 3737, 3736, 3736, 3736, 3738, 3737, 3737, 3738, 3740, 3739, 3740, 3740, 3742, 3741, 3742, 3742, 3744, 3743, 3743, 3744, 3745, 3744, 3744, 3745, 3747, 3746, 3747, 3747, 3749, 3748, 3749, 3749, 3751, 3750, 3750, 3751, 3752, 3751, 3751, 3752, 3754, 3753, 3754, 3754, 3756, 3755, 3756, 3756, 3758, 3757, 3757, 3758, 3759, 3758, 3758, 3759, 3761, 3760, 3761, 3761, 3763, 3762, 3763, 3763, 3765, 3764, 3764, 3765, 3766, 3765, 3765, 3766, 3768, 3767, 3768, 3768, 3770, 3769, 3770, 3770, 3772, 3771, 3771, 3772, 3773, 3772, 3772, 3773, 3775, 3774, 3775, 3775, 3777, 3776, 3777, 3777, 3779, 3778, 3778, 3779, 3780, 3779, 3779, 3780, 3782, 3781, 3782, 3782, 3784, 3783, 3783, 3784, 3786, 3785, 3786, 3786, 3788, 3787, 3787, 3788, 3789, 3788, 3788, 3789, 3791, 3790, 3791, 3791, 3793, 3792, 3792, 3793, 3795, 3794, 3795, 3795, 3797, 3796, 3796, 3797, 3798, 3797, 3797, 3798, 3800, 3799, 3800, 3800, 3802, 3801, 3801, 3802, 3804, 3803, 3804, 3804, 3806, 3805, 3805, 3806, 3807, 3806, 3806, 3807, 3809, 3808, 3809, 3809, 3811, 3810, 3810, 3811, 3813, 3812, 3813, 3813, 3815, 3814, 3814, 3815, 3816, 3815, 3815, 3816, 3818, 3817, 3818, 3818, 3820, 3819, 3820, 3820, 3822, 3821, 3821, 3822, 3824, 3823, 3824, 3824, 3826, 3825, 3825, 3826, 3827, 3826, 3826, 3827, 3829, 3828, 3829, 3829, 3831, 3830, 3830, 3831, 3833, 3832, 3833, 3833, 3835, 3834, 3834, 3835, 3836, 3835, 3835, 3836, 3838, 3837, 3838, 3838, 3840, 3839, 3839, 3840, 3842, 3841, 3842, 3842, 3844, 3843, 3843, 3844, 3845, 3844, 3844, 3845, 3847, 3846, 3847, 3847, 3849, 3848, 3848, 3849, 3850, 3849, 3849, 3850, 3852, 3851, 3852, 3852, 3854, 3853, 3853, 3854, 3856, 3855, 3856, 3856, 3858, 3857, 3857, 3858, 3859, 3858, 3858, 3859, 3861, 3860, 3861, 3861, 3863, 3862, 3862, 3863, 3865, 3864, 3865, 3865, 3867, 3866, 3866, 3867, 3868, 3867, 3867, 3868, 3870, 3869, 3869, 3870, 3872, 3871, 3872, 3872, 3874, 3873, 3873, 3874, 3875, 3874, 3874, 3875, 3877, 3876, 3877, 3877, 3879, 3878, 3878, 3879, 3881, 3880, 3881, 3881, 3883, 3882, 3882, 3882, 3884, 3883, 3883, 3884, 3886, 3885, 3885, 3886, 3887, 3886, 3886, 3887, 3889, 3888, 3888, 3889, 3891, 3890, 3891, 3891, 3893, 3892, 3892, 3892, 3894, 3893, 3893, 3894, 3896, 3895, 3895, 3896, 3898, 3897, 3898, 3898, 3900, 3899, 3899, 3899, 3901, 3900, 3900, 3901, 3903, 3902, 3902, 3903, 3904, 3903, 3903, 3904, 3906, 3905, 3905, 3906, 3908, 3907, 3908, 3908, 3910, 3909, 3909, 3909, 3911, 3910, 3910, 3911, 3913, 3912, 3912, 3913, 3915, 3914, 3915, 3915, 3917, 3916, 3916, 3916, 3918, 3917, 3917, 3918, 3920, 3919, 3919, 3920, 3921, 3920, 3920, 3921, 3923, 3922, 3922, 3923, 3925, 3924, 3925, 3925, 3927, 3926, 3926, 3926, 3928, 3927, 3927, 3928, 3930, 3929, 3929, 3930, 3932, 3931, 3932, 3932, 3934, 3933, 3933, 3933, 3935, 3934, 3934, 3935, 3937, 3936, 3936, 3936, 3938, 3937, 3937, 3938, 3940, 3939, 3939, 3940, 3942, 3941, 3942, 3942, 3944, 3943, 3943, 3943, 3945, 3944, 3944, 3945, 3947, 3946, 3946, 3947, 3949, 3948, 3949, 3949, 3951, 3950, 3950, 3950, 3952, 3951, 3951, 3952, 3954, 3953, 3953, 3953, 3955, 3954, 3954, 3955, 3957, 3956, 3957, 3957, 3959, 3958, 3958, 3958, 3960, 3959, 3959, 3960, 3962, 3961, 3961, 3961, 3963, 3962, 3962, 3963, 3965, 3964, 3964, 3965, 3967, 3966, 3967, 3967, 3969, 3968, 3968, 3968, 3970, 3969, 3969, 3970, 3972, 3971, 3971, 3972, 3974, 3973, 3974, 3974, 3976, 3975, 3975, 3975, 3977, 3976, 3976, 3977, 3979, 3978, 3978, 3978, 3980, 3979, 3979, 3980, 3982, 3981, 3981, 3982, 3984, 3983, 3983, 3984, 3986, 3985, 3986, 3986, 3988, 3987, 3987, 3987, 3989, 3988, 3988, 3989, 3991, 3990, 3990, 3990, 3992, 3991, 3991, 3992, 3994, 3993, 3993, 3994, 3996, 3995, 3995, 3996, 3998, 3997, 3997, 3997, 3999, 3998, 3998, 3999, 4001, 4000, 4000, 4001, 4003, 4002, 4002, 4003, 4005, 4004, 4004, 4004, 4006, 4005, 4005, 4006, 4008, 4007, 4007, 4007, 4009, 4008, 4008, 4009, 4011, 4010, 4010, 4011, 4013, 4012, 4012, 4013, 4015, 4014, 4014, 4014, 4016, 4015, 4015, 4016, 4018, 4017, 4017, 4017, 4019, 4018, 4018, 4019, 4021, 4020, 4020, 4021, 4023, 4022, 4022, 4023, 4025, 4024, 4024, 4025, 4027, 4026, 4026, 4026, 4028, 4027, 4027, 4028, 4030, 4029, 4029, 4029, 4031, 4030, 4030, 4031, 4033, 4032, 4032, 4033, 4035, 4034, 4034, 4035, 4037, 4036, 4036, 4036, 4038, 4037, 4037, 4038, 4040, 4039, 4039, 4039, 4041, 4040, 4040, 4041, 4043, 4042, 4042, 4043, 4045, 4044, 4044, 4045, 4047, 4046, 4046, 4047, 4049, 4048, 4048, 4048, 4050, 4049, 4049, 4050, 4052, 4051, 4051, 4051, 4053, 4052, 4052, 4053, 4055, 4054, 4054, 4055, 4057, 4056, 4056, 4057, 4059, 4058, 4058, 4058, 4060, 4059, 4059, 4060, 4062, 4061, 4061, 4061, 4062, 4062, 4062, 4063, 4064, 4064, 4064, 4065, 4066, 4066, 4066, 4067, 4068, 4068, 4068, 4069, 4070, 4070, 4070, 4070, 4071, 4071, 4071, 4072, 4073, 4073, 4073, 4073, 4074, 4074, 4074, 4075, 4076, 4076, 4076, 4077, 4078, 4078, 4078, 4079, 4080, 4080, 4080, 4080, 4081, 4081, 4081, 4082, 4083, 4083, 4083, 4083, 4084, 4084, 4084, 4085, 4086, 4086, 4086, 4087, 4088, 4088, 4088, 4089, 4090, 4090, 4091, 4092, 4093, 4093, 4094, 4095] + # 14-bit + gamma_lut_14: [0, 11, 22, 32, 43, 53, 64, 74, 83, 93, 102, 110, 119, 127, 134, 141, 148, 154, 160, 165, 170, 174, 178, 182, 186, 190, 193, 196, 199, 202, 205, 209, 212, 215, 219, 223, 227, 231, 235, 239, 244, 248, 252, 257, 262, 266, 271, 275, 280, 284, 288, 293, 297, 301, 305, 309, 313, 317, 321, 325, 329, 332, 336, 340, 344, 348, 352, 356, 360, 364, 368, 372, 376, 380, 384, 388, 392, 396, 400, 404, 408, 412, 416, 420, 424, 427, 431, 435, 439, 443, 447, 451, 455, 459, 464, 468, 472, 476, 480, 484, 489, 493, 497, 501, 506, 510, 514, 519, 523, 527, 531, 536, 540, 544, 548, 552, 556, 560, 564, 568, 572, 576, 580, 584, 588, 592, 596, 600, 604, 608, 612, 616, 620, 623, 627, 631, 636, 639, 643, 647, 652, 656, 660, 664, 668, 672, 676, 680, 684, 688, 692, 696, 700, 704, 708, 712, 716, 720, 724, 728, 732, 736, 739, 743, 747, 751, 755, 759, 763, 767, 771, 775, 779, 783, 787, 792, 796, 800, 804, 808, 813, 817, 821, 825, 830, 834, 838, 842, 847, 851, 855, 860, 864, 868, 872, 876, 880, 884, 887, 891, 896, 899, 903, 907, 912, 915, 919, 924, 928, 932, 936, 940, 944, 948, 953, 957, 961, 966, 970, 974, 979, 983, 987, 991, 996, 1000, 1004, 1008, 1012, 1016, 1020, 1024, 1028, 1032, 1036, 1040, 1044, 1048, 1052, 1056, 1060, 1064, 1067, 1071, 1075, 1079, 1083, 1087, 1091, 1095, 1099, 1103, 1107, 1111, 1115, 1120, 1124, 1128, 1131, 1135, 1140, 1143, 1147, 1151, 1156, 1159, 1163, 1167, 1172, 1175, 1179, 1184, 1188, 1191, 1195, 1199, 1203, 1207, 1211, 1215, 1219, 1223, 1227, 1231, 1235, 1239, 1243, 1247, 1252, 1256, 1260, 1264, 1268, 1272, 1277, 1281, 1285, 1289, 1294, 1298, 1303, 1307, 1311, 1315, 1320, 1324, 1327, 1332, 1336, 1339, 1343, 1347, 1352, 1355, 1359, 1363, 1368, 1371, 1375, 1379, 1384, 1387, 1391, 1395, 1400, 1403, 1407, 1411, 1416, 1420, 1423, 1428, 1432, 1436, 1440, 1444, 1448, 1451, 1455, 1458, 1462, 1465, 1469, 1473, 1477, 1480, 1484, 1488, 1492, 1495, 1499, 1503, 1508, 1511, 1515, 1520, 1524, 1528, 1532, 1537, 1541, 1545, 1549, 1554, 1559, 1563, 1567, 1571, 1576, 1579, 1583, 1587, 1591, 1594, 1598, 1602, 1606, 1609, 1613, 1616, 1621, 1624, 1628, 1632, 1636, 1639, 1643, 1647, 1651, 1655, 1658, 1663, 1667, 1671, 1675, 1679, 1683, 1687, 1691, 1695, 1700, 1703, 1707, 1711, 1715, 1718, 1722, 1726, 1730, 1733, 1737, 1741, 1745, 1748, 1752, 1756, 1760, 1763, 1766, 1770, 1774, 1778, 1781, 1785, 1789, 1792, 1796, 1800, 1804, 1808, 1811, 1815, 1820, 1823, 1827, 1830, 1834, 1838, 1841, 1845, 1849, 1853, 1856, 1860, 1864, 1868, 1871, 1875, 1880, 1883, 1886, 1890, 1894, 1898, 1901, 1905, 1909, 1912, 1916, 1920, 1924, 1928, 1931, 1935, 1940, 1943, 1946, 1950, 1954, 1958, 1961, 1965, 1969, 1972, 1976, 1980, 1984, 1988, 1991, 1995, 2000, 2003, 2006, 2010, 2014, 2017, 2021, 2025, 2029, 2032, 2036, 2040, 2044, 2048, 2051, 2055, 2060, 2063, 2067, 2070, 2074, 2078, 2081, 2085, 2089, 2093, 2096, 2100, 2105, 2108, 2112, 2116, 2120, 2123, 2126, 2129, 2133, 2136, 2139, 2143, 2147, 2150, 2153, 2157, 2161, 2164, 2168, 2171, 2176, 2179, 2182, 2186, 2190, 2193, 2197, 2201, 2205, 2208, 2212, 2216, 2220, 2224, 2227, 2231, 2236, 2239, 2242, 2245, 2249, 2252, 2255, 2259, 2263, 2266, 2269, 2273, 2277, 2280, 2284, 2287, 2292, 2295, 2298, 2302, 2306, 2309, 2313, 2317, 2321, 2324, 2328, 2332, 2336, 2340, 2343, 2347, 2352, 2355, 2358, 2362, 2365, 2368, 2372, 2375, 2379, 2382, 2386, 2389, 2393, 2396, 2400, 2404, 2408, 2410, 2414, 2417, 2421, 2424, 2427, 2431, 2435, 2438, 2441, 2445, 2449, 2452, 2456, 2460, 2464, 2466, 2470, 2473, 2477, 2480, 2483, 2486, 2490, 2493, 2497, 2501, 2505, 2508, 2511, 2515, 2520, 2523, 2526, 2530, 2534, 2537, 2541, 2545, 2549, 2552, 2556, 2560, 2564, 2568, 2571, 2575, 2580, 2583, 2586, 2589, 2593, 2596, 2600, 2603, 2607, 2610, 2613, 2617, 2621, 2624, 2628, 2631, 2636, 2638, 2641, 2645, 2649, 2652, 2655, 2658, 2662, 2665, 2669, 2673, 2677, 2680, 2683, 2687, 2691, 2694, 2698, 2701, 2705, 2708, 2712, 2715, 2719, 2722, 2726, 2729, 2733, 2737, 2740, 2744, 2747, 2750, 2753, 2756, 2760, 2762, 2765, 2768, 2772, 2775, 2778, 2781, 2785, 2788, 2792, 2795, 2799, 2802, 2806, 2810, 2814, 2817, 2820, 2824, 2829, 2832, 2836, 2840, 2844, 2847, 2851, 2855, 2859, 2862, 2865, 2869, 2872, 2875, 2878, 2881, 2885, 2888, 2891, 2894, 2898, 2901, 2904, 2908, 2911, 2914, 2917, 2920, 2924, 2927, 2930, 2934, 2938, 2941, 2944, 2948, 2952, 2956, 2959, 2963, 2967, 2970, 2974, 2977, 2981, 2984, 2987, 2991, 2995, 2998, 3001, 3005, 3009, 3012, 3016, 3019, 3023, 3026, 3029, 3032, 3036, 3038, 3041, 3045, 3048, 3051, 3054, 3058, 3062, 3064, 3068, 3071, 3075, 3078, 3081, 3085, 3089, 3091, 3095, 3098, 3102, 3105, 3109, 3113, 3117, 3120, 3123, 3127, 3131, 3134, 3137, 3140, 3144, 3147, 3150, 3153, 3157, 3160, 3163, 3166, 3170, 3173, 3176, 3179, 3183, 3186, 3189, 3192, 3196, 3198, 3201, 3205, 3208, 3211, 3214, 3218, 3222, 3225, 3228, 3231, 3235, 3238, 3241, 3244, 3247, 3250, 3253, 3256, 3260, 3263, 3266, 3269, 3273, 3276, 3279, 3283, 3287, 3290, 3293, 3297, 3301, 3303, 3306, 3310, 3314, 3317, 3321, 3324, 3329, 3332, 3335, 3339, 3343, 3346, 3349, 3352, 3356, 3359, 3361, 3365, 3369, 3371, 3374, 3378, 3382, 3385, 3388, 3391, 3395, 3398, 3401, 3404, 3408, 3410, 3413, 3416, 3420, 3423, 3426, 3429, 3434, 3436, 3440, 3443, 3447, 3450, 3453, 3456, 3460, 3462, 3465, 3468, 3472, 3475, 3478, 3481, 3486, 3488, 3492, 3495, 3499, 3502, 3505, 3508, 3512, 3514, 3517, 3521, 3525, 3527, 3530, 3534, 3538, 3541, 3544, 3547, 3551, 3554, 3556, 3559, 3562, 3564, 3567, 3570, 3574, 3576, 3579, 3582, 3586, 3589, 3592, 3595, 3599, 3602, 3605, 3608, 3612, 3615, 3618, 3622, 3626, 3629, 3632, 3636, 3641, 3644, 3647, 3651, 3655, 3658, 3660, 3664, 3667, 3669, 3672, 3675, 3679, 3681, 3684, 3687, 3691, 3693, 3696, 3699, 3703, 3706, 3708, 3711, 3715, 3717, 3720, 3724, 3728, 3730, 3733, 3737, 3741, 3744, 3747, 3751, 3755, 3758, 3761, 3764, 3768, 3770, 3773, 3777, 3781, 3783, 3786, 3790, 3794, 3797, 3800, 3803, 3807, 3809, 3812, 3815, 3819, 3821, 3823, 3826, 3830, 3832, 3835, 3838, 3842, 3845, 3848, 3851, 3855, 3858, 3860, 3864, 3867, 3870, 3873, 3876, 3880, 3883, 3886, 3889, 3894, 3896, 3900, 3903, 3907, 3909, 3912, 3915, 3919, 3921, 3923, 3926, 3930, 3932, 3935, 3938, 3942, 3945, 3948, 3951, 3955, 3958, 3960, 3963, 3967, 3970, 3972, 3976, 3980, 3982, 3985, 3989, 3993, 3996, 3999, 4003, 4007, 4010, 4012, 4015, 4019, 4021, 4023, 4027, 4031, 4033, 4035, 4039, 4043, 4045, 4048, 4051, 4055, 4057, 4060, 4063, 4066, 4068, 4071, 4074, 4078, 4080, 4083, 4086, 4090, 4093, 4096, 4099, 4103, 4105, 4108, 4111, 4114, 4116, 4119, 4122, 4126, 4128, 4131, 4134, 4138, 4141, 4144, 4147, 4151, 4153, 4156, 4159, 4162, 4164, 4167, 4170, 4174, 4176, 4179, 4182, 4186, 4189, 4192, 4195, 4199, 4201, 4204, 4207, 4210, 4212, 4215, 4218, 4222, 4224, 4227, 4230, 4234, 4237, 4240, 4243, 4247, 4249, 4252, 4255, 4258, 4260, 4263, 4266, 4270, 4272, 4275, 4278, 4282, 4285, 4288, 4291, 4295, 4297, 4300, 4303, 4306, 4308, 4311, 4314, 4318, 4320, 4323, 4326, 4330, 4333, 4336, 4339, 4343, 4345, 4348, 4351, 4354, 4356, 4359, 4362, 4366, 4368, 4371, 4374, 4378, 4381, 4384, 4387, 4391, 4393, 4396, 4399, 4403, 4405, 4407, 4410, 4414, 4416, 4419, 4423, 4427, 4429, 4432, 4435, 4439, 4441, 4443, 4446, 4449, 4451, 4453, 4456, 4460, 4462, 4464, 4467, 4471, 4473, 4476, 4479, 4483, 4485, 4487, 4490, 4494, 4496, 4498, 4501, 4505, 4507, 4510, 4514, 4518, 4520, 4523, 4527, 4531, 4533, 4536, 4539, 4543, 4544, 4547, 4550, 4554, 4556, 4559, 4563, 4567, 4569, 4572, 4575, 4579, 4581, 4583, 4586, 4590, 4591, 4594, 4597, 4600, 4602, 4604, 4608, 4611, 4614, 4616, 4619, 4623, 4625, 4627, 4630, 4633, 4634, 4637, 4640, 4643, 4645, 4648, 4651, 4655, 4657, 4660, 4663, 4667, 4669, 4671, 4674, 4678, 4680, 4682, 4686, 4690, 4692, 4695, 4698, 4702, 4705, 4708, 4711, 4715, 4717, 4719, 4722, 4726, 4727, 4729, 4733, 4736, 4738, 4740, 4744, 4747, 4749, 4752, 4755, 4759, 4761, 4763, 4766, 4769, 4771, 4773, 4776, 4780, 4781, 4784, 4787, 4791, 4793, 4796, 4799, 4803, 4805, 4807, 4810, 4813, 4815, 4817, 4820, 4824, 4826, 4828, 4831, 4835, 4837, 4840, 4843, 4847, 4849, 4851, 4854, 4857, 4859, 4861, 4864, 4868, 4869, 4872, 4875, 4879, 4881, 4884, 4887, 4891, 4893, 4895, 4898, 4901, 4903, 4905, 4908, 4912, 4913, 4916, 4919, 4923, 4925, 4928, 4931, 4935, 4937, 4939, 4942, 4945, 4947, 4949, 4952, 4956, 4957, 4960, 4963, 4967, 4969, 4972, 4975, 4979, 4981, 4983, 4986, 4989, 4990, 4993, 4996, 5000, 5001, 5004, 5007, 5011, 5013, 5016, 5019, 5023, 5025, 5027, 5030, 5033, 5035, 5037, 5040, 5044, 5046, 5048, 5051, 5055, 5057, 5060, 5063, 5067, 5068, 5070, 5073, 5076, 5077, 5079, 5082, 5086, 5087, 5089, 5092, 5096, 5098, 5100, 5103, 5107, 5108, 5110, 5113, 5117, 5118, 5120, 5123, 5127, 5129, 5131, 5135, 5139, 5141, 5144, 5147, 5151, 5153, 5155, 5158, 5161, 5163, 5165, 5168, 5172, 5174, 5176, 5180, 5183, 5185, 5188, 5191, 5195, 5196, 5198, 5201, 5204, 5205, 5207, 5210, 5213, 5215, 5217, 5220, 5224, 5226, 5228, 5231, 5235, 5237, 5239, 5241, 5245, 5246, 5249, 5252, 5256, 5257, 5260, 5263, 5267, 5269, 5272, 5275, 5279, 5280, 5282, 5285, 5288, 5289, 5291, 5294, 5297, 5299, 5301, 5304, 5308, 5309, 5312, 5315, 5319, 5321, 5323, 5326, 5329, 5331, 5333, 5336, 5340, 5342, 5344, 5347, 5351, 5353, 5356, 5359, 5363, 5364, 5366, 5368, 5371, 5372, 5374, 5376, 5379, 5380, 5382, 5385, 5389, 5390, 5392, 5395, 5399, 5400, 5402, 5405, 5409, 5410, 5412, 5416, 5419, 5421, 5424, 5427, 5431, 5433, 5436, 5439, 5443, 5444, 5446, 5448, 5451, 5452, 5454, 5456, 5459, 5461, 5462, 5465, 5469, 5470, 5472, 5475, 5479, 5480, 5482, 5485, 5489, 5490, 5492, 5495, 5499, 5501, 5504, 5507, 5511, 5513, 5516, 5519, 5523, 5524, 5526, 5528, 5531, 5532, 5534, 5536, 5539, 5540, 5542, 5545, 5549, 5550, 5552, 5555, 5559, 5560, 5562, 5565, 5568, 5570, 5572, 5575, 5579, 5581, 5583, 5587, 5591, 5593, 5596, 5599, 5603, 5604, 5606, 5608, 5611, 5612, 5614, 5617, 5620, 5621, 5623, 5626, 5629, 5630, 5633, 5635, 5639, 5640, 5642, 5644, 5647, 5648, 5650, 5653, 5657, 5658, 5660, 5663, 5667, 5669, 5672, 5675, 5679, 5680, 5682, 5685, 5688, 5689, 5691, 5694, 5698, 5699, 5701, 5704, 5708, 5710, 5712, 5715, 5719, 5720, 5721, 5724, 5727, 5728, 5729, 5732, 5735, 5736, 5738, 5741, 5745, 5746, 5748, 5751, 5755, 5756, 5758, 5760, 5763, 5764, 5766, 5769, 5773, 5774, 5776, 5779, 5783, 5785, 5788, 5791, 5795, 5796, 5798, 5801, 5804, 5805, 5807, 5810, 5814, 5815, 5817, 5820, 5824, 5826, 5828, 5831, 5835, 5836, 5838, 5840, 5843, 5844, 5846, 5848, 5852, 5853, 5855, 5857, 5861, 5862, 5864, 5867, 5871, 5872, 5873, 5875, 5878, 5879, 5881, 5883, 5887, 5888, 5890, 5893, 5896, 5898, 5900, 5903, 5907, 5908, 5910, 5912, 5916, 5917, 5919, 5922, 5925, 5927, 5929, 5932, 5936, 5938, 5940, 5943, 5947, 5948, 5950, 5952, 5955, 5956, 5958, 5960, 5964, 5965, 5966, 5969, 5973, 5974, 5976, 5979, 5983, 5984, 5985, 5988, 5991, 5991, 5993, 5996, 5999, 6000, 6002, 6005, 6009, 6010, 6012, 6015, 6019, 6020, 6021, 6024, 6027, 6027, 6029, 6032, 6035, 6036, 6038, 6041, 6045, 6046, 6048, 6051, 6055, 6056, 6057, 6060, 6063, 6063, 6065, 6068, 6071, 6072, 6074, 6077, 6081, 6082, 6084, 6087, 6091, 6092, 6093, 6096, 6099, 6099, 6101, 6104, 6107, 6108, 6110, 6113, 6117, 6118, 6120, 6123, 6127, 6128, 6129, 6132, 6135, 6135, 6137, 6140, 6143, 6144, 6146, 6149, 6153, 6154, 6156, 6159, 6163, 6164, 6165, 6168, 6171, 6171, 6173, 6176, 6179, 6180, 6182, 6185, 6189, 6190, 6192, 6195, 6199, 6200, 6201, 6203, 6207, 6207, 6209, 6211, 6215, 6216, 6218, 6221, 6224, 6226, 6228, 6231, 6235, 6236, 6237, 6240, 6243, 6244, 6245, 6248, 6252, 6253, 6254, 6257, 6261, 6262, 6264, 6267, 6271, 6271, 6273, 6275, 6278, 6278, 6279, 6282, 6285, 6286, 6287, 6290, 6293, 6294, 6296, 6299, 6303, 6304, 6305, 6307, 6310, 6311, 6313, 6315, 6319, 6320, 6322, 6325, 6329, 6330, 6332, 6335, 6339, 6339, 6341, 6343, 6346, 6346, 6347, 6350, 6353, 6354, 6355, 6358, 6361, 6363, 6364, 6367, 6371, 6372, 6373, 6375, 6378, 6379, 6381, 6383, 6387, 6388, 6390, 6393, 6397, 6398, 6400, 6403, 6407, 6407, 6409, 6411, 6414, 6414, 6415, 6418, 6421, 6422, 6423, 6426, 6429, 6430, 6432, 6435, 6439, 6440, 6441, 6443, 6446, 6447, 6449, 6451, 6455, 6456, 6458, 6461, 6465, 6466, 6468, 6471, 6475, 6475, 6477, 6479, 6482, 6482, 6483, 6486, 6489, 6490, 6491, 6494, 6497, 6498, 6500, 6503, 6507, 6507, 6509, 6511, 6514, 6515, 6517, 6519, 6523, 6524, 6526, 6529, 6533, 6534, 6536, 6539, 6543, 6543, 6545, 6547, 6550, 6550, 6551, 6554, 6557, 6558, 6559, 6562, 6565, 6566, 6568, 6571, 6575, 6575, 6577, 6579, 6582, 6583, 6584, 6587, 6591, 6592, 6594, 6597, 6600, 6602, 6604, 6607, 6611, 6611, 6613, 6615, 6618, 6618, 6620, 6622, 6625, 6626, 6627, 6630, 6634, 6635, 6637, 6639, 6643, 6643, 6644, 6646, 6649, 6650, 6651, 6653, 6657, 6657, 6659, 6662, 6665, 6666, 6668, 6671, 6675, 6675, 6676, 6679, 6682, 6682, 6683, 6686, 6689, 6690, 6691, 6694, 6698, 6699, 6700, 6703, 6707, 6707, 6708, 6710, 6713, 6713, 6715, 6717, 6720, 6721, 6723, 6725, 6729, 6730, 6732, 6735, 6739, 6739, 6741, 6743, 6746, 6747, 6748, 6751, 6755, 6756, 6758, 6761, 6764, 6766, 6768, 6771, 6775, 6775, 6777, 6779, 6782, 6782, 6783, 6786, 6789, 6790, 6791, 6794, 6798, 6799, 6800, 6803, 6807, 6807, 6808, 6810, 6813, 6814, 6815, 6817, 6821, 6821, 6823, 6826, 6829, 6830, 6832, 6835, 6839, 6839, 6840, 6842, 6845, 6846, 6847, 6849, 6853, 6853, 6855, 6858, 6861, 6862, 6864, 6867, 6871, 6871, 6872, 6875, 6878, 6878, 6879, 6882, 6885, 6886, 6887, 6890, 6894, 6895, 6897, 6899, 6903, 6903, 6904, 6906, 6908, 6908, 6909, 6912, 6915, 6915, 6916, 6919, 6922, 6923, 6925, 6927, 6931, 6931, 6932, 6934, 6937, 6937, 6938, 6941, 6944, 6945, 6946, 6949, 6953, 6954, 6956, 6959, 6963, 6963, 6964, 6967, 6970, 6970, 6971, 6974, 6977, 6978, 6979, 6982, 6986, 6987, 6989, 6991, 6995, 6995, 6996, 6998, 7000, 7000, 7001, 7004, 7007, 7007, 7008, 7011, 7014, 7015, 7017, 7019, 7023, 7023, 7024, 7026, 7029, 7029, 7030, 7033, 7036, 7037, 7038, 7041, 7045, 7046, 7048, 7051, 7055, 7055, 7056, 7059, 7062, 7062, 7063, 7066, 7069, 7070, 7071, 7074, 7078, 7079, 7080, 7083, 7087, 7087, 7088, 7090, 7092, 7092, 7093, 7095, 7099, 7099, 7100, 7103, 7106, 7107, 7108, 7111, 7115, 7115, 7116, 7118, 7121, 7121, 7123, 7125, 7129, 7129, 7131, 7133, 7137, 7138, 7140, 7143, 7147, 7147, 7148, 7150, 7153, 7153, 7154, 7156, 7159, 7159, 7161, 7163, 7166, 7167, 7169, 7171, 7175, 7175, 7176, 7177, 7180, 7180, 7181, 7183, 7187, 7187, 7188, 7191, 7194, 7195, 7197, 7199, 7203, 7203, 7203, 7205, 7208, 7208, 7209, 7211, 7214, 7214, 7216, 7218, 7222, 7223, 7224, 7227, 7231, 7231, 7232, 7234, 7237, 7237, 7239, 7241, 7245, 7245, 7247, 7249, 7253, 7254, 7256, 7259, 7263, 7263, 7264, 7266, 7269, 7269, 7270, 7272, 7275, 7275, 7276, 7279, 7282, 7283, 7285, 7287, 7291, 7291, 7291, 7293, 7296, 7296, 7297, 7299, 7302, 7303, 7304, 7306, 7310, 7311, 7312, 7315, 7319, 7319, 7320, 7321, 7324, 7324, 7325, 7327, 7331, 7331, 7332, 7335, 7338, 7339, 7341, 7343, 7347, 7347, 7347, 7349, 7352, 7352, 7353, 7355, 7358, 7358, 7359, 7362, 7366, 7366, 7368, 7371, 7375, 7375, 7376, 7378, 7381, 7382, 7383, 7385, 7389, 7389, 7391, 7394, 7398, 7399, 7400, 7403, 7407, 7407, 7407, 7409, 7412, 7411, 7412, 7414, 7417, 7417, 7418, 7420, 7423, 7424, 7425, 7427, 7431, 7430, 7431, 7433, 7435, 7435, 7436, 7438, 7441, 7442, 7443, 7446, 7449, 7450, 7452, 7455, 7459, 7459, 7460, 7462, 7465, 7466, 7467, 7470, 7473, 7474, 7475, 7478, 7482, 7483, 7484, 7487, 7491, 7491, 7491, 7493, 7496, 7495, 7496, 7498, 7501, 7501, 7502, 7504, 7507, 7508, 7509, 7511, 7515, 7514, 7515, 7517, 7520, 7519, 7520, 7522, 7526, 7526, 7527, 7530, 7534, 7534, 7536, 7539, 7543, 7543, 7544, 7546, 7548, 7548, 7549, 7552, 7555, 7555, 7556, 7559, 7563, 7563, 7565, 7567, 7571, 7570, 7571, 7573, 7575, 7575, 7575, 7577, 7580, 7580, 7581, 7584, 7587, 7587, 7589, 7591, 7595, 7594, 7595, 7597, 7600, 7599, 7600, 7603, 7606, 7606, 7607, 7610, 7614, 7614, 7616, 7619, 7623, 7623, 7624, 7626, 7628, 7628, 7629, 7632, 7635, 7635, 7636, 7639, 7642, 7643, 7645, 7647, 7651, 7650, 7651, 7653, 7655, 7655, 7655, 7657, 7660, 7660, 7661, 7664, 7667, 7667, 7669, 7671, 7675, 7674, 7675, 7677, 7680, 7679, 7680, 7683, 7686, 7686, 7687, 7690, 7694, 7694, 7696, 7699, 7703, 7703, 7704, 7705, 7708, 7708, 7709, 7712, 7715, 7715, 7716, 7719, 7722, 7723, 7725, 7727, 7731, 7730, 7731, 7732, 7735, 7735, 7735, 7737, 7740, 7740, 7741, 7743, 7747, 7747, 7749, 7751, 7755, 7754, 7755, 7757, 7760, 7760, 7761, 7763, 7766, 7766, 7768, 7770, 7774, 7775, 7776, 7779, 7783, 7782, 7783, 7785, 7787, 7787, 7788, 7790, 7793, 7793, 7794, 7796, 7799, 7800, 7801, 7803, 7807, 7806, 7807, 7808, 7811, 7810, 7811, 7813, 7816, 7816, 7817, 7819, 7822, 7823, 7824, 7827, 7831, 7830, 7831, 7833, 7836, 7836, 7837, 7839, 7843, 7843, 7844, 7847, 7850, 7851, 7852, 7855, 7859, 7858, 7859, 7860, 7863, 7862, 7863, 7865, 7868, 7868, 7869, 7871, 7875, 7875, 7877, 7879, 7883, 7882, 7883, 7885, 7888, 7888, 7889, 7891, 7895, 7895, 7896, 7899, 7902, 7903, 7905, 7907, 7911, 7910, 7910, 7912, 7914, 7913, 7914, 7915, 7918, 7918, 7919, 7921, 7924, 7924, 7925, 7927, 7931, 7930, 7931, 7933, 7935, 7935, 7936, 7938, 7942, 7942, 7943, 7946, 7950, 7951, 7952, 7955, 7959, 7958, 7959, 7961, 7963, 7963, 7963, 7965, 7968, 7968, 7969, 7971, 7975, 7975, 7977, 7979, 7983, 7982, 7983, 7985, 7988, 7987, 7988, 7991, 7994, 7994, 7995, 7998, 8002, 8003, 8004, 8007, 8011, 8010, 8011, 8013, 8015, 8015, 8016, 8018, 8021, 8021, 8021, 8024, 8027, 8027, 8029, 8031, 8035, 8034, 8035, 8036, 8039, 8038, 8039, 8041, 8044, 8044, 8045, 8047, 8051, 8051, 8053, 8055, 8058, 8058, 8059, 8060, 8063, 8062, 8063, 8065, 8068, 8068, 8069, 8071, 8075, 8075, 8077, 8079, 8082, 8082, 8083, 8084, 8087, 8086, 8087, 8089, 8092, 8092, 8093, 8095, 8099, 8099, 8101, 8103, 8106, 8106, 8107, 8108, 8111, 8110, 8111, 8113, 8116, 8116, 8117, 8119, 8123, 8123, 8125, 8127, 8130, 8130, 8131, 8132, 8135, 8134, 8135, 8137, 8140, 8140, 8141, 8143, 8147, 8147, 8149, 8151, 8154, 8154, 8154, 8156, 8158, 8158, 8158, 8160, 8164, 8163, 8164, 8167, 8170, 8171, 8172, 8175, 8178, 8178, 8179, 8181, 8184, 8184, 8185, 8187, 8191, 8191, 8192, 8195, 8198, 8199, 8200, 8203, 8206, 8206, 8206, 8208, 8210, 8209, 8210, 8211, 8214, 8214, 8214, 8216, 8220, 8220, 8221, 8223, 8226, 8226, 8227, 8228, 8231, 8231, 8232, 8234, 8238, 8238, 8239, 8242, 8246, 8246, 8248, 8251, 8254, 8254, 8255, 8257, 8259, 8259, 8259, 8261, 8265, 8264, 8265, 8268, 8271, 8271, 8273, 8275, 8278, 8278, 8279, 8280, 8283, 8282, 8283, 8285, 8288, 8288, 8289, 8292, 8295, 8295, 8297, 8299, 8302, 8302, 8302, 8304, 8306, 8305, 8305, 8307, 8310, 8310, 8310, 8312, 8316, 8316, 8317, 8319, 8322, 8322, 8322, 8324, 8326, 8326, 8326, 8328, 8332, 8331, 8332, 8335, 8338, 8339, 8340, 8343, 8346, 8346, 8347, 8348, 8351, 8350, 8351, 8353, 8356, 8356, 8357, 8359, 8363, 8363, 8365, 8367, 8370, 8370, 8370, 8372, 8375, 8374, 8375, 8377, 8380, 8380, 8381, 8383, 8387, 8387, 8388, 8391, 8394, 8394, 8394, 8396, 8399, 8398, 8399, 8401, 8404, 8404, 8405, 8407, 8411, 8411, 8412, 8415, 8418, 8418, 8419, 8420, 8423, 8422, 8423, 8425, 8428, 8428, 8429, 8432, 8435, 8435, 8437, 8439, 8442, 8442, 8442, 8443, 8446, 8445, 8445, 8447, 8450, 8450, 8450, 8452, 8456, 8456, 8457, 8459, 8462, 8462, 8462, 8464, 8466, 8466, 8466, 8468, 8471, 8471, 8472, 8475, 8478, 8479, 8480, 8483, 8486, 8486, 8487, 8488, 8491, 8491, 8491, 8493, 8497, 8496, 8497, 8500, 8503, 8503, 8505, 8507, 8510, 8510, 8510, 8511, 8514, 8513, 8513, 8515, 8518, 8517, 8518, 8520, 8523, 8524, 8525, 8527, 8530, 8530, 8530, 8532, 8535, 8534, 8535, 8537, 8540, 8540, 8541, 8543, 8547, 8547, 8548, 8551, 8554, 8554, 8554, 8555, 8558, 8557, 8557, 8559, 8562, 8562, 8562, 8564, 8568, 8568, 8569, 8571, 8574, 8574, 8574, 8576, 8578, 8578, 8578, 8580, 8583, 8583, 8584, 8587, 8590, 8591, 8592, 8595, 8598, 8598, 8599, 8600, 8603, 8602, 8603, 8605, 8608, 8608, 8609, 8611, 8615, 8615, 8617, 8619, 8622, 8622, 8622, 8624, 8626, 8625, 8626, 8627, 8630, 8630, 8630, 8633, 8636, 8636, 8637, 8639, 8642, 8642, 8642, 8643, 8645, 8644, 8645, 8646, 8649, 8649, 8650, 8652, 8655, 8655, 8657, 8659, 8662, 8662, 8662, 8664, 8667, 8666, 8667, 8669, 8672, 8672, 8673, 8675, 8679, 8679, 8680, 8683, 8686, 8686, 8686, 8688, 8690, 8689, 8690, 8691, 8694, 8694, 8695, 8697, 8700, 8700, 8701, 8703, 8706, 8706, 8706, 8707, 8709, 8708, 8709, 8710, 8713, 8713, 8713, 8716, 8719, 8719, 8720, 8723, 8726, 8726, 8726, 8728, 8731, 8730, 8730, 8733, 8736, 8736, 8737, 8739, 8743, 8743, 8744, 8747, 8750, 8750, 8750, 8751, 8754, 8753, 8753, 8755, 8758, 8758, 8758, 8761, 8764, 8764, 8765, 8767, 8770, 8770, 8770, 8771, 8774, 8773, 8773, 8775, 8778, 8777, 8778, 8780, 8784, 8784, 8785, 8787, 8790, 8790, 8790, 8791, 8793, 8792, 8793, 8794, 8797, 8797, 8798, 8800, 8803, 8803, 8805, 8807, 8810, 8810, 8810, 8812, 8814, 8814, 8814, 8816, 8820, 8819, 8820, 8823, 8827, 8827, 8828, 8831, 8834, 8834, 8834, 8836, 8838, 8837, 8838, 8840, 8843, 8842, 8843, 8845, 8848, 8848, 8849, 8851, 8854, 8853, 8853, 8854, 8857, 8855, 8855, 8857, 8860, 8859, 8859, 8861, 8864, 8864, 8865, 8867, 8870, 8869, 8869, 8871, 8873, 8872, 8872, 8874, 8877, 8876, 8877, 8879, 8883, 8883, 8884, 8887, 8890, 8890, 8890, 8892, 8895, 8894, 8894, 8897, 8900, 8900, 8901, 8903, 8907, 8907, 8908, 8911, 8914, 8914, 8914, 8915, 8918, 8917, 8917, 8919, 8922, 8922, 8922, 8924, 8928, 8928, 8929, 8931, 8934, 8934, 8934, 8935, 8938, 8937, 8937, 8939, 8942, 8942, 8942, 8944, 8948, 8948, 8949, 8951, 8954, 8953, 8953, 8954, 8957, 8955, 8955, 8957, 8960, 8959, 8959, 8961, 8964, 8964, 8965, 8967, 8970, 8969, 8969, 8971, 8973, 8972, 8973, 8974, 8978, 8977, 8978, 8980, 8983, 8983, 8985, 8987, 8990, 8990, 8990, 8991, 8993, 8992, 8992, 8994, 8997, 8997, 8997, 9000, 9003, 9003, 9004, 9007, 9010, 9010, 9010, 9012, 9015, 9014, 9015, 9017, 9020, 9020, 9021, 9023, 9027, 9027, 9028, 9031, 9034, 9033, 9033, 9035, 9037, 9036, 9036, 9037, 9040, 9039, 9039, 9041, 9045, 9044, 9045, 9047, 9050, 9049, 9049, 9051, 9053, 9052, 9053, 9054, 9058, 9057, 9058, 9060, 9064, 9064, 9065, 9067, 9070, 9069, 9069, 9070, 9073, 9071, 9071, 9073, 9076, 9075, 9075, 9077, 9080, 9080, 9081, 9083, 9086, 9085, 9085, 9087, 9089, 9088, 9088, 9090, 9093, 9093, 9093, 9096, 9099, 9099, 9100, 9103, 9106, 9106, 9106, 9107, 9110, 9109, 9109, 9111, 9114, 9113, 9114, 9116, 9120, 9120, 9121, 9123, 9126, 9125, 9126, 9127, 9129, 9128, 9129, 9131, 9134, 9133, 9134, 9136, 9139, 9139, 9141, 9143, 9146, 9145, 9146, 9147, 9149, 9148, 9149, 9150, 9154, 9153, 9154, 9156, 9159, 9159, 9160, 9163, 9166, 9166, 9166, 9167, 9170, 9169, 9169, 9171, 9174, 9174, 9174, 9176, 9180, 9180, 9181, 9183, 9186, 9185, 9185, 9186, 9188, 9187, 9187, 9189, 9192, 9191, 9191, 9193, 9196, 9196, 9197, 9199, 9202, 9201, 9201, 9203, 9205, 9204, 9205, 9207, 9210, 9209, 9210, 9212, 9216, 9216, 9217, 9219, 9222, 9221, 9221, 9222, 9225, 9223, 9223, 9225, 9228, 9227, 9227, 9229, 9232, 9232, 9233, 9235, 9238, 9237, 9237, 9238, 9241, 9240, 9240, 9242, 9245, 9244, 9245, 9247, 9251, 9251, 9252, 9255, 9258, 9258, 9258, 9259, 9262, 9261, 9261, 9263, 9266, 9266, 9266, 9268, 9272, 9272, 9273, 9275, 9278, 9277, 9277, 9278, 9280, 9279, 9279, 9281, 9284, 9283, 9283, 9285, 9288, 9288, 9289, 9291, 9294, 9293, 9293, 9294, 9297, 9296, 9296, 9298, 9301, 9300, 9301, 9303, 9307, 9307, 9308, 9311, 9314, 9314, 9314, 9315, 9318, 9317, 9317, 9319, 9322, 9322, 9322, 9324, 9328, 9328, 9329, 9331, 9334, 9333, 9333, 9334, 9336, 9335, 9335, 9337, 9339, 9339, 9339, 9341, 9344, 9344, 9345, 9347, 9350, 9349, 9349, 9351, 9353, 9352, 9353, 9354, 9358, 9357, 9358, 9360, 9363, 9363, 9365, 9367, 9370, 9369, 9369, 9370, 9372, 9371, 9371, 9373, 9376, 9375, 9375, 9377, 9380, 9380, 9381, 9383, 9386, 9385, 9385, 9387, 9389, 9388, 9388, 9390, 9393, 9393, 9393, 9396, 9399, 9399, 9400, 9403, 9406, 9405, 9405, 9406, 9409, 9408, 9408, 9409, 9412, 9411, 9412, 9413, 9417, 9416, 9417, 9419, 9422, 9421, 9421, 9422, 9424, 9423, 9422, 9424, 9427, 9426, 9426, 9428, 9432, 9432, 9433, 9435, 9438, 9437, 9437, 9439, 9441, 9440, 9441, 9443, 9446, 9445, 9446, 9448, 9452, 9451, 9453, 9455, 9458, 9457, 9457, 9458, 9460, 9459, 9459, 9461, 9464, 9463, 9463, 9465, 9468, 9468, 9469, 9471, 9474, 9473, 9473, 9475, 9477, 9476, 9476, 9478, 9482, 9481, 9482, 9484, 9487, 9487, 9488, 9491, 9494, 9493, 9493, 9494, 9496, 9495, 9495, 9497, 9500, 9499, 9499, 9501, 9504, 9504, 9505, 9507, 9510, 9509, 9509, 9511, 9513, 9512, 9512, 9514, 9518, 9517, 9518, 9520, 9523, 9523, 9524, 9527, 9530, 9529, 9529, 9530, 9532, 9531, 9531, 9533, 9536, 9535, 9535, 9537, 9540, 9540, 9541, 9543, 9546, 9545, 9545, 9547, 9549, 9548, 9548, 9550, 9553, 9553, 9553, 9556, 9559, 9559, 9560, 9563, 9566, 9565, 9565, 9566, 9569, 9567, 9567, 9569, 9572, 9571, 9571, 9573, 9577, 9576, 9577, 9579, 9582, 9581, 9581, 9582, 9584, 9582, 9582, 9584, 9587, 9586, 9586, 9588, 9592, 9592, 9593, 9595, 9598, 9597, 9597, 9599, 9601, 9600, 9600, 9602, 9605, 9605, 9605, 9608, 9611, 9611, 9612, 9615, 9618, 9617, 9617, 9618, 9621, 9619, 9619, 9621, 9624, 9623, 9623, 9625, 9629, 9628, 9629, 9631, 9634, 9633, 9633, 9634, 9636, 9634, 9634, 9636, 9639, 9638, 9638, 9640, 9644, 9644, 9644, 9647, 9650, 9649, 9649, 9651, 9653, 9652, 9652, 9654, 9657, 9657, 9657, 9660, 9663, 9663, 9664, 9667, 9670, 9669, 9669, 9670, 9673, 9671, 9671, 9673, 9676, 9675, 9675, 9677, 9681, 9680, 9681, 9683, 9686, 9685, 9685, 9686, 9688, 9687, 9687, 9688, 9691, 9690, 9691, 9693, 9696, 9696, 9697, 9699, 9702, 9701, 9701, 9702, 9704, 9703, 9703, 9704, 9707, 9706, 9707, 9709, 9712, 9712, 9713, 9715, 9718, 9717, 9717, 9718, 9720, 9719, 9719, 9721, 9724, 9723, 9723, 9725, 9728, 9728, 9729, 9731, 9734, 9733, 9733, 9734, 9736, 9734, 9734, 9736, 9739, 9738, 9738, 9740, 9744, 9744, 9744, 9747, 9750, 9749, 9749, 9751, 9753, 9752, 9752, 9754, 9757, 9757, 9757, 9760, 9763, 9763, 9764, 9767, 9770, 9769, 9769, 9770, 9773, 9771, 9771, 9773, 9776, 9775, 9775, 9777, 9780, 9780, 9781, 9783, 9786, 9785, 9785, 9786, 9788, 9787, 9787, 9788, 9791, 9790, 9791, 9793, 9796, 9796, 9797, 9799, 9802, 9801, 9801, 9802, 9804, 9803, 9803, 9804, 9807, 9806, 9807, 9809, 9812, 9812, 9813, 9815, 9818, 9817, 9817, 9818, 9820, 9819, 9819, 9820, 9823, 9822, 9823, 9825, 9828, 9828, 9829, 9831, 9834, 9833, 9833, 9834, 9836, 9835, 9835, 9836, 9839, 9838, 9839, 9841, 9844, 9844, 9845, 9847, 9850, 9849, 9849, 9850, 9852, 9851, 9851, 9852, 9855, 9854, 9855, 9857, 9860, 9860, 9861, 9863, 9866, 9865, 9865, 9866, 9868, 9867, 9867, 9869, 9872, 9871, 9871, 9873, 9877, 9876, 9877, 9879, 9882, 9881, 9880, 9881, 9883, 9882, 9881, 9883, 9885, 9884, 9884, 9886, 9889, 9888, 9889, 9891, 9894, 9893, 9892, 9893, 9896, 9894, 9894, 9896, 9899, 9898, 9898, 9900, 9904, 9904, 9905, 9907, 9910, 9909, 9909, 9910, 9912, 9911, 9911, 9912, 9915, 9914, 9915, 9917, 9920, 9920, 9921, 9923, 9926, 9925, 9925, 9926, 9928, 9927, 9927, 9928, 9931, 9930, 9931, 9933, 9936, 9936, 9937, 9939, 9942, 9941, 9941, 9942, 9944, 9943, 9943, 9944, 9947, 9946, 9947, 9949, 9952, 9952, 9953, 9955, 9958, 9957, 9957, 9958, 9960, 9959, 9959, 9960, 9963, 9962, 9963, 9965, 9968, 9968, 9969, 9971, 9974, 9973, 9973, 9974, 9976, 9975, 9975, 9976, 9979, 9978, 9979, 9981, 9984, 9984, 9985, 9987, 9990, 9989, 9989, 9990, 9992, 9991, 9990, 9992, 9995, 9994, 9994, 9997, 10000, 10000, 10001, 10003, 10006, 10005, 10005, 10006, 10008, 10007, 10007, 10009, 10012, 10011, 10011, 10013, 10017, 10016, 10017, 10019, 10022, 10021, 10020, 10021, 10023, 10021, 10021, 10022, 10025, 10024, 10024, 10026, 10029, 10028, 10029, 10031, 10034, 10033, 10032, 10034, 10036, 10035, 10034, 10036, 10039, 10038, 10039, 10041, 10044, 10044, 10045, 10047, 10050, 10049, 10048, 10049, 10051, 10050, 10049, 10051, 10053, 10052, 10052, 10054, 10057, 10056, 10057, 10059, 10062, 10061, 10060, 10061, 10064, 10062, 10062, 10064, 10067, 10066, 10066, 10068, 10072, 10071, 10072, 10075, 10078, 10077, 10077, 10078, 10080, 10079, 10079, 10080, 10083, 10082, 10083, 10085, 10088, 10088, 10089, 10091, 10094, 10093, 10092, 10094, 10096, 10094, 10094, 10096, 10099, 10098, 10098, 10100, 10104, 10104, 10104, 10107, 10110, 10109, 10109, 10110, 10112, 10111, 10111, 10113, 10116, 10115, 10115, 10117, 10120, 10120, 10121, 10123, 10126, 10125, 10124, 10125, 10127, 10125, 10125, 10126, 10129, 10128, 10128, 10130, 10133, 10132, 10133, 10135, 10138, 10137, 10136, 10138, 10140, 10138, 10138, 10140, 10143, 10142, 10143, 10145, 10148, 10148, 10149, 10151, 10154, 10153, 10152, 10153, 10155, 10153, 10153, 10154, 10157, 10156, 10156, 10158, 10161, 10160, 10161, 10163, 10166, 10165, 10164, 10165, 10168, 10166, 10166, 10168, 10171, 10170, 10170, 10173, 10176, 10176, 10177, 10179, 10182, 10181, 10180, 10181, 10183, 10182, 10181, 10183, 10185, 10184, 10184, 10186, 10189, 10188, 10189, 10191, 10194, 10193, 10192, 10193, 10196, 10194, 10194, 10196, 10199, 10198, 10198, 10200, 10204, 10203, 10204, 10207, 10210, 10209, 10209, 10210, 10212, 10211, 10211, 10213, 10216, 10215, 10215, 10217, 10221, 10220, 10221, 10223, 10226, 10225, 10224, 10225, 10227, 10225, 10225, 10226, 10229, 10228, 10228, 10230, 10233, 10232, 10233, 10235, 10238, 10237, 10236, 10237, 10240, 10238, 10238, 10240, 10243, 10242, 10242, 10245, 10248, 10248, 10249, 10251, 10254, 10253, 10252, 10253, 10255, 10253, 10253, 10255, 10257, 10256, 10256, 10258, 10261, 10260, 10261, 10263, 10266, 10265, 10264, 10265, 10268, 10266, 10266, 10267, 10271, 10270, 10270, 10272, 10276, 10275, 10276, 10279, 10282, 10281, 10281, 10282, 10284, 10283, 10283, 10285, 10288, 10287, 10287, 10289, 10292, 10292, 10293, 10295, 10298, 10297, 10296, 10297, 10299, 10297, 10297, 10298, 10301, 10300, 10300, 10302, 10305, 10304, 10305, 10307, 10310, 10309, 10308, 10309, 10312, 10310, 10310, 10312, 10315, 10314, 10314, 10316, 10320, 10320, 10320, 10323, 10326, 10325, 10324, 10325, 10327, 10326, 10325, 10327, 10330, 10328, 10328, 10330, 10333, 10333, 10333, 10335, 10338, 10336, 10336, 10337, 10339, 10337, 10336, 10338, 10341, 10339, 10339, 10341, 10345, 10344, 10345, 10347, 10350, 10349, 10348, 10349, 10352, 10350, 10350, 10352, 10355, 10354, 10354, 10356, 10360, 10359, 10360, 10363, 10366, 10365, 10365, 10366, 10368, 10367, 10367, 10368, 10372, 10370, 10371, 10373, 10376, 10376, 10377, 10379, 10382, 10381, 10380, 10381, 10383, 10382, 10381, 10383, 10386, 10384, 10384, 10386, 10389, 10389, 10389, 10391, 10394, 10392, 10392, 10393, 10395, 10393, 10392, 10394, 10397, 10395, 10395, 10397, 10400, 10400, 10401, 10403, 10406, 10405, 10404, 10405, 10408, 10406, 10406, 10408, 10411, 10410, 10410, 10413, 10416, 10416, 10417, 10419, 10422, 10421, 10420, 10421, 10423, 10421, 10421, 10422, 10425, 10424, 10424, 10426, 10429, 10428, 10429, 10431, 10434, 10433, 10432, 10433, 10435, 10434, 10434, 10435, 10439, 10437, 10438, 10440, 10444, 10443, 10444, 10447, 10450, 10449, 10449, 10450, 10452, 10451, 10451, 10452, 10456, 10454, 10455, 10457, 10460, 10460, 10461, 10463, 10466, 10465, 10464, 10465, 10467, 10465, 10465, 10467, 10469, 10468, 10468, 10470, 10473, 10472, 10473, 10475, 10478, 10476, 10476, 10477, 10479, 10477, 10477, 10478, 10481, 10480, 10480, 10482, 10485, 10484, 10485, 10487, 10490, 10488, 10488, 10489, 10491, 10489, 10488, 10490, 10493, 10491, 10491, 10493, 10497, 10496, 10497, 10499, 10502, 10501, 10500, 10501, 10504, 10502, 10502, 10503, 10507, 10506, 10506, 10508, 10512, 10511, 10512, 10515, 10518, 10517, 10516, 10518, 10520, 10519, 10519, 10520, 10523, 10522, 10523, 10525, 10528, 10528, 10529, 10531, 10534, 10533, 10532, 10533, 10535, 10533, 10533, 10534, 10537, 10536, 10536, 10538, 10541, 10540, 10541, 10543, 10546, 10544, 10544, 10545, 10547, 10545, 10545, 10546, 10549, 10548, 10548, 10550, 10553, 10552, 10553, 10555, 10558, 10556, 10556, 10557, 10559, 10557, 10556, 10558, 10561, 10559, 10559, 10561, 10565, 10564, 10565, 10567, 10570, 10569, 10568, 10569, 10572, 10570, 10570, 10572, 10575, 10574, 10574, 10576, 10580, 10580, 10580, 10583, 10586, 10584, 10584, 10585, 10587, 10585, 10585, 10586, 10589, 10588, 10588, 10589, 10593, 10592, 10593, 10595, 10598, 10597, 10596, 10597, 10600, 10598, 10598, 10600, 10603, 10602, 10602, 10604, 10608, 10607, 10608, 10611, 10614, 10613, 10612, 10613, 10615, 10613, 10613, 10615, 10617, 10616, 10616, 10618, 10621, 10620, 10621, 10623, 10626, 10624, 10624, 10625, 10627, 10625, 10625, 10626, 10629, 10628, 10628, 10630, 10633, 10632, 10633, 10635, 10638, 10636, 10636, 10636, 10639, 10637, 10636, 10638, 10641, 10639, 10639, 10641, 10644, 10644, 10644, 10647, 10650, 10649, 10648, 10649, 10652, 10650, 10650, 10652, 10655, 10654, 10654, 10656, 10660, 10660, 10660, 10663, 10666, 10665, 10664, 10665, 10667, 10665, 10665, 10666, 10669, 10668, 10668, 10670, 10673, 10672, 10673, 10675, 10678, 10676, 10676, 10677, 10679, 10677, 10677, 10678, 10681, 10680, 10680, 10681, 10685, 10684, 10685, 10687, 10690, 10688, 10688, 10688, 10691, 10689, 10688, 10690, 10693, 10691, 10691, 10693, 10696, 10696, 10696, 10699, 10702, 10701, 10700, 10701, 10704, 10702, 10702, 10704, 10707, 10706, 10706, 10708, 10712, 10711, 10712, 10715, 10718, 10716, 10716, 10717, 10719, 10717, 10717, 10718, 10721, 10720, 10720, 10722, 10725, 10724, 10725, 10727, 10730, 10728, 10728, 10729, 10731, 10729, 10728, 10730, 10733, 10731, 10731, 10733, 10737, 10736, 10737, 10739, 10742, 10740, 10740, 10741, 10743, 10741, 10741, 10742, 10745, 10744, 10744, 10746, 10749, 10748, 10749, 10751, 10754, 10752, 10752, 10752, 10755, 10753, 10752, 10754, 10757, 10755, 10755, 10757, 10760, 10760, 10760, 10763, 10766, 10765, 10764, 10765, 10768, 10766, 10766, 10768, 10771, 10770, 10770, 10772, 10776, 10775, 10776, 10779, 10782, 10780, 10780, 10781, 10783, 10781, 10781, 10782, 10785, 10784, 10784, 10786, 10789, 10788, 10789, 10791, 10794, 10792, 10792, 10792, 10795, 10793, 10792, 10794, 10797, 10795, 10795, 10797, 10801, 10800, 10801, 10803, 10806, 10804, 10804, 10805, 10807, 10805, 10805, 10806, 10809, 10808, 10808, 10810, 10813, 10812, 10813, 10815, 10818, 10816, 10816, 10816, 10819, 10817, 10816, 10818, 10821, 10819, 10819, 10821, 10824, 10824, 10824, 10827, 10830, 10828, 10828, 10829, 10832, 10830, 10830, 10832, 10835, 10834, 10834, 10836, 10840, 10839, 10840, 10843, 10846, 10845, 10844, 10845, 10848, 10846, 10845, 10847, 10850, 10848, 10848, 10850, 10854, 10853, 10853, 10855, 10858, 10856, 10855, 10856, 10858, 10855, 10855, 10856, 10858, 10857, 10856, 10858, 10861, 10860, 10861, 10863, 10866, 10864, 10864, 10865, 10867, 10866, 10865, 10867, 10870, 10869, 10870, 10872, 10876, 10875, 10876, 10879, 10882, 10880, 10880, 10881, 10883, 10881, 10881, 10883, 10885, 10884, 10884, 10886, 10889, 10888, 10889, 10891, 10894, 10892, 10892, 10892, 10895, 10893, 10892, 10894, 10897, 10895, 10895, 10897, 10901, 10900, 10901, 10903, 10906, 10904, 10904, 10905, 10907, 10905, 10904, 10906, 10909, 10907, 10907, 10909, 10913, 10912, 10913, 10915, 10918, 10916, 10916, 10917, 10919, 10917, 10916, 10918, 10921, 10919, 10919, 10921, 10925, 10924, 10925, 10927, 10930, 10928, 10928, 10929, 10931, 10929, 10928, 10930, 10933, 10931, 10931, 10933, 10937, 10936, 10937, 10939, 10942, 10940, 10940, 10940, 10943, 10941, 10940, 10942, 10945, 10943, 10943, 10945, 10949, 10948, 10949, 10951, 10954, 10952, 10952, 10952, 10955, 10953, 10952, 10954, 10957, 10955, 10955, 10957, 10961, 10960, 10961, 10963, 10966, 10964, 10964, 10964, 10967, 10965, 10964, 10966, 10969, 10967, 10967, 10969, 10973, 10972, 10973, 10975, 10978, 10976, 10976, 10976, 10979, 10977, 10976, 10978, 10981, 10979, 10979, 10981, 10985, 10984, 10985, 10987, 10990, 10988, 10988, 10988, 10991, 10989, 10988, 10990, 10993, 10991, 10991, 10993, 10997, 10996, 10997, 10999, 11002, 11000, 11000, 11000, 11003, 11001, 11000, 11002, 11005, 11003, 11003, 11005, 11009, 11008, 11009, 11011, 11014, 11012, 11012, 11012, 11015, 11013, 11012, 11014, 11017, 11015, 11015, 11017, 11021, 11020, 11021, 11023, 11026, 11024, 11024, 11024, 11027, 11025, 11024, 11026, 11029, 11027, 11027, 11029, 11033, 11032, 11033, 11035, 11038, 11036, 11036, 11036, 11039, 11037, 11036, 11038, 11041, 11039, 11039, 11041, 11045, 11044, 11045, 11047, 11050, 11048, 11048, 11048, 11051, 11049, 11048, 11050, 11053, 11051, 11051, 11053, 11057, 11056, 11057, 11059, 11062, 11060, 11060, 11060, 11063, 11061, 11060, 11062, 11065, 11063, 11063, 11065, 11069, 11068, 11069, 11071, 11074, 11072, 11072, 11072, 11075, 11073, 11072, 11074, 11077, 11075, 11075, 11077, 11081, 11080, 11080, 11083, 11086, 11084, 11084, 11084, 11087, 11085, 11084, 11086, 11089, 11087, 11087, 11089, 11093, 11092, 11093, 11095, 11098, 11096, 11095, 11096, 11099, 11097, 11096, 11098, 11101, 11099, 11099, 11101, 11105, 11104, 11104, 11107, 11110, 11108, 11108, 11109, 11111, 11109, 11109, 11110, 11113, 11112, 11112, 11114, 11117, 11116, 11117, 11119, 11122, 11120, 11119, 11120, 11122, 11120, 11119, 11120, 11123, 11121, 11121, 11123, 11126, 11125, 11125, 11127, 11130, 11128, 11127, 11128, 11130, 11128, 11127, 11129, 11132, 11130, 11130, 11132, 11136, 11135, 11136, 11138, 11142, 11140, 11140, 11141, 11144, 11142, 11142, 11144, 11147, 11146, 11146, 11149, 11152, 11152, 11152, 11155, 11158, 11156, 11155, 11156, 11158, 11156, 11155, 11156, 11159, 11157, 11157, 11159, 11162, 11161, 11161, 11163, 11166, 11164, 11163, 11164, 11166, 11164, 11164, 11165, 11168, 11167, 11167, 11169, 11172, 11172, 11172, 11175, 11178, 11176, 11176, 11176, 11179, 11177, 11176, 11178, 11181, 11179, 11179, 11181, 11185, 11184, 11184, 11187, 11190, 11188, 11187, 11188, 11191, 11189, 11188, 11190, 11193, 11191, 11191, 11193, 11197, 11196, 11196, 11199, 11202, 11200, 11199, 11200, 11203, 11201, 11200, 11202, 11205, 11203, 11203, 11205, 11209, 11208, 11208, 11211, 11214, 11212, 11211, 11212, 11215, 11213, 11212, 11214, 11217, 11215, 11215, 11217, 11221, 11220, 11220, 11223, 11226, 11224, 11223, 11224, 11227, 11225, 11224, 11226, 11229, 11227, 11227, 11229, 11233, 11232, 11232, 11235, 11238, 11236, 11236, 11237, 11239, 11237, 11237, 11238, 11241, 11240, 11240, 11242, 11245, 11244, 11245, 11247, 11250, 11248, 11247, 11248, 11250, 11248, 11247, 11248, 11251, 11249, 11249, 11250, 11254, 11253, 11253, 11255, 11258, 11256, 11255, 11256, 11258, 11256, 11255, 11257, 11260, 11258, 11258, 11260, 11264, 11263, 11264, 11266, 11270, 11268, 11268, 11269, 11272, 11270, 11270, 11272, 11275, 11274, 11274, 11276, 11280, 11280, 11280, 11283, 11286, 11284, 11283, 11284, 11286, 11284, 11283, 11284, 11287, 11285, 11285, 11287, 11290, 11289, 11289, 11291, 11294, 11292, 11291, 11292, 11294, 11292, 11292, 11293, 11296, 11295, 11295, 11297, 11300, 11300, 11300, 11303, 11306, 11304, 11303, 11304, 11307, 11305, 11304, 11306, 11309, 11307, 11307, 11309, 11313, 11312, 11312, 11315, 11318, 11316, 11315, 11316, 11318, 11316, 11316, 11317, 11321, 11319, 11319, 11321, 11324, 11324, 11324, 11327, 11330, 11328, 11328, 11329, 11331, 11329, 11329, 11330, 11333, 11332, 11332, 11334, 11337, 11336, 11337, 11339, 11342, 11340, 11339, 11339, 11341, 11339, 11338, 11339, 11342, 11340, 11340, 11342, 11345, 11344, 11344, 11347, 11350, 11348, 11348, 11349, 11351, 11350, 11349, 11351, 11355, 11353, 11354, 11356, 11360, 11359, 11360, 11362, 11366, 11364, 11363, 11364, 11366, 11364, 11363, 11364, 11367, 11365, 11365, 11367, 11370, 11369, 11369, 11371, 11374, 11372, 11371, 11372, 11374, 11372, 11371, 11373, 11376, 11375, 11375, 11377, 11380, 11379, 11380, 11382, 11386, 11384, 11383, 11384, 11387, 11385, 11384, 11386, 11389, 11387, 11387, 11389, 11393, 11392, 11392, 11395, 11398, 11396, 11395, 11396, 11398, 11396, 11396, 11397, 11400, 11399, 11399, 11401, 11404, 11404, 11404, 11407, 11410, 11408, 11407, 11408, 11411, 11409, 11408, 11410, 11413, 11412, 11411, 11413, 11417, 11416, 11417, 11419, 11422, 11420, 11419, 11420, 11422, 11419, 11419, 11420, 11423, 11421, 11420, 11422, 11425, 11424, 11425, 11427, 11430, 11428, 11427, 11428, 11430, 11428, 11428, 11429, 11432, 11431, 11431, 11433, 11436, 11436, 11436, 11438, 11442, 11440, 11439, 11440, 11443, 11441, 11440, 11442, 11445, 11443, 11443, 11445, 11449, 11448, 11448, 11451, 11454, 11452, 11451, 11452, 11455, 11453, 11452, 11454, 11457, 11455, 11455, 11457, 11461, 11460, 11461, 11463, 11466, 11464, 11463, 11464, 11466, 11463, 11463, 11464, 11467, 11465, 11464, 11466, 11469, 11468, 11469, 11471, 11474, 11472, 11471, 11472, 11474, 11472, 11472, 11473, 11476, 11475, 11475, 11477, 11480, 11480, 11480, 11482, 11486, 11484, 11483, 11484, 11487, 11484, 11484, 11485, 11489, 11487, 11487, 11489, 11492, 11492, 11492, 11494, 11498, 11496, 11495, 11496, 11499, 11497, 11496, 11498, 11501, 11500, 11500, 11501, 11505, 11504, 11505, 11507, 11510, 11508, 11507, 11507, 11509, 11507, 11506, 11507, 11510, 11508, 11508, 11510, 11513, 11512, 11512, 11515, 11518, 11516, 11516, 11517, 11519, 11518, 11517, 11519, 11523, 11521, 11522, 11524, 11528, 11527, 11528, 11530, 11534, 11532, 11531, 11532, 11534, 11532, 11531, 11532, 11535, 11533, 11533, 11535, 11538, 11537, 11537, 11539, 11542, 11540, 11539, 11540, 11542, 11540, 11539, 11541, 11544, 11542, 11542, 11544, 11548, 11547, 11548, 11550, 11554, 11552, 11551, 11552, 11555, 11552, 11552, 11554, 11557, 11555, 11555, 11557, 11561, 11560, 11560, 11562, 11566, 11564, 11563, 11564, 11567, 11565, 11564, 11566, 11569, 11567, 11567, 11569, 11573, 11572, 11572, 11575, 11578, 11576, 11575, 11576, 11578, 11575, 11574, 11576, 11579, 11577, 11576, 11578, 11581, 11580, 11581, 11583, 11586, 11584, 11583, 11584, 11586, 11584, 11583, 11585, 11588, 11587, 11587, 11589, 11592, 11591, 11592, 11594, 11598, 11596, 11595, 11596, 11599, 11596, 11596, 11597, 11601, 11599, 11599, 11601, 11604, 11604, 11604, 11606, 11610, 11608, 11607, 11608, 11611, 11609, 11608, 11610, 11613, 11611, 11611, 11613, 11617, 11616, 11616, 11619, 11622, 11620, 11619, 11620, 11622, 11619, 11618, 11620, 11623, 11621, 11620, 11622, 11625, 11624, 11625, 11627, 11630, 11628, 11627, 11628, 11630, 11628, 11627, 11629, 11632, 11630, 11630, 11632, 11636, 11635, 11636, 11638, 11642, 11640, 11639, 11640, 11643, 11641, 11640, 11642, 11645, 11643, 11643, 11645, 11649, 11648, 11648, 11651, 11654, 11652, 11651, 11651, 11654, 11651, 11650, 11652, 11655, 11653, 11652, 11654, 11657, 11656, 11657, 11659, 11662, 11660, 11659, 11660, 11662, 11660, 11659, 11661, 11664, 11663, 11662, 11665, 11668, 11667, 11668, 11670, 11674, 11672, 11671, 11672, 11674, 11672, 11672, 11673, 11677, 11675, 11675, 11677, 11680, 11680, 11680, 11682, 11686, 11684, 11683, 11684, 11687, 11685, 11684, 11686, 11689, 11687, 11687, 11689, 11693, 11692, 11692, 11695, 11698, 11696, 11695, 11696, 11698, 11696, 11695, 11696, 11699, 11697, 11697, 11699, 11702, 11701, 11701, 11703, 11706, 11704, 11702, 11703, 11705, 11702, 11701, 11703, 11706, 11704, 11703, 11705, 11709, 11708, 11708, 11710, 11714, 11712, 11711, 11713, 11715, 11713, 11713, 11715, 11718, 11717, 11717, 11720, 11724, 11723, 11724, 11726, 11730, 11728, 11727, 11728, 11730, 11728, 11727, 11729, 11731, 11730, 11729, 11731, 11734, 11733, 11733, 11735, 11738, 11736, 11734, 11735, 11737, 11735, 11734, 11735, 11738, 11736, 11736, 11738, 11741, 11740, 11740, 11743, 11746, 11744, 11743, 11744, 11746, 11744, 11744, 11745, 11748, 11747, 11747, 11749, 11752, 11751, 11752, 11754, 11758, 11756, 11755, 11756, 11758, 11756, 11756, 11757, 11760, 11759, 11759, 11761, 11764, 11764, 11764, 11766, 11770, 11768, 11767, 11768, 11771, 11769, 11768, 11770, 11773, 11771, 11771, 11773, 11777, 11776, 11776, 11779, 11782, 11780, 11779, 11779, 11782, 11779, 11778, 11780, 11782, 11781, 11780, 11782, 11785, 11784, 11785, 11787, 11790, 11788, 11787, 11788, 11790, 11788, 11787, 11789, 11792, 11790, 11790, 11792, 11796, 11795, 11796, 11798, 11802, 11800, 11799, 11800, 11803, 11801, 11800, 11802, 11805, 11803, 11803, 11805, 11809, 11808, 11808, 11811, 11814, 11812, 11811, 11811, 11813, 11811, 11810, 11811, 11814, 11812, 11812, 11814, 11817, 11816, 11816, 11819, 11822, 11820, 11819, 11820, 11822, 11820, 11820, 11821, 11824, 11823, 11823, 11825, 11829, 11828, 11828, 11830, 11834, 11832, 11831, 11831, 11834, 11831, 11830, 11832, 11834, 11833, 11832, 11834, 11837, 11836, 11836, 11839, 11842, 11840, 11839, 11840, 11842, 11840, 11840, 11841, 11844, 11843, 11843, 11845, 11848, 11848, 11848, 11850, 11854, 11852, 11851, 11851, 11854, 11851, 11850, 11852, 11855, 11853, 11852, 11854, 11857, 11856, 11857, 11859, 11862, 11860, 11859, 11860, 11862, 11860, 11859, 11861, 11864, 11862, 11862, 11864, 11868, 11867, 11868, 11870, 11874, 11872, 11871, 11872, 11875, 11873, 11872, 11874, 11877, 11875, 11875, 11877, 11881, 11880, 11880, 11883, 11886, 11884, 11883, 11883, 11885, 11883, 11882, 11884, 11886, 11884, 11884, 11886, 11889, 11888, 11888, 11891, 11894, 11892, 11891, 11892, 11894, 11892, 11891, 11893, 11896, 11894, 11894, 11896, 11900, 11899, 11900, 11902, 11906, 11904, 11903, 11904, 11907, 11905, 11904, 11906, 11909, 11907, 11907, 11909, 11913, 11912, 11912, 11914, 11918, 11916, 11915, 11916, 11918, 11915, 11915, 11916, 11919, 11917, 11917, 11918, 11922, 11920, 11921, 11923, 11926, 11924, 11922, 11923, 11925, 11923, 11922, 11923, 11926, 11924, 11924, 11926, 11929, 11928, 11928, 11930, 11934, 11932, 11931, 11932, 11934, 11932, 11931, 11933, 11936, 11934, 11934, 11936, 11940, 11939, 11940, 11942, 11946, 11944, 11943, 11944, 11947, 11945, 11944, 11946, 11949, 11947, 11947, 11949, 11953, 11952, 11952, 11955, 11958, 11956, 11955, 11955, 11957, 11955, 11954, 11955, 11958, 11956, 11956, 11958, 11961, 11960, 11960, 11962, 11966, 11964, 11963, 11964, 11966, 11964, 11964, 11965, 11968, 11967, 11967, 11969, 11972, 11972, 11972, 11974, 11978, 11976, 11975, 11975, 11977, 11975, 11974, 11975, 11978, 11976, 11976, 11978, 11981, 11980, 11980, 11982, 11986, 11984, 11983, 11984, 11986, 11984, 11984, 11985, 11988, 11987, 11987, 11989, 11992, 11992, 11992, 11994, 11998, 11996, 11995, 11995, 11997, 11995, 11994, 11995, 11998, 11996, 11996, 11998, 12001, 12000, 12000, 12002, 12006, 12004, 12003, 12004, 12006, 12004, 12004, 12005, 12008, 12007, 12007, 12009, 12012, 12012, 12012, 12014, 12018, 12016, 12015, 12015, 12018, 12015, 12014, 12016, 12019, 12017, 12016, 12018, 12021, 12020, 12020, 12023, 12026, 12024, 12023, 12024, 12026, 12024, 12023, 12025, 12028, 12026, 12026, 12028, 12032, 12031, 12032, 12034, 12038, 12036, 12035, 12036, 12039, 12036, 12036, 12038, 12041, 12039, 12039, 12041, 12045, 12044, 12044, 12046, 12050, 12048, 12047, 12047, 12050, 12047, 12047, 12048, 12051, 12049, 12048, 12050, 12054, 12052, 12053, 12055, 12058, 12055, 12054, 12055, 12057, 12054, 12054, 12055, 12058, 12056, 12055, 12057, 12061, 12060, 12060, 12062, 12066, 12064, 12063, 12064, 12066, 12064, 12064, 12065, 12068, 12067, 12067, 12069, 12073, 12072, 12072, 12074, 12078, 12076, 12075, 12075, 12077, 12075, 12074, 12075, 12078, 12076, 12076, 12078, 12081, 12080, 12080, 12082, 12086, 12084, 12083, 12084, 12086, 12084, 12083, 12085, 12088, 12087, 12087, 12089, 12092, 12092, 12092, 12094, 12098, 12096, 12095, 12095, 12097, 12095, 12094, 12095, 12098, 12096, 12096, 12098, 12101, 12100, 12100, 12102, 12106, 12104, 12103, 12104, 12106, 12104, 12103, 12105, 12108, 12107, 12107, 12109, 12112, 12112, 12112, 12114, 12118, 12116, 12115, 12115, 12117, 12115, 12114, 12115, 12118, 12116, 12116, 12118, 12121, 12120, 12120, 12122, 12126, 12124, 12123, 12124, 12126, 12124, 12123, 12125, 12128, 12126, 12126, 12129, 12132, 12131, 12132, 12134, 12138, 12136, 12135, 12136, 12138, 12135, 12135, 12136, 12139, 12137, 12137, 12138, 12142, 12140, 12141, 12143, 12146, 12143, 12142, 12143, 12145, 12142, 12142, 12143, 12146, 12144, 12144, 12145, 12149, 12148, 12148, 12150, 12154, 12152, 12151, 12152, 12154, 12152, 12151, 12153, 12156, 12154, 12154, 12156, 12160, 12159, 12160, 12162, 12166, 12164, 12163, 12164, 12167, 12164, 12164, 12165, 12169, 12167, 12167, 12169, 12173, 12172, 12172, 12174, 12178, 12176, 12175, 12175, 12178, 12175, 12174, 12176, 12179, 12177, 12176, 12178, 12182, 12180, 12181, 12183, 12186, 12183, 12182, 12183, 12185, 12182, 12181, 12183, 12186, 12184, 12183, 12185, 12189, 12188, 12188, 12190, 12194, 12192, 12191, 12192, 12194, 12192, 12191, 12193, 12196, 12195, 12195, 12197, 12200, 12199, 12200, 12202, 12206, 12204, 12203, 12203, 12206, 12203, 12203, 12204, 12207, 12205, 12204, 12206, 12210, 12208, 12209, 12211, 12214, 12211, 12210, 12211, 12213, 12210, 12209, 12211, 12214, 12212, 12211, 12213, 12217, 12216, 12216, 12218, 12222, 12220, 12219, 12220, 12222, 12220, 12219, 12221, 12224, 12223, 12222, 12225, 12228, 12227, 12228, 12230, 12234, 12232, 12231, 12231, 12234, 12231, 12230, 12232, 12235, 12233, 12232, 12234, 12238, 12236, 12237, 12239, 12242, 12239, 12238, 12239, 12241, 12238, 12237, 12239, 12242, 12240, 12239, 12241, 12245, 12244, 12244, 12246, 12250, 12248, 12247, 12248, 12250, 12248, 12247, 12249, 12252, 12251, 12250, 12253, 12256, 12255, 12256, 12258, 12262, 12260, 12259, 12259, 12262, 12259, 12258, 12260, 12263, 12261, 12260, 12262, 12266, 12264, 12265, 12267, 12270, 12267, 12266, 12267, 12269, 12266, 12265, 12267, 12270, 12268, 12267, 12269, 12273, 12272, 12272, 12274, 12278, 12276, 12275, 12276, 12278, 12276, 12275, 12277, 12280, 12279, 12279, 12281, 12284, 12284, 12284, 12286, 12290, 12288, 12286, 12287, 12289, 12287, 12286, 12287, 12290, 12288, 12288, 12290, 12293, 12292, 12292, 12294, 12298, 12296, 12295, 12296, 12298, 12296, 12295, 12297, 12300, 12299, 12298, 12301, 12304, 12303, 12304, 12306, 12310, 12308, 12306, 12307, 12309, 12307, 12306, 12307, 12310, 12308, 12308, 12310, 12313, 12312, 12312, 12314, 12318, 12316, 12315, 12316, 12318, 12316, 12315, 12317, 12320, 12318, 12318, 12320, 12324, 12323, 12324, 12326, 12330, 12328, 12327, 12327, 12330, 12327, 12326, 12328, 12331, 12329, 12328, 12330, 12334, 12332, 12333, 12335, 12338, 12335, 12334, 12335, 12337, 12334, 12333, 12335, 12338, 12336, 12335, 12337, 12341, 12340, 12340, 12342, 12346, 12344, 12343, 12344, 12346, 12344, 12343, 12345, 12348, 12346, 12346, 12349, 12352, 12351, 12352, 12354, 12358, 12356, 12355, 12355, 12358, 12355, 12354, 12356, 12359, 12357, 12356, 12358, 12362, 12360, 12361, 12363, 12366, 12363, 12362, 12363, 12365, 12362, 12361, 12363, 12366, 12364, 12363, 12365, 12369, 12368, 12368, 12370, 12374, 12372, 12371, 12372, 12374, 12372, 12371, 12373, 12376, 12374, 12374, 12376, 12380, 12379, 12380, 12382, 12386, 12384, 12383, 12383, 12386, 12383, 12382, 12384, 12387, 12385, 12384, 12386, 12390, 12388, 12388, 12391, 12394, 12391, 12390, 12391, 12393, 12390, 12389, 12391, 12394, 12392, 12391, 12393, 12397, 12396, 12396, 12398, 12402, 12400, 12399, 12400, 12402, 12400, 12399, 12401, 12404, 12402, 12402, 12404, 12408, 12407, 12408, 12410, 12414, 12412, 12411, 12411, 12414, 12411, 12410, 12412, 12415, 12413, 12412, 12414, 12417, 12416, 12416, 12418, 12422, 12419, 12418, 12419, 12421, 12418, 12418, 12419, 12422, 12420, 12420, 12421, 12425, 12424, 12424, 12426, 12430, 12427, 12426, 12427, 12429, 12427, 12426, 12427, 12430, 12428, 12428, 12430, 12433, 12432, 12432, 12434, 12438, 12435, 12434, 12435, 12437, 12434, 12433, 12435, 12438, 12436, 12435, 12437, 12441, 12440, 12440, 12442, 12446, 12444, 12443, 12444, 12446, 12444, 12443, 12445, 12448, 12446, 12446, 12448, 12452, 12451, 12452, 12454, 12458, 12456, 12455, 12455, 12458, 12455, 12454, 12456, 12459, 12457, 12456, 12458, 12462, 12460, 12460, 12462, 12466, 12463, 12462, 12463, 12465, 12462, 12461, 12463, 12466, 12464, 12463, 12465, 12469, 12468, 12468, 12470, 12474, 12472, 12471, 12472, 12474, 12472, 12471, 12473, 12476, 12474, 12474, 12476, 12480, 12479, 12480, 12482, 12486, 12484, 12483, 12483, 12486, 12483, 12482, 12484, 12487, 12485, 12484, 12486, 12490, 12488, 12488, 12490, 12494, 12491, 12490, 12491, 12493, 12490, 12489, 12491, 12494, 12492, 12491, 12493, 12497, 12496, 12496, 12498, 12502, 12500, 12499, 12500, 12502, 12500, 12499, 12501, 12504, 12502, 12502, 12504, 12508, 12507, 12508, 12510, 12514, 12511, 12510, 12511, 12513, 12511, 12510, 12512, 12515, 12512, 12512, 12514, 12517, 12516, 12516, 12518, 12522, 12519, 12518, 12519, 12521, 12519, 12518, 12519, 12522, 12520, 12520, 12522, 12525, 12524, 12524, 12526, 12530, 12527, 12526, 12527, 12529, 12526, 12525, 12527, 12530, 12528, 12527, 12529, 12533, 12532, 12532, 12534, 12538, 12536, 12535, 12536, 12538, 12536, 12535, 12537, 12540, 12538, 12538, 12540, 12544, 12543, 12544, 12546, 12550, 12547, 12546, 12547, 12550, 12547, 12546, 12548, 12551, 12548, 12548, 12550, 12553, 12552, 12552, 12554, 12558, 12555, 12554, 12555, 12557, 12554, 12554, 12555, 12558, 12556, 12556, 12557, 12561, 12560, 12560, 12562, 12566, 12563, 12562, 12563, 12565, 12563, 12562, 12563, 12566, 12564, 12564, 12566, 12569, 12568, 12568, 12570, 12574, 12571, 12570, 12571, 12573, 12570, 12569, 12571, 12574, 12572, 12571, 12573, 12577, 12576, 12576, 12578, 12582, 12580, 12579, 12580, 12582, 12580, 12579, 12581, 12584, 12582, 12582, 12584, 12588, 12587, 12588, 12590, 12594, 12591, 12590, 12591, 12594, 12591, 12590, 12592, 12595, 12593, 12592, 12594, 12597, 12596, 12596, 12598, 12602, 12599, 12598, 12599, 12601, 12598, 12597, 12598, 12602, 12599, 12599, 12601, 12605, 12603, 12604, 12606, 12610, 12608, 12607, 12608, 12610, 12608, 12607, 12609, 12612, 12610, 12610, 12612, 12616, 12615, 12616, 12618, 12622, 12619, 12618, 12619, 12621, 12619, 12618, 12619, 12622, 12620, 12620, 12622, 12625, 12624, 12624, 12626, 12630, 12627, 12626, 12627, 12629, 12627, 12626, 12627, 12630, 12628, 12628, 12630, 12633, 12632, 12632, 12634, 12638, 12635, 12634, 12635, 12637, 12634, 12633, 12634, 12637, 12635, 12635, 12637, 12641, 12639, 12640, 12642, 12646, 12644, 12643, 12644, 12646, 12644, 12644, 12645, 12649, 12647, 12647, 12649, 12653, 12652, 12652, 12654, 12658, 12655, 12654, 12654, 12656, 12653, 12652, 12653, 12656, 12654, 12653, 12655, 12658, 12656, 12656, 12658, 12662, 12659, 12658, 12659, 12661, 12659, 12658, 12660, 12663, 12662, 12662, 12664, 12668, 12667, 12668, 12670, 12674, 12672, 12671, 12671, 12674, 12671, 12670, 12672, 12675, 12673, 12672, 12674, 12678, 12676, 12676, 12678, 12682, 12679, 12678, 12679, 12681, 12678, 12677, 12678, 12681, 12679, 12679, 12681, 12685, 12683, 12684, 12686, 12690, 12687, 12687, 12687, 12690, 12688, 12687, 12689, 12692, 12690, 12690, 12692, 12696, 12695, 12696, 12698, 12702, 12699, 12698, 12699, 12701, 12699, 12698, 12699, 12702, 12700, 12700, 12702, 12705, 12704, 12704, 12706, 12710, 12707, 12706, 12707, 12709, 12706, 12705, 12707, 12710, 12708, 12707, 12709, 12713, 12712, 12712, 12714, 12718, 12715, 12714, 12715, 12717, 12714, 12714, 12715, 12718, 12716, 12716, 12717, 12721, 12720, 12720, 12722, 12726, 12723, 12722, 12723, 12725, 12723, 12722, 12723, 12726, 12724, 12724, 12726, 12729, 12728, 12728, 12730, 12734, 12731, 12730, 12731, 12733, 12730, 12729, 12731, 12734, 12732, 12731, 12733, 12737, 12735, 12736, 12738, 12742, 12739, 12738, 12739, 12742, 12739, 12739, 12740, 12744, 12742, 12742, 12744, 12748, 12747, 12748, 12750, 12754, 12751, 12751, 12751, 12754, 12751, 12750, 12752, 12755, 12753, 12752, 12754, 12758, 12756, 12757, 12758, 12762, 12759, 12757, 12758, 12760, 12757, 12756, 12757, 12759, 12757, 12756, 12758, 12761, 12760, 12760, 12762, 12766, 12763, 12762, 12763, 12766, 12763, 12763, 12764, 12768, 12766, 12766, 12768, 12772, 12771, 12772, 12774, 12778, 12775, 12774, 12775, 12778, 12775, 12774, 12776, 12779, 12777, 12776, 12778, 12782, 12780, 12780, 12782, 12786, 12783, 12782, 12782, 12785, 12782, 12781, 12782, 12785, 12783, 12783, 12785, 12788, 12787, 12788, 12790, 12794, 12791, 12791, 12792, 12794, 12792, 12791, 12793, 12796, 12795, 12795, 12797, 12801, 12799, 12800, 12802, 12806, 12803, 12802, 12803, 12805, 12802, 12801, 12802, 12805, 12802, 12801, 12803, 12806, 12805, 12805, 12807, 12810, 12807, 12806, 12806, 12808, 12806, 12805, 12806, 12809, 12807, 12807, 12809, 12812, 12811, 12812, 12814, 12818, 12815, 12815, 12816, 12818, 12816, 12815, 12817, 12820, 12818, 12818, 12820, 12824, 12823, 12824, 12826, 12830, 12827, 12826, 12827, 12829, 12827, 12826, 12827, 12830, 12828, 12828, 12830, 12833, 12832, 12832, 12834, 12838, 12835, 12834, 12835, 12837, 12834, 12833, 12835, 12838, 12836, 12835, 12837, 12841, 12840, 12840, 12842, 12846, 12843, 12842, 12843, 12845, 12842, 12841, 12843, 12846, 12844, 12843, 12845, 12849, 12848, 12848, 12850, 12854, 12851, 12850, 12851, 12853, 12850, 12850, 12851, 12854, 12852, 12852, 12853, 12857, 12856, 12856, 12858, 12862, 12859, 12858, 12858, 12861, 12858, 12857, 12858, 12861, 12859, 12859, 12861, 12864, 12863, 12864, 12866, 12870, 12867, 12867, 12868, 12870, 12868, 12867, 12869, 12873, 12871, 12871, 12873, 12877, 12876, 12876, 12878, 12882, 12879, 12878, 12878, 12880, 12877, 12876, 12877, 12880, 12878, 12877, 12878, 12882, 12880, 12880, 12882, 12886, 12883, 12882, 12883, 12885, 12883, 12882, 12884, 12887, 12885, 12885, 12888, 12892, 12891, 12891, 12894, 12898, 12895, 12895, 12895, 12898, 12895, 12895, 12896, 12899, 12897, 12897, 12898, 12902, 12900, 12901, 12902, 12906, 12903, 12901, 12902, 12904, 12901, 12899, 12901, 12903, 12901, 12900, 12902, 12905, 12904, 12904, 12906, 12910, 12907, 12906, 12907, 12910, 12907, 12906, 12908, 12912, 12910, 12910, 12912, 12916, 12915, 12915, 12918, 12922, 12919, 12918, 12919, 12921, 12919, 12918, 12919, 12923, 12920, 12920, 12922, 12925, 12924, 12924, 12926, 12930, 12927, 12926, 12927, 12929, 12926, 12925, 12927, 12930, 12928, 12927, 12929, 12933, 12932, 12932, 12934, 12938, 12935, 12934, 12935, 12937, 12934, 12933, 12935, 12938, 12936, 12935, 12937, 12941, 12940, 12940, 12942, 12946, 12943, 12942, 12943, 12945, 12942, 12942, 12943, 12946, 12944, 12944, 12945, 12949, 12948, 12948, 12950, 12954, 12951, 12950, 12950, 12953, 12950, 12949, 12950, 12953, 12951, 12951, 12953, 12956, 12955, 12956, 12958, 12962, 12959, 12958, 12960, 12962, 12960, 12959, 12961, 12964, 12962, 12962, 12965, 12968, 12967, 12968, 12970, 12974, 12971, 12970, 12970, 12973, 12970, 12969, 12970, 12973, 12970, 12969, 12971, 12974, 12973, 12973, 12974, 12978, 12975, 12973, 12974, 12976, 12973, 12972, 12974, 12977, 12975, 12974, 12976, 12980, 12979, 12979, 12982, 12986, 12983, 12983, 12984, 12986, 12984, 12983, 12985, 12989, 12987, 12987, 12989, 12993, 12992, 12992, 12994, 12998, 12995, 12994, 12994, 12996, 12993, 12992, 12993, 12996, 12993, 12993, 12994, 12998, 12996, 12996, 12998, 13002, 12999, 12998, 12999, 13001, 12999, 12998, 13000, 13003, 13001, 13001, 13004, 13008, 13007, 13007, 13010, 13014, 13011, 13010, 13011, 13013, 13011, 13010, 13011, 13014, 13012, 13012, 13014, 13017, 13016, 13016, 13018, 13022, 13019, 13018, 13019, 13021, 13018, 13017, 13019, 13022, 13020, 13019, 13021, 13025, 13024, 13024, 13026, 13030, 13027, 13026, 13027, 13029, 13026, 13025, 13027, 13030, 13028, 13027, 13029, 13033, 13032, 13032, 13034, 13038, 13035, 13034, 13035, 13037, 13034, 13033, 13035, 13038, 13036, 13035, 13037, 13041, 13040, 13040, 13042, 13046, 13043, 13042, 13043, 13045, 13042, 13041, 13043, 13046, 13044, 13043, 13045, 13049, 13048, 13048, 13050, 13054, 13051, 13050, 13051, 13053, 13050, 13049, 13051, 13054, 13052, 13051, 13053, 13057, 13056, 13056, 13058, 13062, 13059, 13058, 13059, 13061, 13058, 13057, 13059, 13062, 13060, 13059, 13061, 13065, 13064, 13064, 13066, 13070, 13067, 13066, 13067, 13069, 13066, 13065, 13067, 13070, 13068, 13067, 13069, 13073, 13072, 13072, 13074, 13078, 13075, 13074, 13075, 13077, 13074, 13073, 13075, 13078, 13076, 13075, 13077, 13081, 13080, 13080, 13082, 13086, 13083, 13082, 13083, 13085, 13082, 13081, 13083, 13086, 13084, 13083, 13085, 13089, 13088, 13088, 13090, 13094, 13091, 13090, 13090, 13093, 13090, 13089, 13090, 13093, 13091, 13091, 13093, 13096, 13095, 13096, 13098, 13102, 13099, 13098, 13099, 13102, 13100, 13099, 13101, 13104, 13102, 13102, 13104, 13108, 13107, 13108, 13110, 13114, 13111, 13110, 13110, 13112, 13110, 13108, 13110, 13112, 13110, 13109, 13111, 13114, 13113, 13112, 13114, 13118, 13115, 13113, 13114, 13116, 13113, 13112, 13114, 13117, 13115, 13114, 13116, 13120, 13119, 13119, 13122, 13126, 13123, 13122, 13123, 13126, 13123, 13123, 13124, 13128, 13126, 13126, 13128, 13132, 13131, 13131, 13134, 13138, 13135, 13134, 13135, 13138, 13135, 13134, 13136, 13139, 13137, 13136, 13138, 13142, 13140, 13140, 13142, 13146, 13143, 13141, 13142, 13144, 13141, 13139, 13140, 13143, 13141, 13140, 13142, 13145, 13144, 13144, 13146, 13150, 13147, 13146, 13147, 13149, 13147, 13146, 13148, 13151, 13149, 13149, 13152, 13156, 13155, 13155, 13158, 13162, 13159, 13158, 13159, 13162, 13159, 13158, 13160, 13163, 13161, 13160, 13162, 13166, 13164, 13164, 13166, 13170, 13167, 13165, 13166, 13168, 13165, 13163, 13164, 13167, 13165, 13164, 13166, 13169, 13168, 13168, 13170, 13174, 13171, 13170, 13171, 13173, 13171, 13170, 13172, 13175, 13174, 13173, 13176, 13180, 13179, 13179, 13182, 13186, 13183, 13182, 13183, 13185, 13183, 13182, 13183, 13186, 13184, 13184, 13186, 13189, 13188, 13188, 13190, 13194, 13191, 13190, 13190, 13193, 13190, 13189, 13190, 13194, 13191, 13191, 13193, 13197, 13195, 13196, 13198, 13202, 13199, 13198, 13199, 13201, 13198, 13197, 13199, 13202, 13200, 13199, 13201, 13205, 13204, 13204, 13206, 13210, 13207, 13206, 13207, 13209, 13206, 13205, 13207, 13210, 13208, 13207, 13209, 13213, 13212, 13212, 13214, 13218, 13215, 13214, 13215, 13217, 13214, 13213, 13215, 13218, 13216, 13215, 13217, 13221, 13220, 13220, 13222, 13226, 13223, 13222, 13223, 13225, 13222, 13221, 13223, 13226, 13224, 13223, 13225, 13229, 13228, 13228, 13230, 13234, 13231, 13230, 13231, 13233, 13230, 13229, 13231, 13234, 13232, 13231, 13233, 13237, 13236, 13236, 13238, 13242, 13239, 13238, 13239, 13241, 13238, 13237, 13239, 13242, 13240, 13239, 13241, 13245, 13244, 13244, 13246, 13250, 13247, 13246, 13247, 13249, 13246, 13245, 13247, 13250, 13248, 13247, 13249, 13253, 13252, 13252, 13254, 13258, 13255, 13254, 13255, 13257, 13254, 13253, 13255, 13258, 13256, 13255, 13257, 13261, 13260, 13260, 13262, 13266, 13263, 13262, 13263, 13265, 13262, 13261, 13263, 13266, 13264, 13263, 13265, 13269, 13268, 13268, 13270, 13274, 13271, 13270, 13271, 13273, 13270, 13269, 13271, 13274, 13272, 13271, 13273, 13277, 13276, 13276, 13278, 13282, 13279, 13278, 13279, 13281, 13278, 13277, 13279, 13282, 13280, 13279, 13281, 13285, 13284, 13284, 13286, 13290, 13287, 13286, 13287, 13289, 13286, 13285, 13287, 13290, 13288, 13287, 13289, 13293, 13292, 13292, 13294, 13298, 13295, 13294, 13295, 13297, 13294, 13293, 13295, 13298, 13296, 13295, 13297, 13301, 13300, 13300, 13302, 13306, 13303, 13302, 13303, 13305, 13302, 13301, 13303, 13306, 13304, 13303, 13305, 13309, 13308, 13308, 13310, 13314, 13311, 13310, 13310, 13313, 13310, 13309, 13311, 13314, 13312, 13311, 13313, 13317, 13315, 13316, 13318, 13322, 13319, 13318, 13318, 13321, 13318, 13317, 13319, 13322, 13320, 13319, 13321, 13325, 13323, 13324, 13326, 13330, 13327, 13326, 13326, 13329, 13326, 13325, 13327, 13330, 13328, 13327, 13329, 13333, 13331, 13332, 13334, 13338, 13335, 13334, 13334, 13337, 13334, 13333, 13335, 13338, 13336, 13335, 13337, 13341, 13339, 13340, 13342, 13346, 13343, 13342, 13342, 13345, 13342, 13341, 13343, 13346, 13344, 13343, 13345, 13349, 13347, 13348, 13350, 13354, 13351, 13350, 13350, 13353, 13350, 13349, 13351, 13354, 13352, 13351, 13353, 13357, 13355, 13356, 13358, 13362, 13359, 13358, 13358, 13361, 13358, 13357, 13359, 13362, 13360, 13359, 13361, 13365, 13363, 13364, 13366, 13370, 13367, 13366, 13366, 13369, 13366, 13365, 13367, 13370, 13368, 13367, 13369, 13373, 13371, 13372, 13374, 13378, 13375, 13374, 13374, 13377, 13374, 13373, 13375, 13378, 13376, 13375, 13377, 13381, 13379, 13380, 13382, 13386, 13383, 13382, 13382, 13385, 13382, 13381, 13382, 13386, 13383, 13383, 13385, 13389, 13387, 13388, 13390, 13394, 13391, 13390, 13390, 13393, 13390, 13389, 13390, 13394, 13391, 13391, 13393, 13397, 13395, 13396, 13398, 13402, 13399, 13398, 13398, 13401, 13398, 13397, 13398, 13402, 13399, 13399, 13401, 13405, 13403, 13404, 13406, 13410, 13407, 13406, 13406, 13409, 13406, 13405, 13407, 13410, 13408, 13407, 13409, 13413, 13411, 13412, 13414, 13417, 13415, 13414, 13414, 13417, 13414, 13413, 13414, 13418, 13415, 13415, 13417, 13421, 13419, 13420, 13422, 13425, 13423, 13422, 13423, 13425, 13422, 13422, 13423, 13426, 13424, 13424, 13426, 13429, 13428, 13428, 13430, 13433, 13431, 13429, 13430, 13432, 13429, 13427, 13428, 13431, 13429, 13428, 13430, 13433, 13432, 13432, 13434, 13437, 13435, 13434, 13435, 13437, 13435, 13434, 13436, 13439, 13437, 13437, 13439, 13443, 13442, 13443, 13446, 13449, 13447, 13446, 13447, 13450, 13447, 13446, 13448, 13451, 13449, 13448, 13450, 13454, 13452, 13452, 13454, 13457, 13455, 13453, 13453, 13455, 13452, 13451, 13452, 13455, 13453, 13452, 13454, 13457, 13456, 13456, 13458, 13461, 13459, 13458, 13459, 13461, 13459, 13458, 13460, 13463, 13461, 13461, 13463, 13467, 13466, 13467, 13470, 13473, 13471, 13470, 13471, 13474, 13471, 13470, 13472, 13475, 13473, 13472, 13474, 13478, 13476, 13476, 13478, 13481, 13479, 13477, 13477, 13479, 13476, 13475, 13476, 13479, 13476, 13476, 13477, 13481, 13480, 13480, 13482, 13485, 13483, 13482, 13483, 13486, 13483, 13482, 13484, 13488, 13486, 13486, 13488, 13492, 13491, 13491, 13494, 13497, 13495, 13494, 13494, 13496, 13493, 13492, 13493, 13496, 13494, 13493, 13495, 13498, 13496, 13496, 13498, 13501, 13499, 13497, 13498, 13500, 13497, 13496, 13497, 13500, 13498, 13498, 13500, 13504, 13503, 13503, 13506, 13509, 13507, 13506, 13507, 13510, 13508, 13507, 13509, 13512, 13510, 13510, 13512, 13516, 13515, 13516, 13518, 13521, 13519, 13518, 13518, 13520, 13517, 13516, 13517, 13520, 13518, 13517, 13518, 13522, 13520, 13520, 13522, 13525, 13523, 13521, 13522, 13524, 13521, 13520, 13522, 13525, 13523, 13522, 13524, 13528, 13527, 13528, 13530, 13533, 13531, 13530, 13530, 13533, 13530, 13529, 13531, 13534, 13532, 13531, 13533, 13537, 13535, 13536, 13538, 13541, 13539, 13538, 13538, 13541, 13538, 13537, 13538, 13542, 13539, 13539, 13541, 13545, 13543, 13544, 13546, 13549, 13547, 13546, 13546, 13549, 13546, 13545, 13546, 13550, 13547, 13547, 13549, 13553, 13551, 13552, 13554, 13557, 13555, 13554, 13554, 13557, 13554, 13553, 13554, 13558, 13555, 13555, 13557, 13561, 13559, 13560, 13562, 13565, 13563, 13562, 13562, 13565, 13562, 13561, 13562, 13566, 13563, 13563, 13565, 13569, 13567, 13568, 13570, 13573, 13571, 13570, 13570, 13573, 13570, 13569, 13570, 13574, 13571, 13571, 13573, 13577, 13575, 13576, 13578, 13581, 13579, 13578, 13578, 13581, 13578, 13577, 13578, 13582, 13579, 13579, 13581, 13585, 13583, 13584, 13586, 13589, 13587, 13586, 13586, 13589, 13586, 13585, 13586, 13590, 13587, 13587, 13589, 13593, 13591, 13592, 13594, 13597, 13595, 13594, 13594, 13597, 13594, 13593, 13594, 13598, 13595, 13595, 13597, 13601, 13599, 13600, 13602, 13605, 13603, 13602, 13602, 13605, 13602, 13601, 13602, 13606, 13603, 13603, 13605, 13609, 13607, 13608, 13610, 13613, 13611, 13610, 13610, 13613, 13610, 13609, 13610, 13613, 13611, 13611, 13613, 13617, 13615, 13616, 13618, 13621, 13619, 13618, 13619, 13621, 13618, 13617, 13619, 13622, 13620, 13619, 13621, 13625, 13624, 13624, 13626, 13629, 13627, 13625, 13626, 13628, 13624, 13623, 13624, 13627, 13625, 13624, 13626, 13629, 13628, 13628, 13630, 13633, 13631, 13630, 13631, 13633, 13630, 13630, 13631, 13635, 13633, 13633, 13635, 13639, 13638, 13639, 13642, 13645, 13643, 13642, 13643, 13646, 13643, 13642, 13643, 13647, 13644, 13644, 13646, 13650, 13648, 13648, 13650, 13653, 13651, 13649, 13649, 13651, 13648, 13647, 13648, 13651, 13648, 13648, 13649, 13653, 13652, 13652, 13654, 13657, 13655, 13654, 13655, 13657, 13655, 13654, 13655, 13659, 13657, 13657, 13659, 13663, 13662, 13663, 13666, 13669, 13667, 13666, 13667, 13669, 13667, 13666, 13667, 13671, 13668, 13668, 13670, 13673, 13672, 13672, 13674, 13677, 13675, 13673, 13674, 13676, 13673, 13671, 13673, 13676, 13673, 13672, 13674, 13678, 13676, 13676, 13678, 13681, 13679, 13677, 13678, 13680, 13677, 13676, 13677, 13681, 13678, 13678, 13680, 13684, 13683, 13683, 13686, 13689, 13687, 13686, 13687, 13690, 13687, 13687, 13689, 13692, 13690, 13690, 13692, 13696, 13695, 13695, 13698, 13701, 13699, 13697, 13698, 13700, 13697, 13696, 13697, 13700, 13698, 13697, 13698, 13702, 13700, 13700, 13702, 13705, 13703, 13701, 13702, 13704, 13701, 13700, 13701, 13704, 13702, 13702, 13704, 13708, 13707, 13707, 13710, 13713, 13711, 13710, 13711, 13714, 13711, 13711, 13713, 13716, 13714, 13714, 13716, 13720, 13719, 13719, 13722, 13725, 13723, 13721, 13722, 13724, 13721, 13720, 13721, 13724, 13721, 13721, 13722, 13726, 13724, 13724, 13726, 13729, 13727, 13725, 13726, 13728, 13725, 13724, 13726, 13729, 13727, 13726, 13728, 13732, 13731, 13731, 13734, 13737, 13735, 13734, 13734, 13737, 13734, 13733, 13734, 13738, 13735, 13735, 13737, 13741, 13739, 13740, 13742, 13745, 13743, 13742, 13742, 13745, 13742, 13741, 13742, 13746, 13743, 13743, 13745, 13749, 13747, 13748, 13750, 13753, 13751, 13750, 13750, 13753, 13750, 13749, 13750, 13754, 13751, 13751, 13753, 13757, 13755, 13756, 13758, 13761, 13759, 13758, 13758, 13761, 13758, 13757, 13758, 13762, 13759, 13759, 13761, 13765, 13763, 13764, 13766, 13769, 13767, 13766, 13766, 13769, 13766, 13765, 13766, 13770, 13767, 13767, 13769, 13773, 13771, 13772, 13774, 13777, 13775, 13774, 13774, 13777, 13774, 13773, 13774, 13778, 13775, 13775, 13777, 13781, 13779, 13780, 13782, 13785, 13783, 13782, 13782, 13785, 13782, 13781, 13782, 13786, 13783, 13783, 13785, 13789, 13787, 13788, 13790, 13793, 13791, 13790, 13790, 13793, 13790, 13789, 13790, 13794, 13791, 13791, 13793, 13797, 13795, 13796, 13798, 13801, 13799, 13798, 13798, 13801, 13798, 13797, 13798, 13802, 13799, 13799, 13801, 13805, 13803, 13804, 13806, 13809, 13807, 13806, 13806, 13809, 13806, 13805, 13806, 13810, 13807, 13807, 13809, 13813, 13811, 13812, 13814, 13817, 13815, 13814, 13814, 13817, 13814, 13813, 13814, 13818, 13815, 13815, 13817, 13821, 13819, 13820, 13822, 13825, 13823, 13822, 13822, 13825, 13822, 13821, 13822, 13826, 13823, 13823, 13825, 13829, 13827, 13828, 13830, 13833, 13831, 13830, 13830, 13833, 13830, 13829, 13830, 13834, 13831, 13831, 13833, 13837, 13835, 13836, 13838, 13841, 13839, 13838, 13838, 13841, 13838, 13837, 13838, 13842, 13839, 13839, 13841, 13845, 13843, 13844, 13846, 13849, 13847, 13846, 13846, 13849, 13846, 13845, 13846, 13850, 13847, 13847, 13849, 13853, 13851, 13852, 13854, 13857, 13855, 13853, 13854, 13857, 13854, 13853, 13854, 13857, 13855, 13855, 13857, 13860, 13859, 13859, 13862, 13865, 13863, 13862, 13862, 13865, 13862, 13861, 13863, 13866, 13864, 13863, 13865, 13869, 13868, 13868, 13870, 13873, 13871, 13869, 13869, 13871, 13868, 13867, 13868, 13871, 13868, 13868, 13869, 13873, 13872, 13872, 13874, 13877, 13875, 13874, 13874, 13877, 13874, 13874, 13875, 13879, 13877, 13877, 13879, 13883, 13882, 13883, 13886, 13889, 13887, 13886, 13887, 13889, 13887, 13886, 13887, 13890, 13888, 13888, 13890, 13893, 13892, 13892, 13894, 13897, 13895, 13893, 13894, 13896, 13893, 13891, 13892, 13895, 13893, 13892, 13894, 13898, 13896, 13896, 13898, 13901, 13899, 13897, 13898, 13900, 13897, 13896, 13897, 13900, 13898, 13898, 13900, 13904, 13903, 13903, 13906, 13909, 13907, 13906, 13907, 13910, 13907, 13907, 13908, 13912, 13910, 13910, 13912, 13916, 13915, 13915, 13918, 13921, 13919, 13917, 13918, 13920, 13917, 13916, 13917, 13920, 13917, 13916, 13918, 13922, 13920, 13920, 13922, 13925, 13923, 13921, 13922, 13924, 13921, 13920, 13922, 13925, 13923, 13922, 13924, 13928, 13927, 13927, 13930, 13933, 13931, 13930, 13930, 13933, 13930, 13929, 13930, 13934, 13931, 13931, 13933, 13937, 13935, 13936, 13938, 13941, 13939, 13937, 13938, 13941, 13938, 13937, 13938, 13941, 13939, 13939, 13941, 13945, 13943, 13943, 13946, 13949, 13947, 13945, 13946, 13949, 13946, 13945, 13946, 13949, 13947, 13947, 13949, 13953, 13951, 13951, 13954, 13957, 13955, 13953, 13954, 13957, 13954, 13953, 13954, 13957, 13955, 13955, 13957, 13961, 13959, 13959, 13962, 13965, 13963, 13961, 13962, 13965, 13962, 13961, 13962, 13965, 13963, 13963, 13965, 13969, 13967, 13967, 13970, 13973, 13971, 13969, 13970, 13972, 13970, 13968, 13970, 13973, 13971, 13970, 13973, 13976, 13975, 13975, 13978, 13981, 13979, 13978, 13978, 13981, 13978, 13977, 13979, 13982, 13980, 13979, 13981, 13985, 13984, 13984, 13986, 13989, 13987, 13985, 13985, 13987, 13984, 13983, 13984, 13987, 13984, 13984, 13985, 13989, 13987, 13988, 13990, 13993, 13991, 13990, 13990, 13993, 13990, 13990, 13991, 13995, 13993, 13993, 13995, 13999, 13998, 13999, 14001, 14005, 14003, 14002, 14003, 14005, 14002, 14002, 14003, 14006, 14004, 14004, 14005, 14009, 14008, 14008, 14010, 14013, 14011, 14009, 14009, 14012, 14008, 14007, 14008, 14011, 14009, 14008, 14010, 14013, 14012, 14012, 14014, 14017, 14015, 14013, 14014, 14016, 14013, 14012, 14013, 14016, 14014, 14014, 14016, 14020, 14019, 14019, 14021, 14025, 14023, 14022, 14023, 14026, 14023, 14023, 14024, 14028, 14026, 14026, 14028, 14032, 14031, 14031, 14034, 14037, 14035, 14033, 14034, 14036, 14033, 14032, 14033, 14036, 14033, 14032, 14034, 14038, 14036, 14036, 14038, 14041, 14039, 14037, 14038, 14040, 14037, 14036, 14037, 14041, 14039, 14038, 14040, 14044, 14043, 14043, 14046, 14049, 14047, 14045, 14046, 14049, 14046, 14045, 14046, 14050, 14047, 14047, 14049, 14053, 14051, 14051, 14054, 14057, 14055, 14053, 14054, 14057, 14054, 14053, 14054, 14057, 14055, 14055, 14057, 14061, 14059, 14059, 14062, 14065, 14063, 14061, 14062, 14065, 14062, 14061, 14062, 14065, 14063, 14063, 14065, 14069, 14067, 14067, 14070, 14073, 14071, 14069, 14070, 14073, 14070, 14069, 14070, 14073, 14071, 14071, 14073, 14077, 14075, 14075, 14078, 14081, 14079, 14077, 14078, 14080, 14077, 14076, 14078, 14081, 14079, 14078, 14080, 14084, 14083, 14083, 14086, 14089, 14087, 14085, 14086, 14089, 14086, 14085, 14086, 14090, 14087, 14087, 14089, 14093, 14091, 14092, 14094, 14097, 14095, 14093, 14094, 14096, 14093, 14091, 14092, 14096, 14093, 14092, 14094, 14098, 14096, 14096, 14098, 14101, 14098, 14097, 14097, 14100, 14097, 14096, 14097, 14100, 14098, 14098, 14100, 14104, 14102, 14103, 14105, 14109, 14107, 14106, 14107, 14110, 14107, 14106, 14108, 14112, 14110, 14110, 14112, 14116, 14115, 14115, 14118, 14121, 14119, 14117, 14118, 14120, 14117, 14116, 14117, 14120, 14117, 14116, 14118, 14122, 14120, 14120, 14122, 14125, 14123, 14121, 14122, 14124, 14121, 14120, 14121, 14125, 14122, 14122, 14124, 14128, 14127, 14127, 14130, 14133, 14131, 14129, 14130, 14133, 14130, 14129, 14130, 14133, 14131, 14131, 14133, 14137, 14135, 14135, 14138, 14141, 14139, 14137, 14138, 14141, 14138, 14137, 14138, 14142, 14139, 14139, 14141, 14145, 14143, 14144, 14146, 14149, 14147, 14145, 14145, 14148, 14144, 14143, 14144, 14148, 14145, 14144, 14146, 14150, 14148, 14148, 14150, 14153, 14150, 14149, 14149, 14152, 14149, 14148, 14149, 14152, 14150, 14150, 14152, 14156, 14154, 14155, 14157, 14161, 14159, 14158, 14159, 14162, 14159, 14158, 14160, 14164, 14162, 14162, 14164, 14168, 14167, 14167, 14170, 14173, 14171, 14169, 14170, 14172, 14169, 14167, 14169, 14172, 14169, 14168, 14170, 14174, 14172, 14172, 14174, 14177, 14174, 14173, 14174, 14176, 14173, 14172, 14173, 14177, 14174, 14174, 14176, 14180, 14179, 14179, 14182, 14185, 14183, 14181, 14182, 14185, 14182, 14181, 14182, 14185, 14183, 14183, 14185, 14188, 14187, 14187, 14190, 14193, 14191, 14189, 14190, 14193, 14190, 14189, 14190, 14194, 14191, 14191, 14193, 14197, 14195, 14196, 14198, 14201, 14198, 14197, 14197, 14200, 14196, 14195, 14196, 14199, 14197, 14196, 14198, 14201, 14200, 14200, 14202, 14205, 14203, 14201, 14202, 14204, 14201, 14200, 14201, 14205, 14203, 14202, 14204, 14208, 14207, 14207, 14210, 14213, 14211, 14209, 14210, 14213, 14210, 14209, 14210, 14213, 14211, 14211, 14213, 14217, 14215, 14215, 14218, 14221, 14219, 14217, 14218, 14220, 14217, 14216, 14218, 14221, 14219, 14218, 14220, 14224, 14223, 14223, 14226, 14229, 14227, 14225, 14226, 14228, 14225, 14224, 14226, 14229, 14227, 14226, 14228, 14232, 14231, 14231, 14234, 14237, 14235, 14233, 14234, 14237, 14234, 14233, 14234, 14238, 14235, 14235, 14237, 14241, 14239, 14240, 14242, 14245, 14242, 14241, 14241, 14244, 14240, 14239, 14240, 14243, 14241, 14240, 14242, 14245, 14244, 14244, 14246, 14249, 14246, 14245, 14246, 14248, 14245, 14244, 14245, 14249, 14247, 14246, 14248, 14252, 14251, 14251, 14254, 14257, 14255, 14253, 14254, 14256, 14253, 14252, 14254, 14257, 14255, 14254, 14256, 14260, 14259, 14259, 14262, 14265, 14263, 14261, 14262, 14265, 14262, 14261, 14262, 14266, 14263, 14263, 14265, 14269, 14267, 14268, 14270, 14273, 14270, 14269, 14269, 14272, 14268, 14267, 14268, 14271, 14269, 14268, 14270, 14273, 14272, 14272, 14274, 14277, 14274, 14273, 14274, 14276, 14273, 14272, 14273, 14277, 14274, 14274, 14276, 14280, 14279, 14279, 14282, 14285, 14283, 14281, 14282, 14285, 14282, 14281, 14282, 14285, 14283, 14283, 14285, 14289, 14287, 14287, 14290, 14293, 14291, 14289, 14290, 14292, 14289, 14288, 14290, 14293, 14291, 14290, 14292, 14296, 14295, 14295, 14298, 14301, 14299, 14297, 14298, 14300, 14297, 14296, 14298, 14301, 14299, 14298, 14300, 14304, 14303, 14303, 14306, 14309, 14307, 14305, 14306, 14309, 14306, 14305, 14306, 14310, 14307, 14307, 14309, 14313, 14311, 14312, 14314, 14317, 14314, 14313, 14313, 14316, 14312, 14311, 14312, 14315, 14313, 14312, 14314, 14317, 14316, 14316, 14318, 14321, 14318, 14317, 14318, 14320, 14317, 14316, 14317, 14321, 14318, 14318, 14320, 14324, 14323, 14323, 14326, 14329, 14327, 14325, 14326, 14328, 14325, 14324, 14326, 14329, 14327, 14326, 14328, 14332, 14331, 14331, 14334, 14337, 14335, 14333, 14334, 14337, 14334, 14333, 14334, 14338, 14335, 14335, 14337, 14341, 14339, 14339, 14342, 14345, 14342, 14341, 14341, 14344, 14340, 14339, 14340, 14343, 14341, 14340, 14342, 14345, 14344, 14344, 14346, 14349, 14346, 14345, 14346, 14348, 14345, 14344, 14345, 14349, 14346, 14346, 14348, 14352, 14351, 14351, 14354, 14357, 14355, 14353, 14354, 14357, 14354, 14353, 14354, 14357, 14355, 14354, 14357, 14361, 14359, 14359, 14362, 14365, 14363, 14361, 14362, 14364, 14361, 14360, 14362, 14365, 14363, 14362, 14364, 14368, 14367, 14367, 14370, 14373, 14371, 14369, 14370, 14373, 14370, 14369, 14370, 14374, 14371, 14371, 14373, 14377, 14375, 14375, 14378, 14381, 14378, 14377, 14377, 14380, 14376, 14375, 14376, 14379, 14377, 14376, 14378, 14381, 14380, 14380, 14382, 14385, 14382, 14381, 14382, 14384, 14381, 14380, 14381, 14385, 14382, 14382, 14384, 14388, 14387, 14387, 14390, 14393, 14391, 14389, 14390, 14392, 14389, 14388, 14390, 14393, 14391, 14390, 14392, 14396, 14395, 14395, 14398, 14401, 14399, 14397, 14398, 14401, 14398, 14397, 14398, 14402, 14399, 14399, 14401, 14405, 14403, 14403, 14406, 14409, 14406, 14405, 14405, 14407, 14404, 14403, 14404, 14407, 14405, 14404, 14406, 14409, 14408, 14408, 14410, 14413, 14410, 14409, 14410, 14412, 14409, 14408, 14409, 14413, 14410, 14410, 14412, 14416, 14415, 14415, 14418, 14421, 14419, 14417, 14418, 14420, 14417, 14416, 14418, 14421, 14419, 14418, 14420, 14424, 14423, 14423, 14426, 14429, 14427, 14425, 14426, 14429, 14426, 14425, 14426, 14430, 14427, 14427, 14429, 14433, 14431, 14431, 14434, 14437, 14434, 14433, 14433, 14436, 14432, 14431, 14432, 14435, 14433, 14432, 14434, 14437, 14436, 14436, 14438, 14441, 14438, 14437, 14438, 14440, 14437, 14436, 14437, 14441, 14438, 14438, 14440, 14444, 14443, 14443, 14445, 14449, 14447, 14445, 14446, 14449, 14446, 14445, 14446, 14450, 14447, 14447, 14449, 14453, 14451, 14451, 14454, 14457, 14454, 14453, 14453, 14455, 14452, 14451, 14452, 14455, 14452, 14452, 14453, 14457, 14456, 14456, 14458, 14461, 14458, 14457, 14458, 14460, 14457, 14456, 14457, 14461, 14458, 14458, 14460, 14464, 14463, 14463, 14466, 14469, 14467, 14465, 14466, 14468, 14465, 14464, 14466, 14469, 14467, 14466, 14468, 14472, 14471, 14471, 14474, 14477, 14475, 14473, 14474, 14477, 14474, 14473, 14474, 14478, 14475, 14475, 14477, 14481, 14479, 14479, 14482, 14485, 14482, 14481, 14481, 14483, 14480, 14478, 14480, 14483, 14480, 14479, 14481, 14485, 14483, 14483, 14486, 14489, 14487, 14485, 14486, 14489, 14486, 14485, 14487, 14491, 14489, 14489, 14491, 14495, 14494, 14495, 14497, 14501, 14499, 14497, 14498, 14500, 14497, 14496, 14497, 14500, 14498, 14497, 14498, 14502, 14500, 14500, 14502, 14505, 14502, 14500, 14501, 14503, 14499, 14498, 14499, 14502, 14499, 14499, 14500, 14504, 14503, 14503, 14505, 14509, 14507, 14506, 14506, 14509, 14507, 14506, 14508, 14511, 14509, 14509, 14511, 14516, 14514, 14515, 14517, 14521, 14519, 14517, 14518, 14520, 14517, 14515, 14517, 14520, 14517, 14516, 14518, 14522, 14520, 14520, 14522, 14525, 14522, 14521, 14521, 14524, 14521, 14520, 14521, 14525, 14522, 14522, 14524, 14528, 14527, 14527, 14529, 14533, 14531, 14529, 14530, 14532, 14529, 14528, 14530, 14533, 14531, 14530, 14532, 14536, 14535, 14535, 14537, 14541, 14539, 14537, 14538, 14541, 14538, 14537, 14538, 14542, 14539, 14539, 14541, 14545, 14543, 14543, 14546, 14549, 14546, 14545, 14545, 14547, 14544, 14543, 14544, 14547, 14544, 14544, 14545, 14549, 14548, 14548, 14550, 14553, 14550, 14549, 14549, 14552, 14549, 14548, 14549, 14553, 14550, 14550, 14552, 14556, 14555, 14555, 14557, 14561, 14559, 14557, 14558, 14561, 14558, 14557, 14558, 14562, 14559, 14559, 14561, 14565, 14563, 14563, 14566, 14569, 14566, 14565, 14565, 14567, 14564, 14563, 14564, 14567, 14564, 14564, 14565, 14569, 14567, 14567, 14570, 14573, 14570, 14569, 14570, 14572, 14569, 14568, 14569, 14573, 14570, 14570, 14572, 14576, 14575, 14575, 14577, 14581, 14579, 14577, 14578, 14580, 14577, 14576, 14578, 14581, 14579, 14578, 14580, 14584, 14583, 14583, 14585, 14589, 14587, 14585, 14586, 14589, 14586, 14585, 14586, 14590, 14587, 14587, 14589, 14593, 14591, 14591, 14594, 14597, 14594, 14593, 14593, 14595, 14592, 14591, 14592, 14595, 14592, 14592, 14593, 14597, 14595, 14596, 14598, 14601, 14598, 14597, 14597, 14600, 14597, 14596, 14597, 14601, 14598, 14598, 14600, 14604, 14603, 14603, 14605, 14609, 14607, 14605, 14606, 14609, 14606, 14605, 14606, 14610, 14607, 14607, 14609, 14613, 14611, 14611, 14614, 14617, 14614, 14613, 14613, 14615, 14612, 14611, 14612, 14615, 14612, 14612, 14613, 14617, 14615, 14615, 14618, 14621, 14618, 14617, 14617, 14620, 14617, 14616, 14617, 14621, 14618, 14618, 14620, 14624, 14623, 14623, 14625, 14629, 14627, 14625, 14626, 14628, 14625, 14624, 14626, 14629, 14627, 14626, 14628, 14632, 14631, 14631, 14633, 14637, 14635, 14633, 14634, 14637, 14634, 14633, 14634, 14638, 14635, 14635, 14637, 14641, 14639, 14639, 14642, 14645, 14642, 14641, 14641, 14643, 14640, 14639, 14640, 14643, 14640, 14640, 14641, 14645, 14643, 14643, 14646, 14649, 14646, 14645, 14645, 14648, 14645, 14644, 14645, 14649, 14646, 14646, 14648, 14652, 14651, 14651, 14653, 14657, 14655, 14653, 14654, 14657, 14654, 14653, 14654, 14658, 14655, 14655, 14657, 14661, 14659, 14659, 14662, 14665, 14662, 14661, 14661, 14663, 14660, 14659, 14660, 14663, 14660, 14660, 14661, 14665, 14663, 14663, 14666, 14669, 14666, 14665, 14665, 14668, 14665, 14664, 14665, 14669, 14666, 14666, 14668, 14672, 14671, 14671, 14673, 14677, 14674, 14673, 14674, 14676, 14673, 14672, 14674, 14677, 14675, 14674, 14676, 14680, 14679, 14679, 14681, 14685, 14683, 14681, 14682, 14685, 14681, 14680, 14682, 14686, 14683, 14683, 14685, 14689, 14687, 14687, 14690, 14693, 14690, 14689, 14689, 14691, 14688, 14687, 14688, 14691, 14688, 14688, 14689, 14693, 14691, 14691, 14694, 14697, 14694, 14693, 14693, 14696, 14693, 14692, 14693, 14697, 14694, 14694, 14696, 14700, 14698, 14699, 14701, 14705, 14703, 14701, 14702, 14705, 14702, 14701, 14702, 14706, 14703, 14703, 14705, 14709, 14707, 14707, 14710, 14713, 14710, 14709, 14709, 14711, 14708, 14707, 14708, 14711, 14708, 14708, 14709, 14713, 14711, 14711, 14714, 14717, 14714, 14713, 14713, 14716, 14713, 14712, 14713, 14717, 14714, 14714, 14716, 14720, 14718, 14719, 14721, 14725, 14723, 14721, 14722, 14725, 14722, 14721, 14722, 14726, 14723, 14723, 14725, 14729, 14727, 14727, 14730, 14733, 14730, 14729, 14729, 14731, 14728, 14727, 14728, 14731, 14728, 14727, 14729, 14733, 14731, 14731, 14734, 14737, 14734, 14733, 14733, 14736, 14733, 14732, 14733, 14737, 14734, 14734, 14736, 14740, 14739, 14739, 14741, 14745, 14742, 14741, 14742, 14744, 14741, 14740, 14742, 14745, 14743, 14742, 14744, 14748, 14747, 14747, 14749, 14753, 14750, 14749, 14750, 14753, 14749, 14748, 14750, 14753, 14751, 14750, 14753, 14757, 14755, 14755, 14758, 14761, 14758, 14757, 14757, 14759, 14756, 14755, 14756, 14759, 14756, 14756, 14757, 14761, 14759, 14759, 14762, 14765, 14762, 14761, 14761, 14764, 14761, 14759, 14761, 14764, 14762, 14762, 14764, 14768, 14766, 14767, 14769, 14773, 14771, 14769, 14770, 14773, 14770, 14769, 14770, 14774, 14771, 14771, 14773, 14777, 14775, 14775, 14778, 14781, 14778, 14777, 14777, 14779, 14776, 14775, 14776, 14779, 14776, 14775, 14777, 14781, 14779, 14779, 14782, 14785, 14782, 14781, 14781, 14784, 14781, 14779, 14781, 14784, 14782, 14782, 14784, 14788, 14786, 14787, 14789, 14793, 14791, 14789, 14790, 14793, 14790, 14789, 14790, 14794, 14791, 14791, 14793, 14797, 14795, 14795, 14798, 14801, 14798, 14797, 14797, 14799, 14796, 14795, 14796, 14799, 14796, 14795, 14797, 14801, 14799, 14799, 14802, 14805, 14802, 14801, 14801, 14804, 14801, 14800, 14801, 14805, 14802, 14802, 14804, 14808, 14807, 14807, 14809, 14813, 14810, 14809, 14810, 14812, 14809, 14808, 14810, 14813, 14811, 14810, 14812, 14816, 14815, 14815, 14817, 14821, 14818, 14817, 14818, 14820, 14817, 14816, 14818, 14821, 14819, 14818, 14821, 14825, 14823, 14823, 14826, 14829, 14826, 14825, 14825, 14827, 14824, 14823, 14824, 14827, 14824, 14823, 14825, 14829, 14827, 14827, 14830, 14833, 14830, 14829, 14829, 14832, 14829, 14827, 14829, 14832, 14830, 14829, 14832, 14836, 14834, 14835, 14837, 14841, 14838, 14837, 14838, 14841, 14838, 14836, 14838, 14842, 14839, 14839, 14841, 14845, 14843, 14843, 14846, 14849, 14846, 14845, 14845, 14847, 14844, 14843, 14844, 14847, 14844, 14843, 14845, 14849, 14847, 14847, 14850, 14853, 14850, 14849, 14849, 14852, 14849, 14847, 14849, 14852, 14850, 14849, 14852, 14856, 14854, 14855, 14857, 14861, 14858, 14857, 14858, 14861, 14858, 14856, 14858, 14862, 14859, 14859, 14861, 14865, 14863, 14863, 14866, 14869, 14866, 14865, 14865, 14867, 14864, 14863, 14864, 14867, 14864, 14863, 14865, 14869, 14867, 14867, 14870, 14873, 14870, 14869, 14869, 14872, 14869, 14868, 14869, 14873, 14870, 14870, 14872, 14876, 14875, 14875, 14877, 14881, 14878, 14877, 14878, 14880, 14877, 14876, 14878, 14881, 14879, 14878, 14880, 14884, 14883, 14883, 14885, 14889, 14886, 14885, 14886, 14888, 14885, 14884, 14886, 14889, 14887, 14886, 14888, 14892, 14891, 14891, 14893, 14897, 14894, 14893, 14893, 14896, 14892, 14891, 14892, 14896, 14893, 14892, 14894, 14898, 14896, 14896, 14898, 14901, 14898, 14896, 14896, 14899, 14895, 14894, 14895, 14898, 14895, 14894, 14896, 14900, 14899, 14899, 14901, 14905, 14903, 14901, 14902, 14905, 14902, 14901, 14903, 14907, 14905, 14905, 14907, 14912, 14910, 14911, 14913, 14917, 14914, 14913, 14913, 14916, 14912, 14911, 14912, 14915, 14913, 14912, 14913, 14917, 14915, 14915, 14918, 14921, 14918, 14917, 14917, 14920, 14917, 14916, 14917, 14921, 14918, 14918, 14920, 14924, 14923, 14923, 14925, 14929, 14926, 14924, 14925, 14927, 14924, 14922, 14923, 14927, 14924, 14923, 14925, 14929, 14927, 14927, 14929, 14933, 14930, 14929, 14930, 14933, 14930, 14929, 14931, 14935, 14933, 14932, 14935, 14939, 14938, 14939, 14941, 14945, 14942, 14941, 14942, 14944, 14941, 14939, 14941, 14944, 14941, 14940, 14942, 14946, 14944, 14944, 14946, 14949, 14946, 14944, 14945, 14947, 14943, 14942, 14943, 14946, 14944, 14943, 14945, 14949, 14947, 14947, 14949, 14953, 14950, 14949, 14949, 14952, 14949, 14948, 14949, 14953, 14950, 14950, 14952, 14956, 14955, 14955, 14957, 14961, 14958, 14957, 14958, 14960, 14957, 14956, 14957, 14961, 14958, 14958, 14960, 14964, 14963, 14963, 14965, 14969, 14966, 14965, 14966, 14968, 14965, 14964, 14966, 14969, 14967, 14966, 14968, 14973, 14971, 14971, 14973, 14977, 14974, 14972, 14973, 14975, 14972, 14970, 14972, 14975, 14972, 14971, 14973, 14977, 14975, 14975, 14978, 14981, 14978, 14977, 14977, 14980, 14977, 14975, 14977, 14981, 14978, 14978, 14980, 14984, 14982, 14983, 14985, 14989, 14986, 14985, 14986, 14988, 14985, 14984, 14985, 14989, 14986, 14986, 14988, 14992, 14991, 14991, 14993, 14997, 14994, 14993, 14994, 14996, 14993, 14992, 14994, 14997, 14995, 14994, 14996, 15001, 14999, 14999, 15001, 15005, 15002, 15000, 15001, 15003, 15000, 14998, 15000, 15003, 15000, 14999, 15001, 15005, 15003, 15003, 15006, 15009, 15006, 15005, 15005, 15008, 15005, 15003, 15005, 15009, 15006, 15006, 15008, 15012, 15010, 15011, 15013, 15017, 15014, 15013, 15014, 15016, 15013, 15012, 15013, 15017, 15014, 15014, 15016, 15020, 15019, 15019, 15021, 15025, 15022, 15021, 15022, 15024, 15021, 15020, 15022, 15025, 15023, 15022, 15024, 15029, 15027, 15027, 15029, 15033, 15030, 15028, 15029, 15031, 15028, 15026, 15028, 15031, 15028, 15027, 15029, 15033, 15031, 15031, 15033, 15037, 15034, 15033, 15033, 15036, 15033, 15031, 15033, 15037, 15034, 15033, 15036, 15040, 15038, 15039, 15041, 15045, 15042, 15041, 15042, 15044, 15041, 15040, 15041, 15045, 15042, 15042, 15044, 15048, 15047, 15047, 15049, 15053, 15050, 15049, 15050, 15052, 15049, 15048, 15050, 15053, 15051, 15050, 15052, 15057, 15055, 15055, 15057, 15061, 15058, 15056, 15057, 15059, 15056, 15054, 15056, 15059, 15056, 15055, 15057, 15061, 15059, 15059, 15061, 15065, 15062, 15061, 15061, 15064, 15061, 15059, 15061, 15065, 15062, 15061, 15064, 15068, 15066, 15067, 15069, 15073, 15070, 15069, 15070, 15072, 15069, 15068, 15069, 15073, 15070, 15070, 15072, 15076, 15075, 15075, 15077, 15081, 15078, 15077, 15078, 15080, 15077, 15076, 15078, 15081, 15079, 15078, 15080, 15084, 15083, 15083, 15085, 15089, 15086, 15084, 15085, 15087, 15084, 15082, 15084, 15087, 15084, 15083, 15085, 15089, 15087, 15087, 15089, 15093, 15090, 15089, 15089, 15092, 15089, 15087, 15089, 15093, 15090, 15089, 15092, 15096, 15094, 15095, 15097, 15101, 15098, 15097, 15098, 15100, 15097, 15096, 15097, 15101, 15098, 15098, 15100, 15104, 15103, 15103, 15105, 15109, 15106, 15105, 15106, 15108, 15105, 15104, 15106, 15109, 15107, 15106, 15108, 15112, 15111, 15111, 15113, 15117, 15114, 15112, 15113, 15115, 15112, 15110, 15112, 15115, 15112, 15111, 15113, 15117, 15115, 15115, 15117, 15121, 15118, 15117, 15117, 15120, 15116, 15115, 15117, 15120, 15118, 15117, 15120, 15124, 15122, 15123, 15125, 15129, 15126, 15125, 15126, 15128, 15125, 15124, 15125, 15129, 15126, 15126, 15128, 15132, 15131, 15131, 15133, 15137, 15134, 15133, 15133, 15136, 15133, 15132, 15133, 15137, 15134, 15134, 15136, 15140, 15138, 15139, 15141, 15145, 15142, 15141, 15142, 15144, 15141, 15140, 15142, 15145, 15143, 15142, 15144, 15148, 15147, 15147, 15149, 15153, 15150, 15148, 15149, 15151, 15148, 15146, 15148, 15151, 15148, 15147, 15149, 15153, 15151, 15151, 15153, 15157, 15154, 15153, 15153, 15156, 15152, 15151, 15153, 15156, 15154, 15153, 15156, 15160, 15158, 15159, 15161, 15165, 15162, 15161, 15162, 15164, 15161, 15160, 15161, 15165, 15162, 15162, 15164, 15168, 15167, 15167, 15169, 15173, 15170, 15169, 15169, 15172, 15169, 15168, 15169, 15173, 15170, 15170, 15172, 15176, 15174, 15175, 15177, 15181, 15178, 15177, 15178, 15180, 15177, 15176, 15178, 15181, 15179, 15178, 15180, 15184, 15183, 15183, 15185, 15189, 15186, 15184, 15185, 15187, 15184, 15182, 15184, 15187, 15184, 15183, 15185, 15189, 15187, 15187, 15189, 15193, 15190, 15189, 15189, 15192, 15188, 15187, 15189, 15192, 15190, 15189, 15192, 15196, 15194, 15195, 15197, 15201, 15198, 15197, 15198, 15200, 15197, 15196, 15197, 15201, 15198, 15198, 15200, 15204, 15203, 15203, 15205, 15209, 15206, 15205, 15205, 15208, 15205, 15204, 15205, 15209, 15206, 15206, 15208, 15212, 15210, 15211, 15213, 15217, 15214, 15213, 15214, 15216, 15213, 15212, 15214, 15217, 15215, 15214, 15216, 15220, 15219, 15219, 15221, 15225, 15222, 15220, 15221, 15223, 15220, 15218, 15220, 15223, 15220, 15219, 15221, 15225, 15223, 15223, 15225, 15229, 15226, 15225, 15225, 15228, 15224, 15223, 15225, 15228, 15226, 15225, 15228, 15232, 15230, 15231, 15233, 15237, 15234, 15233, 15234, 15236, 15233, 15232, 15233, 15237, 15234, 15234, 15236, 15240, 15239, 15239, 15241, 15245, 15242, 15241, 15241, 15244, 15241, 15240, 15241, 15245, 15242, 15242, 15244, 15248, 15246, 15247, 15249, 15253, 15250, 15249, 15250, 15252, 15249, 15248, 15250, 15253, 15251, 15250, 15252, 15256, 15255, 15255, 15257, 15261, 15258, 15256, 15257, 15259, 15256, 15254, 15256, 15259, 15256, 15255, 15257, 15261, 15259, 15259, 15261, 15265, 15262, 15260, 15261, 15264, 15260, 15259, 15261, 15264, 15262, 15261, 15263, 15268, 15266, 15267, 15269, 15273, 15270, 15269, 15270, 15272, 15269, 15268, 15269, 15273, 15270, 15270, 15272, 15276, 15275, 15275, 15277, 15281, 15278, 15277, 15277, 15280, 15277, 15276, 15277, 15281, 15278, 15278, 15280, 15284, 15282, 15283, 15285, 15289, 15286, 15285, 15285, 15288, 15285, 15284, 15285, 15289, 15286, 15286, 15288, 15292, 15290, 15291, 15293, 15297, 15294, 15293, 15294, 15296, 15293, 15292, 15294, 15297, 15295, 15294, 15296, 15300, 15299, 15299, 15301, 15305, 15302, 15300, 15301, 15303, 15300, 15298, 15299, 15303, 15300, 15299, 15301, 15305, 15303, 15303, 15305, 15309, 15306, 15304, 15305, 15308, 15304, 15303, 15305, 15308, 15306, 15305, 15307, 15312, 15310, 15311, 15313, 15317, 15314, 15313, 15314, 15316, 15313, 15312, 15313, 15317, 15314, 15314, 15316, 15320, 15319, 15319, 15321, 15325, 15322, 15321, 15321, 15324, 15321, 15319, 15321, 15325, 15322, 15321, 15324, 15328, 15326, 15327, 15329, 15333, 15330, 15329, 15330, 15332, 15329, 15328, 15330, 15333, 15331, 15330, 15332, 15336, 15335, 15335, 15337, 15341, 15338, 15336, 15337, 15339, 15336, 15334, 15335, 15339, 15336, 15335, 15337, 15341, 15339, 15339, 15341, 15345, 15342, 15340, 15341, 15344, 15340, 15339, 15341, 15344, 15342, 15341, 15343, 15348, 15346, 15347, 15349, 15353, 15350, 15349, 15350, 15352, 15349, 15348, 15349, 15353, 15350, 15350, 15352, 15356, 15355, 15355, 15357, 15361, 15358, 15357, 15357, 15360, 15357, 15355, 15357, 15361, 15358, 15357, 15360, 15364, 15362, 15363, 15365, 15369, 15366, 15365, 15366, 15368, 15365, 15364, 15366, 15369, 15367, 15366, 15368, 15372, 15371, 15371, 15373, 15377, 15374, 15372, 15373, 15375, 15372, 15370, 15371, 15375, 15372, 15371, 15373, 15377, 15375, 15375, 15377, 15381, 15378, 15376, 15377, 15380, 15376, 15375, 15377, 15380, 15378, 15377, 15379, 15384, 15382, 15382, 15385, 15389, 15386, 15385, 15386, 15388, 15385, 15384, 15386, 15389, 15387, 15386, 15388, 15392, 15391, 15391, 15393, 15397, 15394, 15392, 15393, 15395, 15392, 15390, 15391, 15395, 15392, 15391, 15393, 15397, 15395, 15395, 15397, 15401, 15398, 15396, 15397, 15400, 15396, 15395, 15397, 15400, 15398, 15397, 15399, 15404, 15402, 15403, 15405, 15409, 15406, 15405, 15406, 15408, 15405, 15404, 15405, 15409, 15406, 15406, 15408, 15412, 15410, 15411, 15413, 15417, 15414, 15413, 15413, 15416, 15413, 15411, 15413, 15417, 15414, 15413, 15416, 15420, 15418, 15419, 15421, 15425, 15422, 15421, 15422, 15424, 15421, 15420, 15422, 15425, 15423, 15422, 15424, 15428, 15427, 15427, 15429, 15433, 15430, 15428, 15429, 15431, 15428, 15426, 15427, 15431, 15428, 15427, 15429, 15433, 15431, 15431, 15433, 15437, 15434, 15432, 15433, 15436, 15432, 15431, 15433, 15436, 15434, 15433, 15435, 15440, 15438, 15439, 15441, 15445, 15442, 15441, 15441, 15444, 15441, 15440, 15441, 15445, 15442, 15442, 15444, 15448, 15446, 15447, 15449, 15453, 15450, 15449, 15449, 15452, 15449, 15447, 15449, 15453, 15450, 15449, 15452, 15456, 15454, 15455, 15457, 15461, 15458, 15457, 15458, 15460, 15457, 15456, 15458, 15461, 15459, 15458, 15460, 15464, 15463, 15463, 15465, 15469, 15466, 15464, 15465, 15467, 15464, 15462, 15463, 15467, 15464, 15463, 15465, 15469, 15467, 15467, 15469, 15473, 15470, 15468, 15469, 15472, 15468, 15467, 15469, 15472, 15470, 15469, 15471, 15476, 15474, 15475, 15477, 15481, 15478, 15477, 15477, 15480, 15477, 15476, 15477, 15481, 15478, 15478, 15480, 15484, 15482, 15483, 15485, 15489, 15486, 15485, 15486, 15488, 15485, 15484, 15485, 15489, 15487, 15486, 15488, 15492, 15491, 15491, 15493, 15497, 15494, 15492, 15493, 15495, 15492, 15490, 15491, 15495, 15492, 15491, 15493, 15497, 15495, 15495, 15497, 15501, 15498, 15496, 15497, 15500, 15496, 15495, 15497, 15500, 15498, 15497, 15499, 15504, 15502, 15502, 15505, 15509, 15506, 15505, 15505, 15508, 15505, 15504, 15505, 15509, 15506, 15506, 15508, 15512, 15510, 15511, 15513, 15517, 15514, 15513, 15513, 15516, 15513, 15511, 15513, 15517, 15514, 15513, 15516, 15520, 15518, 15519, 15521, 15525, 15522, 15521, 15522, 15524, 15521, 15520, 15521, 15525, 15523, 15522, 15524, 15528, 15527, 15527, 15529, 15533, 15530, 15528, 15529, 15531, 15527, 15526, 15527, 15531, 15528, 15527, 15529, 15533, 15531, 15531, 15533, 15537, 15534, 15532, 15533, 15536, 15533, 15531, 15533, 15537, 15534, 15534, 15536, 15540, 15538, 15539, 15541, 15545, 15542, 15540, 15541, 15543, 15540, 15538, 15539, 15543, 15540, 15539, 15541, 15545, 15543, 15543, 15545, 15549, 15546, 15544, 15545, 15548, 15544, 15543, 15545, 15548, 15546, 15545, 15547, 15552, 15550, 15550, 15553, 15557, 15554, 15553, 15553, 15556, 15553, 15551, 15553, 15557, 15554, 15553, 15556, 15560, 15558, 15559, 15561, 15565, 15562, 15561, 15561, 15564, 15561, 15560, 15561, 15565, 15562, 15562, 15564, 15568, 15567, 15567, 15569, 15573, 15570, 15568, 15569, 15571, 15567, 15566, 15567, 15571, 15568, 15567, 15569, 15573, 15571, 15571, 15573, 15577, 15574, 15572, 15573, 15576, 15572, 15571, 15573, 15576, 15574, 15573, 15575, 15580, 15578, 15578, 15581, 15585, 15582, 15581, 15581, 15584, 15581, 15579, 15581, 15585, 15582, 15581, 15584, 15588, 15586, 15587, 15589, 15593, 15590, 15589, 15589, 15592, 15589, 15588, 15589, 15593, 15590, 15590, 15592, 15596, 15595, 15595, 15597, 15601, 15598, 15596, 15597, 15599, 15595, 15594, 15595, 15599, 15596, 15595, 15597, 15601, 15599, 15599, 15601, 15605, 15602, 15600, 15601, 15604, 15601, 15599, 15601, 15605, 15602, 15601, 15604, 15608, 15606, 15607, 15609, 15613, 15610, 15608, 15609, 15611, 15608, 15606, 15607, 15611, 15608, 15607, 15609, 15613, 15611, 15611, 15613, 15617, 15614, 15612, 15613, 15616, 15612, 15611, 15613, 15616, 15614, 15613, 15615, 15620, 15618, 15618, 15621, 15625, 15622, 15621, 15621, 15624, 15621, 15619, 15621, 15625, 15622, 15621, 15624, 15628, 15626, 15627, 15629, 15633, 15630, 15629, 15629, 15632, 15629, 15628, 15629, 15633, 15630, 15630, 15632, 15636, 15635, 15635, 15637, 15641, 15638, 15636, 15637, 15639, 15635, 15634, 15635, 15639, 15636, 15635, 15637, 15641, 15639, 15639, 15641, 15645, 15642, 15640, 15641, 15644, 15640, 15639, 15641, 15644, 15642, 15641, 15643, 15648, 15646, 15646, 15649, 15653, 15650, 15649, 15649, 15652, 15649, 15647, 15649, 15653, 15650, 15649, 15652, 15656, 15654, 15654, 15657, 15661, 15658, 15657, 15657, 15660, 15657, 15656, 15657, 15661, 15658, 15658, 15660, 15664, 15663, 15663, 15665, 15669, 15666, 15664, 15665, 15667, 15663, 15662, 15663, 15667, 15664, 15663, 15665, 15669, 15667, 15667, 15669, 15673, 15670, 15668, 15669, 15672, 15668, 15667, 15669, 15673, 15670, 15669, 15672, 15676, 15674, 15675, 15677, 15681, 15678, 15676, 15677, 15679, 15676, 15674, 15675, 15679, 15676, 15675, 15677, 15681, 15679, 15679, 15681, 15685, 15682, 15680, 15681, 15684, 15680, 15679, 15681, 15684, 15682, 15681, 15683, 15688, 15686, 15686, 15689, 15693, 15690, 15689, 15689, 15692, 15689, 15687, 15689, 15693, 15690, 15689, 15692, 15696, 15694, 15694, 15697, 15701, 15698, 15697, 15697, 15700, 15697, 15696, 15697, 15701, 15698, 15698, 15700, 15704, 15703, 15703, 15705, 15709, 15706, 15704, 15705, 15707, 15703, 15702, 15703, 15707, 15704, 15703, 15705, 15709, 15707, 15707, 15709, 15713, 15710, 15708, 15709, 15712, 15708, 15707, 15709, 15712, 15710, 15709, 15711, 15716, 15714, 15714, 15717, 15721, 15718, 15717, 15717, 15720, 15717, 15715, 15717, 15721, 15718, 15717, 15720, 15724, 15722, 15722, 15725, 15729, 15726, 15725, 15725, 15728, 15725, 15724, 15725, 15729, 15726, 15726, 15728, 15732, 15731, 15731, 15733, 15737, 15734, 15732, 15733, 15735, 15731, 15730, 15731, 15734, 15732, 15731, 15733, 15737, 15735, 15735, 15737, 15741, 15738, 15736, 15737, 15740, 15736, 15735, 15737, 15741, 15738, 15737, 15740, 15744, 15742, 15743, 15745, 15749, 15746, 15744, 15745, 15747, 15743, 15742, 15743, 15747, 15744, 15743, 15745, 15749, 15747, 15747, 15749, 15753, 15750, 15748, 15749, 15751, 15748, 15747, 15748, 15752, 15749, 15749, 15751, 15756, 15754, 15754, 15757, 15761, 15758, 15757, 15757, 15760, 15757, 15755, 15757, 15761, 15758, 15757, 15759, 15764, 15762, 15762, 15765, 15769, 15766, 15765, 15765, 15768, 15765, 15764, 15765, 15769, 15766, 15766, 15768, 15772, 15771, 15771, 15773, 15777, 15774, 15772, 15773, 15775, 15771, 15770, 15771, 15775, 15772, 15771, 15773, 15777, 15775, 15775, 15777, 15781, 15778, 15776, 15777, 15779, 15776, 15775, 15776, 15780, 15777, 15777, 15779, 15784, 15782, 15782, 15785, 15789, 15786, 15784, 15785, 15788, 15785, 15783, 15785, 15789, 15786, 15785, 15787, 15792, 15790, 15790, 15793, 15797, 15794, 15793, 15793, 15796, 15793, 15792, 15793, 15797, 15794, 15794, 15796, 15800, 15799, 15799, 15801, 15805, 15802, 15800, 15800, 15803, 15799, 15798, 15799, 15802, 15799, 15799, 15801, 15805, 15803, 15803, 15805, 15809, 15806, 15804, 15805, 15808, 15804, 15803, 15805, 15809, 15806, 15805, 15808, 15812, 15810, 15811, 15813, 15817, 15814, 15812, 15813, 15815, 15811, 15810, 15811, 15815, 15812, 15811, 15813, 15817, 15815, 15815, 15817, 15821, 15818, 15816, 15817, 15819, 15816, 15815, 15816, 15820, 15817, 15817, 15819, 15823, 15822, 15822, 15825, 15829, 15826, 15825, 15825, 15828, 15825, 15824, 15825, 15829, 15826, 15826, 15828, 15832, 15831, 15831, 15833, 15837, 15834, 15832, 15832, 15835, 15831, 15830, 15831, 15834, 15831, 15831, 15832, 15837, 15835, 15835, 15837, 15841, 15838, 15836, 15837, 15840, 15836, 15835, 15837, 15841, 15838, 15837, 15840, 15844, 15842, 15843, 15845, 15849, 15846, 15844, 15845, 15847, 15843, 15842, 15843, 15847, 15844, 15843, 15845, 15849, 15847, 15847, 15849, 15853, 15850, 15848, 15849, 15851, 15848, 15847, 15848, 15852, 15849, 15849, 15851, 15856, 15854, 15854, 15857, 15861, 15858, 15856, 15857, 15860, 15856, 15855, 15857, 15861, 15858, 15857, 15859, 15864, 15862, 15862, 15865, 15869, 15866, 15865, 15865, 15868, 15865, 15864, 15865, 15869, 15866, 15866, 15868, 15872, 15870, 15871, 15873, 15877, 15874, 15872, 15873, 15875, 15871, 15870, 15871, 15875, 15872, 15871, 15873, 15877, 15875, 15875, 15877, 15881, 15878, 15876, 15877, 15879, 15876, 15875, 15876, 15880, 15877, 15877, 15879, 15884, 15882, 15882, 15885, 15889, 15886, 15884, 15885, 15888, 15884, 15883, 15885, 15889, 15886, 15885, 15887, 15892, 15890, 15890, 15893, 15897, 15894, 15893, 15893, 15896, 15893, 15892, 15893, 15897, 15894, 15894, 15896, 15900, 15898, 15899, 15901, 15905, 15902, 15900, 15900, 15903, 15899, 15898, 15899, 15902, 15899, 15899, 15900, 15905, 15903, 15903, 15905, 15909, 15906, 15904, 15905, 15908, 15904, 15903, 15905, 15909, 15906, 15905, 15908, 15912, 15910, 15911, 15913, 15917, 15914, 15912, 15913, 15915, 15911, 15910, 15911, 15915, 15912, 15911, 15913, 15917, 15915, 15915, 15917, 15921, 15918, 15916, 15917, 15919, 15916, 15915, 15916, 15920, 15917, 15917, 15919, 15924, 15922, 15922, 15925, 15929, 15926, 15924, 15925, 15928, 15925, 15923, 15925, 15929, 15926, 15925, 15928, 15932, 15930, 15930, 15933, 15937, 15934, 15932, 15933, 15936, 15932, 15931, 15933, 15936, 15934, 15933, 15935, 15940, 15938, 15938, 15941, 15945, 15942, 15941, 15941, 15944, 15941, 15940, 15941, 15945, 15942, 15942, 15944, 15948, 15946, 15947, 15949, 15953, 15950, 15948, 15948, 15951, 15947, 15946, 15947, 15950, 15947, 15946, 15948, 15953, 15951, 15951, 15953, 15957, 15954, 15952, 15953, 15956, 15952, 15951, 15953, 15957, 15954, 15953, 15955, 15960, 15958, 15958, 15961, 15965, 15962, 15960, 15961, 15963, 15959, 15958, 15959, 15963, 15960, 15959, 15961, 15965, 15963, 15963, 15965, 15969, 15966, 15964, 15965, 15967, 15964, 15963, 15964, 15968, 15965, 15965, 15967, 15972, 15970, 15970, 15973, 15977, 15974, 15972, 15973, 15976, 15972, 15971, 15973, 15976, 15974, 15973, 15975, 15980, 15978, 15978, 15981, 15985, 15982, 15980, 15981, 15984, 15981, 15980, 15981, 15985, 15982, 15982, 15984, 15988, 15986, 15987, 15989, 15993, 15990, 15988, 15988, 15991, 15987, 15986, 15987, 15990, 15987, 15987, 15989, 15993, 15991, 15991, 15993, 15997, 15994, 15992, 15993, 15995, 15992, 15991, 15992, 15996, 15993, 15993, 15995, 16000, 15998, 15998, 16001, 16005, 16002, 16000, 16001, 16004, 16000, 15999, 16001, 16004, 16002, 16001, 16003, 16008, 16006, 16006, 16009, 16013, 16010, 16008, 16009, 16012, 16009, 16008, 16009, 16013, 16010, 16010, 16012, 16016, 16014, 16015, 16017, 16021, 16018, 16016, 16016, 16019, 16015, 16014, 16015, 16018, 16015, 16014, 16016, 16021, 16019, 16019, 16021, 16025, 16022, 16020, 16021, 16024, 16020, 16019, 16021, 16024, 16022, 16021, 16023, 16028, 16026, 16026, 16029, 16033, 16030, 16028, 16029, 16031, 16027, 16026, 16027, 16031, 16028, 16027, 16029, 16033, 16031, 16031, 16033, 16037, 16034, 16032, 16033, 16035, 16032, 16031, 16032, 16036, 16033, 16033, 16035, 16039, 16038, 16038, 16041, 16045, 16042, 16040, 16041, 16044, 16040, 16039, 16041, 16044, 16042, 16041, 16043, 16048, 16046, 16046, 16049, 16053, 16050, 16048, 16049, 16052, 16049, 16047, 16049, 16053, 16050, 16050, 16052, 16056, 16054, 16055, 16057, 16061, 16058, 16056, 16056, 16059, 16055, 16054, 16055, 16058, 16055, 16054, 16056, 16061, 16059, 16059, 16061, 16065, 16062, 16060, 16061, 16064, 16060, 16059, 16061, 16064, 16062, 16061, 16063, 16068, 16066, 16066, 16069, 16073, 16070, 16068, 16069, 16071, 16067, 16066, 16067, 16071, 16068, 16067, 16069, 16073, 16071, 16071, 16073, 16077, 16074, 16072, 16073, 16075, 16072, 16071, 16072, 16076, 16073, 16073, 16075, 16079, 16078, 16078, 16081, 16085, 16082, 16080, 16081, 16084, 16080, 16079, 16081, 16085, 16082, 16081, 16083, 16088, 16086, 16086, 16089, 16093, 16090, 16088, 16089, 16092, 16088, 16087, 16089, 16092, 16090, 16089, 16091, 16096, 16094, 16094, 16097, 16101, 16098, 16096, 16097, 16100, 16097, 16095, 16097, 16101, 16098, 16098, 16100, 16104, 16102, 16103, 16105, 16109, 16106, 16104, 16104, 16107, 16103, 16101, 16103, 16106, 16103, 16102, 16104, 16109, 16107, 16107, 16109, 16113, 16110, 16108, 16109, 16112, 16108, 16107, 16109, 16112, 16110, 16109, 16111, 16116, 16114, 16114, 16117, 16121, 16118, 16116, 16116, 16119, 16115, 16114, 16115, 16119, 16116, 16115, 16117, 16121, 16119, 16119, 16121, 16125, 16122, 16120, 16121, 16123, 16120, 16119, 16120, 16124, 16121, 16121, 16123, 16127, 16126, 16126, 16129, 16133, 16130, 16128, 16129, 16132, 16128, 16127, 16129, 16132, 16130, 16129, 16131, 16136, 16134, 16134, 16137, 16141, 16138, 16136, 16137, 16140, 16137, 16135, 16137, 16141, 16138, 16137, 16140, 16144, 16142, 16143, 16145, 16149, 16146, 16144, 16144, 16147, 16143, 16141, 16143, 16146, 16143, 16142, 16144, 16149, 16147, 16147, 16149, 16153, 16150, 16148, 16149, 16152, 16148, 16147, 16149, 16152, 16150, 16149, 16151, 16156, 16154, 16154, 16157, 16161, 16158, 16156, 16156, 16159, 16155, 16154, 16155, 16159, 16155, 16155, 16157, 16161, 16159, 16159, 16161, 16165, 16162, 16160, 16161, 16163, 16160, 16159, 16160, 16164, 16161, 16161, 16163, 16167, 16166, 16166, 16169, 16173, 16170, 16168, 16169, 16172, 16168, 16167, 16169, 16173, 16170, 16169, 16171, 16176, 16174, 16174, 16177, 16181, 16178, 16176, 16177, 16180, 16176, 16175, 16176, 16180, 16177, 16177, 16179, 16184, 16182, 16182, 16185, 16189, 16186, 16184, 16185, 16188, 16185, 16183, 16185, 16189, 16186, 16185, 16188, 16192, 16190, 16191, 16193, 16197, 16194, 16192, 16192, 16195, 16191, 16189, 16191, 16194, 16191, 16190, 16192, 16196, 16195, 16195, 16197, 16201, 16198, 16196, 16197, 16200, 16196, 16195, 16197, 16200, 16198, 16197, 16199, 16204, 16202, 16202, 16205, 16209, 16206, 16204, 16204, 16207, 16203, 16202, 16203, 16207, 16203, 16203, 16204, 16209, 16207, 16207, 16209, 16213, 16210, 16208, 16209, 16211, 16208, 16207, 16208, 16212, 16209, 16209, 16211, 16215, 16214, 16214, 16217, 16221, 16218, 16216, 16217, 16220, 16216, 16215, 16217, 16220, 16218, 16217, 16219, 16224, 16222, 16222, 16225, 16229, 16226, 16224, 16225, 16228, 16225, 16223, 16225, 16229, 16226, 16225, 16228, 16232, 16230, 16230, 16233, 16237, 16234, 16232, 16232, 16235, 16231, 16229, 16231, 16234, 16231, 16230, 16232, 16236, 16235, 16235, 16237, 16241, 16238, 16236, 16237, 16240, 16236, 16235, 16237, 16240, 16238, 16237, 16239, 16244, 16242, 16242, 16245, 16249, 16246, 16244, 16244, 16247, 16243, 16242, 16243, 16247, 16243, 16243, 16244, 16249, 16247, 16247, 16249, 16253, 16250, 16248, 16249, 16251, 16248, 16246, 16248, 16252, 16249, 16249, 16251, 16255, 16254, 16254, 16257, 16261, 16258, 16256, 16257, 16260, 16256, 16255, 16257, 16261, 16258, 16257, 16259, 16264, 16262, 16262, 16265, 16269, 16266, 16264, 16265, 16268, 16264, 16263, 16264, 16268, 16265, 16265, 16267, 16272, 16270, 16270, 16273, 16277, 16274, 16272, 16273, 16276, 16273, 16271, 16273, 16277, 16274, 16273, 16276, 16280, 16278, 16278, 16281, 16285, 16282, 16280, 16280, 16283, 16279, 16277, 16279, 16282, 16279, 16278, 16280, 16284, 16282, 16283, 16285, 16289, 16286, 16284, 16285, 16288, 16284, 16283, 16285, 16288, 16286, 16285, 16287, 16292, 16290, 16290, 16293, 16297, 16294, 16292, 16292, 16295, 16291, 16290, 16291, 16294, 16291, 16290, 16292, 16297, 16295, 16295, 16297, 16301, 16298, 16296, 16297, 16299, 16296, 16294, 16296, 16300, 16297, 16297, 16299, 16303, 16302, 16302, 16305, 16309, 16306, 16304, 16305, 16308, 16304, 16303, 16305, 16308, 16306, 16305, 16307, 16312, 16310, 16310, 16313, 16317, 16314, 16312, 16313, 16316, 16312, 16311, 16313, 16317, 16314, 16313, 16316, 16320, 16318, 16318, 16321, 16325, 16322, 16320, 16320, 16323, 16319, 16317, 16319, 16322, 16319, 16318, 16320, 16324, 16322, 16322, 16325, 16329, 16326, 16324, 16325, 16328, 16324, 16323, 16324, 16328, 16326, 16325, 16327, 16332, 16330, 16330, 16333, 16337, 16334, 16332, 16332, 16335, 16331, 16330, 16331, 16334, 16331, 16330, 16332, 16337, 16335, 16335, 16337, 16341, 16338, 16336, 16337, 16339, 16336, 16334, 16336, 16340, 16337, 16336, 16339, 16343, 16342, 16342, 16345, 16349, 16346, 16344, 16345, 16348, 16344, 16343, 16345, 16349, 16346, 16345, 16347, 16352, 16350, 16350, 16353, 16357, 16354, 16352, 16353, 16355, 16352, 16351, 16352, 16356, 16353, 16353, 16355, 16359, 16358, 16358, 16361, 16365, 16362, 16360, 16361, 16364, 16361, 16360, 16362, 16366, 16363, 16363, 16366, 16370, 16369, 16369, 16372, 16377, 16374, 16373, 16374, 16377, 16374, 16373, 16375, 16379, 16376, 16376, 16379, 16383, 16381, 16381, 16383] + is_save: false + +auto_exposure: + is_enable: true + is_debug: true + center_illuminance: 90 + histogram_skewness: 0.9 + + +color_space_conversion: + conv_standard: 2 + # Bt.709 HD = 1 + # Bt.601/4407 = 2 + is_save: false + + +ldci: + is_enable: false + clip_limit: 1 + wind: 16 + is_save: false + +sharpen: + is_enable: true + sharpen_sigma: 5 + sharpen_strength: 1 + is_save: false + +2d_noise_reduction: + is_enable: false + # nlm + window_size: 21 + patch_size: 9 + wts: 10 + is_save: false + +rgb_conversion: + is_enable: true + is_save: false + +scale: + is_enable: false + is_debug: true + new_width: 1920 + new_height: 1080 + isHardware: true + # Nearest_Neighbor # Bilinear + Algo: "Nearest_Neighbor" + upscale_method: "Nearest_Neighbor" + downscale_method: "Bilinear" + is_save: false + +yuv_conversion_format: + # The conversion wont run if csc is false + is_enable: false + conv_type: '444' + is_save: false + +pre_gamma: + is_enable: false + is_save: false + +tone_mapping: + is_enable: false + is_save: false + +jpeg_conversion: + is_enable: false + is_save: false diff --git a/in_frames/normal/Outdoor1_2592x1536_12bit_RGGB.raw b/in_frames/normal/data/Outdoor1_2592x1536_12bit_RGGB.raw similarity index 100% rename from in_frames/normal/Outdoor1_2592x1536_12bit_RGGB.raw rename to in_frames/normal/data/Outdoor1_2592x1536_12bit_RGGB.raw diff --git a/in_frames/normal/data/Outdoor2_2592x1536_12bit_RGGB-configs.yml b/in_frames/normal/data/Outdoor2_2592x1536_12bit_RGGB-configs.yml new file mode 100644 index 0000000..47f0740 --- /dev/null +++ b/in_frames/normal/data/Outdoor2_2592x1536_12bit_RGGB-configs.yml @@ -0,0 +1,184 @@ +platform: + filename: "Outdoor2_2592x1536_12bit_RGGB.raw" + disable_progress_bar: false + leave_pbar_string: false + render_3a: false + # npy, png or both + save_format: both + +sensor_info: + bayer_pattern: "rggb" + range: 1023 + bit_depth: 12 + width: 2592 + height: 1536 + +crop: + is_enable: false + is_debug: false + new_width: 1280 + new_height: 720 + is_save: false + +dead_pixel_correction: + is_enable: false + dp_threshold: 80 + is_debug: true + is_save: false + +hdr_stitching: + is_enable: false + +black_level_correction: + is_enable: true + r_offset: 200 + gr_offset: 200 + gb_offset: 200 + b_offset: 200 + is_linear: false + r_sat: 4095 + gr_sat: 4095 + gb_sat: 4095 + b_sat: 4095 + is_save: false + +OECF: + is_enable: false + # Make sure the LUT has the right bit range i.e. if image is of 10 bit LUT should be from [0 - (2^10)-1] + # LUT here does nothing to the sensor response i.e. a value of 800 maps to 800 and 2000 maps to 2000 + r_lut: [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2094,2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,2480,2481,2482,2483,2484,2485,2486,2487,2488,2489,2490,2491,2492,2493,2494,2495,2496,2497,2498,2499,2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559,2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574,2575,2576,2577,2578,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2601,2602,2603,2604,2605,2606,2607,2608,2609,2610,2611,2612,2613,2614,2615,2616,2617,2618,2619,2620,2621,2622,2623,2624,2625,2626,2627,2628,2629,2630,2631,2632,2633,2634,2635,2636,2637,2638,2639,2640,2641,2642,2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658,2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,2691,2692,2693,2694,2695,2696,2697,2698,2699,2700,2701,2702,2703,2704,2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2729,2730,2731,2732,2733,2734,2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,2751,2752,2753,2754,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,2766,2767,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2780,2781,2782,2783,2784,2785,2786,2787,2788,2789,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,2810,2811,2812,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2857,2858,2859,2860,2861,2862,2863,2864,2865,2866,2867,2868,2869,2870,2871,2872,2873,2874,2875,2876,2877,2878,2879,2880,2881,2882,2883,2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,2962,2963,2964,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020,3021,3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069,3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3113,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174,3175,3176,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,3188,3189,3190,3191,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,3278,3279,3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295,3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327,3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343,3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,3388,3389,3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405,3406,3407,3408,3409,3410,3411,3412,3413,3414,3415,3416,3417,3418,3419,3420,3421,3422,3423,3424,3425,3426,3427,3428,3429,3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443,3444,3445,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3456,3457,3458,3459,3460,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,3512,3513,3514,3515,3516,3517,3518,3519,3520,3521,3522,3523,3524,3525,3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541,3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557,3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573,3574,3575,3576,3577,3578,3579,3580,3581,3582,3583,3584,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695,3696,3697,3698,3699,3700,3701,3702,3703,3704,3705,3706,3707,3708,3709,3710,3711,3712,3713,3714,3715,3716,3717,3718,3719,3720,3721,3722,3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744,3745,3746,3747,3748,3749,3750,3751,3752,3753,3754,3755,3756,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,3767,3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,3779,3780,3781,3782,3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3802,3803,3804,3805,3806,3807,3808,3809,3810,3811,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,3822,3823,3824,3825,3826,3827,3828,3829,3830,3831,3832,3833,3834,3835,3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847,3848,3849,3850,3851,3852,3853,3854,3855,3856,3857,3858,3859,3860,3861,3862,3863,3864,3865,3866,3867,3868,3869,3870,3871,3872,3873,3874,3875,3876,3877,3878,3879,3880,3881,3882,3883,3884,3885,3886,3887,3888,3889,3890,3891,3892,3893,3894,3895,3896,3897,3898,3899,3900,3901,3902,3903,3904,3905,3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,3940,3941,3942,3943,3944,3945,3946,3947,3948,3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,3978,3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,3992,3993,3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,4056,4057,4058,4059,4060,4061,4062,4063,4064,4065,4066,4067,4068,4069,4070,4071,4072,4073,4074,4075,4076,4077,4078,4079,4080,4081,4082,4083,4084,4085,4086,4087,4088,4089,4090,4091,4092,4093,4094,4095] + is_save: false + +digital_gain: + is_debug: true + is_auto: true + # Array of pre-define Gains + gain_array: [1, 2, 4, 6, 8, 10, 12, 16, 32, 64] + # Index of default gain + current_gain: 0 + ae_feedback: 0 + is_save: false + +lens_shading_correction: + is_enable: false + is_save: false + +bayer_noise_reduction: + is_enable: true + filter_window: 9 + r_std_dev_s: 1 + r_std_dev_r: 0.1 + g_std_dev_s: 1 + g_std_dev_r: 0.08 + b_std_dev_s: 1 + b_std_dev_r: 0.1 + is_save: false + +auto_white_balance: + is_enable: true + is_debug: true + underexposed_percentage: 5 + overexposed_percentage: 5 + algorithm: "norm_2" + # grey_world, norm_2, pca + percentage: 3.5 # pca + +white_balance: + is_enable: true + # is_auto refers to auto white balance module + is_debug: true + is_auto: true + r_gain: 1.768566 + b_gain: 1.641026 + is_save: false + +demosaic: + is_save: false + +color_correction_matrix: + #Row sum to 1 convention + is_enable: true + corrected_red: [ 1.87578, -0.59375, -0.08203125 ] + corrected_green: [ -0.2421875, 1.5078125, -0.265625 ] + corrected_blue: [ -0.0078125, -0.44921875, 1.35703125 ] + is_save: false + +gamma_correction: + is_enable: true + # 8-bit + gamma_lut_8: [0, 5, 9, 13, 17, 22, 25, 29, 33, 37, 40, 44, 47, 50, 54, 57, 60, 63, 66, 69, 72, 75, 78, 80, 83, 85, 88, 90, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113, 115, 117, 118, 120, 122, 123, 125, 126, 128, 129, 131, 132, 134, 135, 136, 138, 139, 140, 141, 142, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 162, 163, 164, 165, 166, 167, 167, 168, 169, 170, 171, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 179, 179, 180, 181, 181, 182, 183, 183, 184, 185, 185, 186, 187, 187, 188, 188, 189, 190, 190, 191, 191, 192, 193, 193, 194, 194, 195, 195, 196, 197, 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 205, 205, 206, 206, 207, 207, 208, 208, 209, 209, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 216, 217, 217, 218, 218, 219, 219, 220, 220, 221, 221, 221, 222, 222, 223, 223, 224, 224, 225, 225, 225, 226, 226, 227, 227, 228, 228, 228, 229, 229, 230, 230, 231, 231, 231, 232, 232, 233, 233, 234, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240, 241, 241, 241, 242, 242, 243, 243, 244, 244, 244, 245, 245, 246, 246, 247, 247, 247, 248, 248, 249, 249, 250, 250, 250, 251, 251, 252, 252, 252, 253, 253, 254, 254, 255] + # 10-bit + gamma_lut_10: [0, 9, 13, 17, 21, 25, 29, 34, 38, 42, 46, 50, 54, 58, 62, 66, 70, 74, 78, 82, 86, 90, 94, 98, 102, 106, 110, 114, 117, 121, 125, 129, 132, 136, 140, 143, 147, 150, 154, 157, 161, 165, 168, 172, 175, 179, 182, 185, 189, 192, 196, 199, 202, 205, 209, 212, 215, 219, 222, 225, 228, 231, 235, 238, 241, 244, 247, 250, 253, 256, 259, 262, 265, 268, 271, 274, 277, 280, 283, 286, 289, 292, 295, 297, 300, 303, 306, 308, 311, 314, 317, 319, 322, 325, 327, 330, 332, 335, 337, 340, 342, 345, 347, 350, 352, 355, 357, 359, 362, 364, 367, 369, 371, 374, 376, 378, 380, 383, 385, 387, 389, 392, 394, 396, 398, 400, 402, 404, 406, 409, 411, 413, 415, 417, 419, 421, 423, 425, 427, 429, 431, 433, 435, 437, 439, 441, 443, 444, 446, 448, 450, 452, 454, 455, 457, 459, 461, 463, 464, 466, 468, 469, 471, 473, 474, 476, 478, 479, 481, 483, 484, 486, 488, 489, 491, 492, 494, 495, 497, 499, 500, 502, 503, 505, 506, 508, 509, 511, 513, 514, 516, 517, 519, 520, 521, 523, 524, 526, 527, 529, 530, 532, 533, 534, 536, 537, 539, 540, 541, 543, 544, 545, 547, 548, 549, 550, 552, 553, 554, 555, 557, 558, 559, 560, 562, 563, 564, 565, 567, 568, 569, 570, 571, 573, 574, 575, 576, 577, 578, 580, 581, 582, 583, 584, 585, 586, 588, 589, 590, 591, 592, 593, 594, 595, 596, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 633, 634, 635, 636, 637, 638, 639, 640, 641, 641, 642, 643, 644, 645, 646, 647, 648, 649, 649, 650, 651, 652, 653, 654, 655, 655, 656, 657, 658, 659, 660, 660, 661, 662, 663, 664, 665, 665, 666, 667, 668, 669, 670, 670, 671, 672, 673, 674, 674, 675, 676, 677, 678, 678, 679, 680, 681, 681, 682, 683, 683, 684, 685, 686, 686, 687, 688, 689, 689, 690, 691, 692, 692, 693, 694, 695, 695, 696, 697, 697, 698, 699, 700, 700, 701, 702, 703, 703, 704, 705, 705, 706, 707, 708, 708, 709, 710, 710, 711, 712, 713, 713, 714, 715, 715, 716, 717, 717, 718, 719, 719, 720, 721, 722, 722, 723, 724, 724, 725, 726, 726, 727, 728, 728, 729, 730, 731, 731, 732, 733, 733, 734, 734, 735, 736, 736, 737, 738, 738, 739, 740, 740, 741, 742, 742, 743, 744, 744, 745, 745, 746, 747, 747, 748, 749, 749, 750, 751, 751, 752, 753, 753, 754, 754, 755, 756, 756, 757, 757, 758, 759, 759, 760, 761, 761, 762, 762, 763, 763, 764, 765, 765, 766, 766, 767, 768, 768, 769, 769, 770, 771, 771, 772, 772, 773, 774, 774, 775, 775, 776, 776, 777, 777, 778, 779, 779, 780, 780, 781, 782, 782, 783, 783, 784, 784, 785, 785, 786, 787, 787, 788, 788, 789, 789, 790, 791, 791, 792, 792, 793, 793, 794, 794, 795, 795, 796, 797, 797, 797, 798, 799, 799, 800, 800, 801, 801, 802, 802, 803, 803, 804, 805, 805, 806, 806, 806, 807, 808, 808, 809, 809, 810, 810, 811, 811, 812, 812, 813, 813, 814, 814, 815, 815, 816, 816, 817, 817, 818, 818, 819, 819, 820, 821, 821, 821, 822, 823, 823, 824, 824, 825, 825, 826, 826, 827, 827, 828, 828, 829, 829, 830, 830, 831, 831, 832, 832, 833, 833, 834, 834, 835, 835, 836, 836, 837, 837, 838, 838, 839, 839, 839, 840, 841, 841, 842, 842, 842, 843, 843, 844, 845, 845, 845, 846, 846, 847, 847, 848, 848, 849, 849, 850, 850, 851, 851, 852, 852, 853, 853, 854, 854, 855, 855, 856, 856, 857, 857, 858, 858, 859, 859, 860, 860, 861, 861, 862, 862, 863, 863, 864, 864, 865, 865, 866, 866, 867, 867, 868, 868, 868, 869, 870, 870, 870, 871, 871, 872, 872, 873, 873, 874, 874, 875, 875, 876, 876, 877, 877, 878, 878, 879, 879, 880, 880, 881, 881, 881, 882, 882, 883, 883, 884, 884, 885, 885, 886, 886, 887, 887, 887, 888, 888, 889, 889, 890, 890, 891, 891, 892, 892, 892, 893, 893, 894, 894, 895, 895, 896, 896, 896, 897, 897, 898, 898, 899, 899, 900, 900, 900, 901, 901, 902, 902, 903, 903, 903, 904, 904, 905, 905, 906, 906, 906, 907, 907, 908, 908, 909, 909, 910, 910, 910, 911, 911, 912, 912, 913, 913, 913, 914, 914, 915, 915, 916, 916, 916, 917, 917, 918, 918, 919, 919, 919, 920, 920, 921, 921, 922, 922, 922, 923, 923, 924, 924, 925, 925, 925, 926, 926, 927, 927, 928, 928, 928, 929, 929, 930, 930, 931, 931, 931, 932, 932, 933, 933, 934, 934, 934, 935, 935, 936, 936, 936, 937, 937, 938, 938, 939, 939, 939, 940, 940, 941, 941, 942, 942, 943, 943, 943, 944, 944, 945, 945, 946, 946, 947, 947, 947, 948, 948, 949, 949, 950, 950, 951, 951, 951, 952, 952, 953, 953, 954, 954, 955, 955, 956, 956, 956, 957, 957, 958, 958, 959, 959, 960, 960, 961, 961, 961, 962, 962, 963, 963, 964, 964, 964, 965, 965, 966, 966, 967, 967, 968, 968, 968, 969, 969, 970, 970, 971, 971, 971, 972, 972, 973, 973, 974, 974, 975, 975, 975, 976, 976, 977, 977, 977, 978, 978, 979, 979, 980, 980, 980, 981, 981, 982, 982, 983, 983, 983, 984, 984, 985, 985, 986, 986, 986, 987, 987, 988, 988, 988, 989, 989, 990, 990, 990, 991, 991, 992, 992, 993, 993, 994, 994, 994, 995, 995, 996, 996, 997, 997, 997, 998, 998, 999, 999, 999, 1000, 1000, 1001, 1001, 1002, 1002, 1002, 1003, 1003, 1004, 1004, 1004, 1005, 1005, 1006, 1006, 1007, 1007, 1007, 1008, 1008, 1009, 1009, 1010, 1010, 1010, 1011, 1011, 1012, 1012, 1013, 1013, 1013, 1014, 1014, 1015, 1015, 1015, 1016, 1016, 1017, 1017, 1018, 1018, 1018, 1019, 1019, 1020, 1020, 1021, 1021, 1021, 1022, 1022, 1023, 1023] + # 12-bit + gamma_lut_12: [0, 11, 21, 30, 37, 42, 46, 50, 53, 57, 61, 65, 70, 74, 78, 82, 86, 90, 94, 98, 102, 106, 110, 114, 118, 122, 126, 131, 135, 139, 143, 147, 151, 155, 159, 163, 167, 171, 175, 179, 183, 187, 191, 195, 199, 203, 207, 212, 216, 220, 224, 228, 232, 236, 240, 245, 249, 253, 257, 261, 265, 269, 273, 277, 281, 285, 289, 293, 297, 301, 305, 309, 313, 317, 321, 326, 330, 334, 338, 342, 346, 350, 354, 358, 362, 365, 369, 373, 377, 381, 385, 390, 394, 398, 401, 405, 409, 413, 417, 421, 425, 429, 432, 436, 440, 443, 447, 451, 455, 458, 462, 466, 470, 473, 477, 481, 485, 488, 492, 496, 500, 503, 507, 511, 515, 519, 522, 526, 530, 533, 537, 540, 544, 547, 551, 555, 559, 562, 566, 569, 573, 576, 580, 584, 588, 591, 595, 598, 602, 605, 609, 612, 616, 619, 622, 626, 630, 633, 637, 641, 645, 648, 652, 655, 659, 662, 665, 669, 673, 676, 680, 683, 687, 690, 693, 696, 700, 703, 707, 711, 715, 718, 721, 724, 728, 731, 734, 738, 742, 745, 749, 752, 756, 759, 762, 765, 769, 772, 775, 779, 783, 786, 789, 792, 796, 799, 802, 805, 809, 812, 815, 818, 822, 825, 828, 832, 836, 839, 842, 845, 849, 852, 855, 858, 862, 865, 868, 871, 875, 878, 881, 884, 888, 890, 893, 896, 900, 903, 906, 910, 914, 917, 920, 923, 926, 929, 932, 935, 939, 942, 945, 948, 952, 954, 957, 960, 964, 967, 970, 973, 977, 979, 982, 985, 989, 992, 995, 998, 1002, 1005, 1007, 1010, 1014, 1016, 1019, 1022, 1026, 1028, 1031, 1034, 1038, 1040, 1043, 1046, 1050, 1052, 1055, 1058, 1062, 1064, 1067, 1070, 1074, 1076, 1079, 1082, 1086, 1088, 1091, 1094, 1098, 1100, 1103, 1106, 1110, 1112, 1115, 1118, 1121, 1123, 1126, 1129, 1133, 1135, 1138, 1141, 1145, 1147, 1150, 1153, 1156, 1158, 1161, 1163, 1167, 1169, 1172, 1175, 1179, 1181, 1184, 1187, 1190, 1192, 1195, 1198, 1201, 1203, 1206, 1209, 1212, 1214, 1217, 1220, 1223, 1225, 1228, 1231, 1234, 1236, 1239, 1242, 1245, 1247, 1250, 1253, 1256, 1258, 1261, 1264, 1267, 1269, 1271, 1274, 1277, 1279, 1282, 1284, 1288, 1290, 1293, 1296, 1299, 1301, 1303, 1306, 1309, 1311, 1314, 1317, 1320, 1322, 1324, 1327, 1330, 1332, 1335, 1338, 1341, 1343, 1345, 1347, 1350, 1352, 1355, 1358, 1360, 1363, 1365, 1367, 1369, 1372, 1375, 1378, 1380, 1383, 1385, 1387, 1389, 1392, 1395, 1397, 1400, 1403, 1405, 1407, 1409, 1412, 1414, 1417, 1419, 1422, 1424, 1427, 1429, 1431, 1434, 1436, 1438, 1441, 1443, 1446, 1448, 1451, 1453, 1456, 1458, 1461, 1463, 1465, 1467, 1469, 1471, 1474, 1476, 1479, 1481, 1484, 1486, 1488, 1491, 1493, 1495, 1497, 1499, 1502, 1504, 1506, 1509, 1511, 1513, 1515, 1518, 1520, 1522, 1524, 1527, 1529, 1531, 1533, 1535, 1538, 1540, 1542, 1544, 1547, 1549, 1551, 1553, 1556, 1558, 1560, 1563, 1565, 1567, 1569, 1571, 1573, 1575, 1577, 1579, 1582, 1584, 1586, 1588, 1590, 1592, 1594, 1596, 1599, 1601, 1603, 1605, 1607, 1609, 1611, 1613, 1616, 1618, 1620, 1622, 1624, 1626, 1628, 1630, 1633, 1635, 1637, 1639, 1641, 1643, 1645, 1647, 1650, 1652, 1654, 1656, 1658, 1660, 1662, 1664, 1666, 1668, 1670, 1672, 1674, 1676, 1678, 1680, 1682, 1684, 1686, 1688, 1691, 1693, 1695, 1697, 1699, 1701, 1703, 1705, 1707, 1709, 1711, 1713, 1715, 1717, 1719, 1721, 1723, 1725, 1727, 1728, 1730, 1732, 1734, 1736, 1738, 1740, 1742, 1744, 1746, 1748, 1750, 1751, 1753, 1755, 1757, 1759, 1761, 1763, 1765, 1767, 1769, 1771, 1773, 1774, 1776, 1778, 1780, 1782, 1784, 1786, 1788, 1789, 1791, 1793, 1795, 1796, 1798, 1800, 1802, 1803, 1805, 1807, 1809, 1811, 1813, 1815, 1817, 1818, 1820, 1822, 1824, 1825, 1827, 1829, 1831, 1832, 1834, 1836, 1838, 1839, 1841, 1843, 1845, 1847, 1849, 1851, 1853, 1854, 1856, 1857, 1858, 1860, 1862, 1864, 1866, 1868, 1870, 1872, 1874, 1875, 1876, 1878, 1880, 1881, 1883, 1885, 1887, 1888, 1890, 1892, 1893, 1895, 1896, 1898, 1900, 1901, 1903, 1905, 1907, 1908, 1910, 1912, 1913, 1915, 1916, 1918, 1920, 1921, 1923, 1925, 1927, 1928, 1930, 1932, 1933, 1935, 1936, 1938, 1940, 1941, 1943, 1945, 1947, 1948, 1949, 1951, 1952, 1954, 1955, 1957, 1959, 1960, 1962, 1964, 1965, 1967, 1968, 1970, 1972, 1973, 1975, 1977, 1978, 1979, 1981, 1982, 1983, 1985, 1987, 1989, 1990, 1992, 1993, 1995, 1997, 1998, 2000, 2002, 2003, 2005, 2006, 2008, 2009, 2011, 2012, 2014, 2015, 2017, 2018, 2020, 2021, 2023, 2024, 2026, 2027, 2029, 2030, 2032, 2033, 2035, 2036, 2038, 2039, 2041, 2042, 2044, 2046, 2047, 2049, 2051, 2052, 2053, 2055, 2056, 2057, 2059, 2061, 2063, 2064, 2066, 2067, 2069, 2070, 2072, 2073, 2075, 2076, 2077, 2079, 2080, 2081, 2083, 2084, 2086, 2087, 2089, 2090, 2092, 2093, 2095, 2096, 2098, 2099, 2101, 2102, 2104, 2105, 2107, 2108, 2110, 2111, 2112, 2114, 2115, 2116, 2117, 2119, 2121, 2122, 2124, 2125, 2127, 2128, 2129, 2130, 2132, 2133, 2135, 2136, 2138, 2139, 2140, 2142, 2143, 2144, 2145, 2147, 2149, 2150, 2152, 2153, 2155, 2156, 2157, 2159, 2160, 2161, 2162, 2163, 2165, 2166, 2168, 2169, 2171, 2172, 2173, 2175, 2176, 2177, 2178, 2179, 2181, 2182, 2184, 2185, 2187, 2188, 2189, 2191, 2192, 2193, 2194, 2195, 2197, 2198, 2199, 2200, 2202, 2203, 2205, 2206, 2208, 2209, 2210, 2212, 2213, 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2222, 2223, 2225, 2226, 2228, 2229, 2230, 2232, 2233, 2234, 2235, 2237, 2238, 2239, 2240, 2241, 2242, 2243, 2244, 2245, 2247, 2248, 2249, 2250, 2252, 2253, 2255, 2256, 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274, 2276, 2277, 2278, 2279, 2281, 2282, 2283, 2284, 2286, 2287, 2288, 2289, 2291, 2292, 2293, 2295, 2296, 2297, 2297, 2299, 2300, 2301, 2302, 2303, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2314, 2315, 2316, 2318, 2319, 2320, 2320, 2322, 2323, 2324, 2325, 2326, 2328, 2329, 2330, 2332, 2333, 2334, 2334, 2336, 2337, 2338, 2339, 2340, 2342, 2343, 2343, 2345, 2346, 2347, 2348, 2349, 2351, 2352, 2353, 2354, 2355, 2356, 2356, 2358, 2359, 2360, 2361, 2362, 2364, 2365, 2365, 2367, 2368, 2369, 2370, 2371, 2373, 2374, 2374, 2376, 2377, 2378, 2379, 2380, 2382, 2383, 2383, 2385, 2386, 2387, 2388, 2389, 2391, 2392, 2393, 2394, 2395, 2396, 2396, 2398, 2399, 2400, 2401, 2402, 2404, 2405, 2406, 2407, 2408, 2409, 2409, 2411, 2412, 2413, 2414, 2415, 2417, 2418, 2419, 2420, 2421, 2422, 2422, 2424, 2425, 2426, 2426, 2428, 2429, 2430, 2430, 2432, 2433, 2434, 2434, 2436, 2437, 2438, 2439, 2440, 2442, 2443, 2444, 2445, 2446, 2447, 2447, 2449, 2450, 2451, 2451, 2453, 2454, 2455, 2455, 2457, 2458, 2459, 2459, 2461, 2462, 2463, 2463, 2465, 2466, 2467, 2468, 2469, 2470, 2470, 2471, 2472, 2473, 2473, 2474, 2476, 2477, 2478, 2478, 2480, 2481, 2482, 2482, 2484, 2485, 2486, 2486, 2488, 2489, 2490, 2490, 2492, 2493, 2494, 2494, 2496, 2497, 2498, 2498, 2500, 2501, 2502, 2502, 2504, 2505, 2505, 2506, 2507, 2508, 2509, 2509, 2511, 2512, 2512, 2513, 2514, 2515, 2515, 2516, 2517, 2519, 2520, 2520, 2522, 2523, 2524, 2524, 2526, 2527, 2528, 2528, 2530, 2531, 2531, 2532, 2533, 2534, 2535, 2535, 2537, 2538, 2538, 2539, 2540, 2541, 2542, 2542, 2544, 2545, 2545, 2546, 2547, 2548, 2548, 2549, 2550, 2552, 2553, 2553, 2555, 2556, 2556, 2557, 2558, 2559, 2560, 2560, 2562, 2563, 2563, 2564, 2565, 2566, 2566, 2567, 2568, 2570, 2571, 2571, 2573, 2574, 2574, 2575, 2576, 2577, 2577, 2578, 2580, 2581, 2581, 2582, 2583, 2584, 2584, 2585, 2586, 2587, 2587, 2588, 2589, 2591, 2592, 2592, 2594, 2595, 2595, 2596, 2597, 2598, 2598, 2599, 2600, 2601, 2602, 2602, 2604, 2605, 2605, 2606, 2607, 2608, 2608, 2609, 2610, 2612, 2613, 2613, 2615, 2616, 2616, 2617, 2618, 2619, 2619, 2620, 2621, 2622, 2622, 2623, 2624, 2625, 2625, 2626, 2627, 2629, 2630, 2630, 2632, 2633, 2633, 2634, 2635, 2636, 2636, 2637, 2638, 2639, 2639, 2640, 2641, 2642, 2642, 2643, 2645, 2646, 2646, 2647, 2648, 2649, 2649, 2650, 2651, 2653, 2653, 2654, 2655, 2656, 2656, 2657, 2658, 2659, 2659, 2660, 2661, 2662, 2662, 2663, 2665, 2666, 2666, 2667, 2668, 2669, 2669, 2670, 2671, 2672, 2672, 2673, 2674, 2675, 2675, 2676, 2677, 2679, 2679, 2680, 2681, 2682, 2682, 2683, 2684, 2685, 2685, 2686, 2687, 2688, 2688, 2689, 2690, 2691, 2691, 2692, 2693, 2695, 2695, 2696, 2697, 2698, 2698, 2699, 2700, 2701, 2701, 2702, 2703, 2704, 2704, 2705, 2706, 2707, 2707, 2708, 2709, 2711, 2711, 2712, 2713, 2714, 2714, 2714, 2715, 2716, 2716, 2717, 2718, 2720, 2720, 2721, 2722, 2723, 2723, 2724, 2725, 2726, 2726, 2727, 2728, 2729, 2729, 2730, 2731, 2732, 2732, 2733, 2734, 2735, 2735, 2736, 2737, 2738, 2738, 2739, 2740, 2741, 2741, 2742, 2743, 2744, 2744, 2745, 2746, 2747, 2747, 2748, 2749, 2750, 2750, 2751, 2752, 2753, 2753, 2754, 2755, 2756, 2756, 2757, 2758, 2759, 2759, 2760, 2761, 2762, 2762, 2763, 2764, 2765, 2765, 2766, 2767, 2768, 2768, 2769, 2770, 2771, 2771, 2772, 2773, 2774, 2774, 2775, 2776, 2777, 2777, 2778, 2779, 2780, 2780, 2780, 2781, 2782, 2782, 2782, 2783, 2785, 2785, 2786, 2788, 2789, 2789, 2789, 2790, 2791, 2791, 2792, 2793, 2794, 2794, 2795, 2796, 2797, 2797, 2798, 2799, 2800, 2800, 2801, 2802, 2803, 2803, 2804, 2805, 2806, 2806, 2807, 2808, 2809, 2809, 2810, 2811, 2812, 2812, 2812, 2813, 2814, 2814, 2814, 2815, 2817, 2817, 2818, 2820, 2821, 2821, 2821, 2822, 2823, 2823, 2824, 2825, 2826, 2826, 2827, 2828, 2829, 2829, 2830, 2831, 2832, 2832, 2833, 2834, 2835, 2835, 2835, 2836, 2837, 2837, 2838, 2839, 2841, 2841, 2841, 2842, 2843, 2843, 2843, 2845, 2846, 2846, 2847, 2848, 2849, 2849, 2850, 2851, 2852, 2852, 2853, 2854, 2855, 2855, 2855, 2856, 2857, 2857, 2858, 2859, 2860, 2860, 2861, 2862, 2863, 2863, 2864, 2865, 2866, 2866, 2866, 2867, 2868, 2868, 2869, 2870, 2871, 2871, 2872, 2873, 2874, 2874, 2875, 2876, 2877, 2877, 2877, 2878, 2879, 2879, 2880, 2881, 2883, 2883, 2883, 2884, 2885, 2885, 2885, 2887, 2888, 2888, 2889, 2890, 2891, 2891, 2892, 2893, 2894, 2894, 2894, 2895, 2896, 2896, 2897, 2898, 2899, 2899, 2900, 2901, 2902, 2902, 2903, 2904, 2905, 2905, 2905, 2906, 2907, 2907, 2907, 2908, 2910, 2910, 2911, 2912, 2913, 2913, 2913, 2914, 2915, 2915, 2915, 2917, 2918, 2918, 2919, 2920, 2921, 2921, 2922, 2923, 2924, 2924, 2924, 2925, 2926, 2926, 2926, 2927, 2928, 2928, 2929, 2930, 2932, 2932, 2932, 2933, 2934, 2934, 2934, 2935, 2936, 2936, 2937, 2938, 2939, 2939, 2940, 2941, 2942, 2942, 2943, 2944, 2945, 2945, 2945, 2946, 2947, 2947, 2947, 2948, 2950, 2950, 2951, 2952, 2953, 2953, 2953, 2954, 2955, 2955, 2956, 2957, 2958, 2958, 2958, 2959, 2960, 2960, 2961, 2962, 2963, 2963, 2963, 2964, 2965, 2965, 2965, 2966, 2968, 2968, 2969, 2970, 2971, 2971, 2971, 2972, 2973, 2973, 2973, 2974, 2976, 2976, 2977, 2978, 2979, 2979, 2979, 2980, 2981, 2981, 2981, 2982, 2983, 2983, 2983, 2984, 2986, 2986, 2987, 2988, 2989, 2989, 2989, 2990, 2991, 2991, 2992, 2993, 2994, 2994, 2994, 2995, 2996, 2996, 2997, 2998, 2999, 2999, 2999, 3000, 3001, 3001, 3002, 3003, 3004, 3004, 3004, 3005, 3006, 3006, 3006, 3007, 3009, 3009, 3010, 3011, 3012, 3012, 3012, 3013, 3014, 3014, 3014, 3015, 3016, 3016, 3017, 3018, 3019, 3019, 3019, 3020, 3021, 3021, 3022, 3023, 3024, 3024, 3024, 3025, 3026, 3026, 3027, 3028, 3029, 3029, 3029, 3030, 3031, 3031, 3031, 3033, 3034, 3034, 3034, 3035, 3036, 3036, 3036, 3037, 3038, 3038, 3038, 3039, 3041, 3041, 3042, 3043, 3044, 3044, 3044, 3045, 3046, 3046, 3046, 3047, 3048, 3048, 3049, 3050, 3051, 3051, 3051, 3052, 3053, 3053, 3053, 3054, 3055, 3055, 3056, 3057, 3058, 3058, 3058, 3059, 3060, 3060, 3060, 3061, 3062, 3062, 3063, 3064, 3065, 3065, 3065, 3066, 3067, 3067, 3067, 3068, 3069, 3069, 3070, 3071, 3072, 3072, 3072, 3073, 3074, 3074, 3074, 3076, 3077, 3077, 3077, 3078, 3079, 3079, 3079, 3080, 3082, 3082, 3082, 3083, 3084, 3084, 3084, 3085, 3086, 3086, 3086, 3088, 3089, 3089, 3089, 3090, 3091, 3091, 3091, 3092, 3093, 3093, 3093, 3095, 3096, 3096, 3096, 3097, 3098, 3098, 3098, 3099, 3100, 3100, 3100, 3102, 3103, 3103, 3103, 3104, 3105, 3105, 3105, 3106, 3107, 3107, 3107, 3108, 3109, 3109, 3109, 3110, 3111, 3111, 3111, 3112, 3114, 3114, 3114, 3115, 3116, 3116, 3116, 3117, 3118, 3118, 3118, 3119, 3121, 3121, 3121, 3122, 3123, 3123, 3123, 3124, 3125, 3125, 3125, 3126, 3128, 3128, 3128, 3129, 3130, 3130, 3130, 3131, 3132, 3132, 3132, 3133, 3134, 3134, 3134, 3135, 3137, 3137, 3137, 3138, 3139, 3139, 3139, 3140, 3141, 3141, 3141, 3142, 3143, 3143, 3143, 3144, 3145, 3145, 3145, 3146, 3148, 3148, 3148, 3149, 3150, 3150, 3150, 3151, 3152, 3152, 3152, 3153, 3155, 3155, 3155, 3156, 3157, 3157, 3157, 3158, 3159, 3159, 3159, 3160, 3161, 3161, 3162, 3163, 3164, 3163, 3163, 3164, 3165, 3165, 3165, 3166, 3168, 3168, 3168, 3169, 3170, 3170, 3170, 3171, 3172, 3172, 3172, 3173, 3175, 3175, 3175, 3176, 3177, 3177, 3177, 3178, 3179, 3179, 3179, 3180, 3181, 3181, 3181, 3182, 3183, 3183, 3183, 3184, 3185, 3185, 3185, 3186, 3188, 3188, 3188, 3189, 3190, 3189, 3189, 3190, 3191, 3191, 3191, 3192, 3194, 3194, 3194, 3195, 3196, 3196, 3196, 3197, 3198, 3198, 3199, 3200, 3201, 3201, 3201, 3201, 3202, 3201, 3202, 3202, 3204, 3204, 3204, 3205, 3207, 3207, 3207, 3208, 3209, 3209, 3209, 3210, 3211, 3211, 3211, 3212, 3213, 3213, 3213, 3214, 3215, 3215, 3215, 3216, 3217, 3217, 3218, 3219, 3220, 3219, 3219, 3220, 3221, 3221, 3221, 3222, 3224, 3224, 3224, 3225, 3226, 3225, 3225, 3226, 3227, 3227, 3227, 3228, 3230, 3230, 3230, 3231, 3232, 3232, 3232, 3233, 3234, 3234, 3234, 3235, 3236, 3236, 3236, 3237, 3238, 3238, 3238, 3239, 3240, 3240, 3240, 3242, 3243, 3243, 3243, 3243, 3244, 3243, 3244, 3244, 3246, 3246, 3247, 3248, 3249, 3248, 3248, 3249, 3250, 3250, 3250, 3251, 3253, 3253, 3253, 3254, 3255, 3255, 3255, 3256, 3257, 3257, 3257, 3258, 3259, 3259, 3259, 3260, 3261, 3261, 3261, 3262, 3263, 3263, 3263, 3264, 3265, 3265, 3265, 3266, 3267, 3267, 3267, 3268, 3269, 3269, 3269, 3270, 3271, 3271, 3271, 3272, 3273, 3273, 3273, 3274, 3275, 3275, 3275, 3276, 3278, 3278, 3278, 3278, 3279, 3278, 3279, 3279, 3281, 3281, 3281, 3282, 3284, 3284, 3284, 3285, 3286, 3285, 3285, 3286, 3287, 3287, 3287, 3288, 3290, 3290, 3290, 3291, 3292, 3291, 3291, 3292, 3293, 3293, 3293, 3294, 3296, 3296, 3296, 3297, 3298, 3298, 3298, 3299, 3300, 3300, 3300, 3301, 3302, 3302, 3302, 3303, 3304, 3304, 3304, 3305, 3306, 3306, 3306, 3307, 3308, 3308, 3308, 3309, 3310, 3310, 3310, 3311, 3312, 3312, 3312, 3313, 3314, 3314, 3314, 3315, 3316, 3316, 3316, 3317, 3318, 3318, 3318, 3319, 3320, 3320, 3320, 3321, 3322, 3322, 3322, 3323, 3324, 3324, 3324, 3325, 3326, 3326, 3326, 3327, 3328, 3328, 3328, 3329, 3330, 3330, 3330, 3331, 3332, 3332, 3332, 3333, 3334, 3334, 3334, 3335, 3336, 3336, 3336, 3337, 3338, 3338, 3338, 3339, 3340, 3340, 3340, 3341, 3342, 3342, 3342, 3343, 3344, 3344, 3344, 3345, 3346, 3346, 3346, 3347, 3348, 3348, 3348, 3349, 3350, 3350, 3350, 3351, 3352, 3352, 3352, 3353, 3354, 3354, 3354, 3355, 3356, 3356, 3356, 3357, 3358, 3357, 3357, 3358, 3359, 3359, 3359, 3360, 3362, 3362, 3362, 3363, 3364, 3363, 3363, 3364, 3365, 3365, 3365, 3366, 3368, 3368, 3368, 3369, 3370, 3369, 3369, 3370, 3371, 3371, 3371, 3372, 3374, 3373, 3373, 3374, 3375, 3374, 3375, 3375, 3377, 3377, 3377, 3378, 3380, 3379, 3379, 3380, 3381, 3380, 3381, 3381, 3383, 3383, 3383, 3384, 3385, 3385, 3385, 3386, 3387, 3387, 3387, 3388, 3389, 3389, 3389, 3390, 3391, 3391, 3391, 3392, 3393, 3393, 3393, 3394, 3395, 3395, 3395, 3396, 3397, 3397, 3397, 3398, 3399, 3399, 3399, 3400, 3401, 3401, 3401, 3402, 3403, 3403, 3403, 3404, 3405, 3405, 3405, 3406, 3407, 3406, 3406, 3407, 3408, 3408, 3408, 3409, 3411, 3411, 3411, 3412, 3413, 3412, 3412, 3413, 3414, 3414, 3414, 3415, 3417, 3417, 3417, 3418, 3419, 3418, 3418, 3419, 3420, 3419, 3420, 3420, 3422, 3422, 3422, 3423, 3425, 3424, 3424, 3425, 3426, 3425, 3425, 3426, 3428, 3428, 3428, 3429, 3431, 3430, 3430, 3431, 3432, 3431, 3432, 3432, 3434, 3434, 3434, 3435, 3436, 3436, 3436, 3437, 3438, 3438, 3438, 3439, 3440, 3440, 3440, 3441, 3442, 3442, 3442, 3443, 3444, 3444, 3444, 3445, 3446, 3446, 3446, 3447, 3448, 3448, 3448, 3449, 3450, 3450, 3450, 3451, 3452, 3452, 3452, 3453, 3454, 3454, 3454, 3455, 3456, 3456, 3456, 3457, 3458, 3458, 3458, 3459, 3460, 3460, 3460, 3461, 3462, 3462, 3462, 3463, 3464, 3463, 3464, 3464, 3466, 3466, 3466, 3467, 3468, 3467, 3467, 3468, 3469, 3469, 3469, 3470, 3472, 3472, 3472, 3473, 3474, 3473, 3473, 3474, 3475, 3474, 3474, 3475, 3477, 3477, 3477, 3478, 3480, 3479, 3479, 3480, 3481, 3480, 3481, 3481, 3483, 3483, 3483, 3484, 3485, 3485, 3485, 3486, 3487, 3487, 3487, 3488, 3489, 3489, 3489, 3490, 3491, 3491, 3491, 3492, 3493, 3492, 3493, 3493, 3495, 3495, 3495, 3496, 3497, 3496, 3496, 3497, 3498, 3498, 3498, 3499, 3501, 3501, 3501, 3502, 3503, 3502, 3502, 3503, 3504, 3503, 3503, 3504, 3506, 3506, 3506, 3507, 3509, 3508, 3508, 3509, 3510, 3509, 3510, 3510, 3512, 3512, 3512, 3513, 3514, 3513, 3514, 3514, 3516, 3515, 3516, 3516, 3518, 3517, 3518, 3518, 3520, 3519, 3520, 3520, 3522, 3522, 3522, 3523, 3524, 3523, 3523, 3524, 3525, 3524, 3524, 3525, 3527, 3527, 3527, 3528, 3530, 3529, 3529, 3530, 3531, 3530, 3531, 3531, 3533, 3532, 3533, 3533, 3535, 3535, 3535, 3536, 3537, 3536, 3536, 3537, 3538, 3537, 3537, 3538, 3540, 3540, 3540, 3541, 3543, 3542, 3542, 3543, 3544, 3543, 3544, 3544, 3546, 3545, 3546, 3546, 3548, 3548, 3548, 3549, 3550, 3549, 3549, 3550, 3551, 3550, 3551, 3551, 3553, 3552, 3553, 3553, 3555, 3554, 3555, 3555, 3557, 3556, 3557, 3557, 3559, 3559, 3559, 3560, 3561, 3560, 3560, 3561, 3562, 3561, 3562, 3562, 3564, 3563, 3564, 3564, 3566, 3566, 3566, 3567, 3568, 3567, 3567, 3568, 3569, 3568, 3569, 3569, 3571, 3570, 3571, 3571, 3573, 3572, 3573, 3573, 3575, 3574, 3575, 3575, 3577, 3577, 3577, 3578, 3579, 3578, 3578, 3579, 3580, 3579, 3580, 3580, 3582, 3581, 3582, 3582, 3584, 3584, 3584, 3585, 3586, 3585, 3585, 3586, 3587, 3586, 3587, 3587, 3589, 3588, 3589, 3589, 3591, 3590, 3591, 3591, 3593, 3593, 3593, 3594, 3595, 3594, 3594, 3595, 3596, 3595, 3596, 3596, 3598, 3597, 3598, 3598, 3600, 3600, 3600, 3601, 3602, 3601, 3601, 3602, 3603, 3602, 3603, 3603, 3605, 3604, 3605, 3605, 3607, 3606, 3607, 3608, 3609, 3608, 3608, 3609, 3610, 3609, 3610, 3610, 3612, 3612, 3612, 3613, 3614, 3613, 3613, 3614, 3615, 3614, 3615, 3615, 3617, 3616, 3617, 3617, 3619, 3619, 3619, 3620, 3621, 3620, 3620, 3621, 3622, 3622, 3622, 3623, 3625, 3624, 3624, 3625, 3626, 3625, 3625, 3625, 3627, 3627, 3627, 3628, 3630, 3629, 3629, 3630, 3631, 3630, 3630, 3631, 3633, 3632, 3633, 3633, 3635, 3634, 3635, 3636, 3637, 3636, 3636, 3637, 3638, 3637, 3637, 3638, 3640, 3640, 3640, 3641, 3642, 3641, 3641, 3642, 3643, 3642, 3643, 3643, 3645, 3644, 3645, 3645, 3647, 3646, 3647, 3648, 3649, 3648, 3648, 3649, 3650, 3649, 3649, 3650, 3652, 3652, 3652, 3653, 3654, 3653, 3653, 3654, 3655, 3654, 3655, 3655, 3657, 3656, 3657, 3657, 3659, 3658, 3659, 3659, 3661, 3660, 3660, 3661, 3662, 3661, 3661, 3662, 3664, 3663, 3664, 3665, 3666, 3665, 3665, 3666, 3667, 3666, 3667, 3667, 3669, 3668, 3669, 3669, 3671, 3670, 3671, 3671, 3673, 3672, 3672, 3673, 3674, 3673, 3673, 3674, 3676, 3675, 3676, 3677, 3678, 3677, 3677, 3678, 3679, 3678, 3678, 3679, 3681, 3680, 3681, 3682, 3683, 3682, 3682, 3683, 3684, 3683, 3683, 3684, 3686, 3685, 3686, 3686, 3688, 3687, 3688, 3688, 3690, 3689, 3689, 3690, 3691, 3690, 3690, 3691, 3693, 3692, 3693, 3694, 3695, 3694, 3694, 3695, 3696, 3695, 3695, 3696, 3698, 3697, 3698, 3699, 3700, 3699, 3699, 3700, 3701, 3700, 3700, 3701, 3703, 3702, 3703, 3703, 3705, 3704, 3705, 3705, 3707, 3706, 3706, 3707, 3708, 3707, 3707, 3708, 3710, 3709, 3710, 3710, 3712, 3711, 3711, 3712, 3713, 3712, 3712, 3713, 3715, 3714, 3715, 3715, 3717, 3716, 3716, 3717, 3718, 3717, 3717, 3718, 3720, 3719, 3720, 3720, 3722, 3721, 3722, 3722, 3724, 3723, 3723, 3724, 3725, 3724, 3724, 3724, 3726, 3726, 3726, 3727, 3729, 3728, 3728, 3729, 3730, 3729, 3730, 3730, 3732, 3731, 3731, 3731, 3733, 3733, 3733, 3734, 3736, 3735, 3735, 3736, 3737, 3736, 3736, 3736, 3738, 3737, 3737, 3738, 3740, 3739, 3740, 3740, 3742, 3741, 3742, 3742, 3744, 3743, 3743, 3744, 3745, 3744, 3744, 3745, 3747, 3746, 3747, 3747, 3749, 3748, 3749, 3749, 3751, 3750, 3750, 3751, 3752, 3751, 3751, 3752, 3754, 3753, 3754, 3754, 3756, 3755, 3756, 3756, 3758, 3757, 3757, 3758, 3759, 3758, 3758, 3759, 3761, 3760, 3761, 3761, 3763, 3762, 3763, 3763, 3765, 3764, 3764, 3765, 3766, 3765, 3765, 3766, 3768, 3767, 3768, 3768, 3770, 3769, 3770, 3770, 3772, 3771, 3771, 3772, 3773, 3772, 3772, 3773, 3775, 3774, 3775, 3775, 3777, 3776, 3777, 3777, 3779, 3778, 3778, 3779, 3780, 3779, 3779, 3780, 3782, 3781, 3782, 3782, 3784, 3783, 3783, 3784, 3786, 3785, 3786, 3786, 3788, 3787, 3787, 3788, 3789, 3788, 3788, 3789, 3791, 3790, 3791, 3791, 3793, 3792, 3792, 3793, 3795, 3794, 3795, 3795, 3797, 3796, 3796, 3797, 3798, 3797, 3797, 3798, 3800, 3799, 3800, 3800, 3802, 3801, 3801, 3802, 3804, 3803, 3804, 3804, 3806, 3805, 3805, 3806, 3807, 3806, 3806, 3807, 3809, 3808, 3809, 3809, 3811, 3810, 3810, 3811, 3813, 3812, 3813, 3813, 3815, 3814, 3814, 3815, 3816, 3815, 3815, 3816, 3818, 3817, 3818, 3818, 3820, 3819, 3820, 3820, 3822, 3821, 3821, 3822, 3824, 3823, 3824, 3824, 3826, 3825, 3825, 3826, 3827, 3826, 3826, 3827, 3829, 3828, 3829, 3829, 3831, 3830, 3830, 3831, 3833, 3832, 3833, 3833, 3835, 3834, 3834, 3835, 3836, 3835, 3835, 3836, 3838, 3837, 3838, 3838, 3840, 3839, 3839, 3840, 3842, 3841, 3842, 3842, 3844, 3843, 3843, 3844, 3845, 3844, 3844, 3845, 3847, 3846, 3847, 3847, 3849, 3848, 3848, 3849, 3850, 3849, 3849, 3850, 3852, 3851, 3852, 3852, 3854, 3853, 3853, 3854, 3856, 3855, 3856, 3856, 3858, 3857, 3857, 3858, 3859, 3858, 3858, 3859, 3861, 3860, 3861, 3861, 3863, 3862, 3862, 3863, 3865, 3864, 3865, 3865, 3867, 3866, 3866, 3867, 3868, 3867, 3867, 3868, 3870, 3869, 3869, 3870, 3872, 3871, 3872, 3872, 3874, 3873, 3873, 3874, 3875, 3874, 3874, 3875, 3877, 3876, 3877, 3877, 3879, 3878, 3878, 3879, 3881, 3880, 3881, 3881, 3883, 3882, 3882, 3882, 3884, 3883, 3883, 3884, 3886, 3885, 3885, 3886, 3887, 3886, 3886, 3887, 3889, 3888, 3888, 3889, 3891, 3890, 3891, 3891, 3893, 3892, 3892, 3892, 3894, 3893, 3893, 3894, 3896, 3895, 3895, 3896, 3898, 3897, 3898, 3898, 3900, 3899, 3899, 3899, 3901, 3900, 3900, 3901, 3903, 3902, 3902, 3903, 3904, 3903, 3903, 3904, 3906, 3905, 3905, 3906, 3908, 3907, 3908, 3908, 3910, 3909, 3909, 3909, 3911, 3910, 3910, 3911, 3913, 3912, 3912, 3913, 3915, 3914, 3915, 3915, 3917, 3916, 3916, 3916, 3918, 3917, 3917, 3918, 3920, 3919, 3919, 3920, 3921, 3920, 3920, 3921, 3923, 3922, 3922, 3923, 3925, 3924, 3925, 3925, 3927, 3926, 3926, 3926, 3928, 3927, 3927, 3928, 3930, 3929, 3929, 3930, 3932, 3931, 3932, 3932, 3934, 3933, 3933, 3933, 3935, 3934, 3934, 3935, 3937, 3936, 3936, 3936, 3938, 3937, 3937, 3938, 3940, 3939, 3939, 3940, 3942, 3941, 3942, 3942, 3944, 3943, 3943, 3943, 3945, 3944, 3944, 3945, 3947, 3946, 3946, 3947, 3949, 3948, 3949, 3949, 3951, 3950, 3950, 3950, 3952, 3951, 3951, 3952, 3954, 3953, 3953, 3953, 3955, 3954, 3954, 3955, 3957, 3956, 3957, 3957, 3959, 3958, 3958, 3958, 3960, 3959, 3959, 3960, 3962, 3961, 3961, 3961, 3963, 3962, 3962, 3963, 3965, 3964, 3964, 3965, 3967, 3966, 3967, 3967, 3969, 3968, 3968, 3968, 3970, 3969, 3969, 3970, 3972, 3971, 3971, 3972, 3974, 3973, 3974, 3974, 3976, 3975, 3975, 3975, 3977, 3976, 3976, 3977, 3979, 3978, 3978, 3978, 3980, 3979, 3979, 3980, 3982, 3981, 3981, 3982, 3984, 3983, 3983, 3984, 3986, 3985, 3986, 3986, 3988, 3987, 3987, 3987, 3989, 3988, 3988, 3989, 3991, 3990, 3990, 3990, 3992, 3991, 3991, 3992, 3994, 3993, 3993, 3994, 3996, 3995, 3995, 3996, 3998, 3997, 3997, 3997, 3999, 3998, 3998, 3999, 4001, 4000, 4000, 4001, 4003, 4002, 4002, 4003, 4005, 4004, 4004, 4004, 4006, 4005, 4005, 4006, 4008, 4007, 4007, 4007, 4009, 4008, 4008, 4009, 4011, 4010, 4010, 4011, 4013, 4012, 4012, 4013, 4015, 4014, 4014, 4014, 4016, 4015, 4015, 4016, 4018, 4017, 4017, 4017, 4019, 4018, 4018, 4019, 4021, 4020, 4020, 4021, 4023, 4022, 4022, 4023, 4025, 4024, 4024, 4025, 4027, 4026, 4026, 4026, 4028, 4027, 4027, 4028, 4030, 4029, 4029, 4029, 4031, 4030, 4030, 4031, 4033, 4032, 4032, 4033, 4035, 4034, 4034, 4035, 4037, 4036, 4036, 4036, 4038, 4037, 4037, 4038, 4040, 4039, 4039, 4039, 4041, 4040, 4040, 4041, 4043, 4042, 4042, 4043, 4045, 4044, 4044, 4045, 4047, 4046, 4046, 4047, 4049, 4048, 4048, 4048, 4050, 4049, 4049, 4050, 4052, 4051, 4051, 4051, 4053, 4052, 4052, 4053, 4055, 4054, 4054, 4055, 4057, 4056, 4056, 4057, 4059, 4058, 4058, 4058, 4060, 4059, 4059, 4060, 4062, 4061, 4061, 4061, 4062, 4062, 4062, 4063, 4064, 4064, 4064, 4065, 4066, 4066, 4066, 4067, 4068, 4068, 4068, 4069, 4070, 4070, 4070, 4070, 4071, 4071, 4071, 4072, 4073, 4073, 4073, 4073, 4074, 4074, 4074, 4075, 4076, 4076, 4076, 4077, 4078, 4078, 4078, 4079, 4080, 4080, 4080, 4080, 4081, 4081, 4081, 4082, 4083, 4083, 4083, 4083, 4084, 4084, 4084, 4085, 4086, 4086, 4086, 4087, 4088, 4088, 4088, 4089, 4090, 4090, 4091, 4092, 4093, 4093, 4094, 4095] + # 14-bit + gamma_lut_14: [0, 11, 22, 32, 43, 53, 64, 74, 83, 93, 102, 110, 119, 127, 134, 141, 148, 154, 160, 165, 170, 174, 178, 182, 186, 190, 193, 196, 199, 202, 205, 209, 212, 215, 219, 223, 227, 231, 235, 239, 244, 248, 252, 257, 262, 266, 271, 275, 280, 284, 288, 293, 297, 301, 305, 309, 313, 317, 321, 325, 329, 332, 336, 340, 344, 348, 352, 356, 360, 364, 368, 372, 376, 380, 384, 388, 392, 396, 400, 404, 408, 412, 416, 420, 424, 427, 431, 435, 439, 443, 447, 451, 455, 459, 464, 468, 472, 476, 480, 484, 489, 493, 497, 501, 506, 510, 514, 519, 523, 527, 531, 536, 540, 544, 548, 552, 556, 560, 564, 568, 572, 576, 580, 584, 588, 592, 596, 600, 604, 608, 612, 616, 620, 623, 627, 631, 636, 639, 643, 647, 652, 656, 660, 664, 668, 672, 676, 680, 684, 688, 692, 696, 700, 704, 708, 712, 716, 720, 724, 728, 732, 736, 739, 743, 747, 751, 755, 759, 763, 767, 771, 775, 779, 783, 787, 792, 796, 800, 804, 808, 813, 817, 821, 825, 830, 834, 838, 842, 847, 851, 855, 860, 864, 868, 872, 876, 880, 884, 887, 891, 896, 899, 903, 907, 912, 915, 919, 924, 928, 932, 936, 940, 944, 948, 953, 957, 961, 966, 970, 974, 979, 983, 987, 991, 996, 1000, 1004, 1008, 1012, 1016, 1020, 1024, 1028, 1032, 1036, 1040, 1044, 1048, 1052, 1056, 1060, 1064, 1067, 1071, 1075, 1079, 1083, 1087, 1091, 1095, 1099, 1103, 1107, 1111, 1115, 1120, 1124, 1128, 1131, 1135, 1140, 1143, 1147, 1151, 1156, 1159, 1163, 1167, 1172, 1175, 1179, 1184, 1188, 1191, 1195, 1199, 1203, 1207, 1211, 1215, 1219, 1223, 1227, 1231, 1235, 1239, 1243, 1247, 1252, 1256, 1260, 1264, 1268, 1272, 1277, 1281, 1285, 1289, 1294, 1298, 1303, 1307, 1311, 1315, 1320, 1324, 1327, 1332, 1336, 1339, 1343, 1347, 1352, 1355, 1359, 1363, 1368, 1371, 1375, 1379, 1384, 1387, 1391, 1395, 1400, 1403, 1407, 1411, 1416, 1420, 1423, 1428, 1432, 1436, 1440, 1444, 1448, 1451, 1455, 1458, 1462, 1465, 1469, 1473, 1477, 1480, 1484, 1488, 1492, 1495, 1499, 1503, 1508, 1511, 1515, 1520, 1524, 1528, 1532, 1537, 1541, 1545, 1549, 1554, 1559, 1563, 1567, 1571, 1576, 1579, 1583, 1587, 1591, 1594, 1598, 1602, 1606, 1609, 1613, 1616, 1621, 1624, 1628, 1632, 1636, 1639, 1643, 1647, 1651, 1655, 1658, 1663, 1667, 1671, 1675, 1679, 1683, 1687, 1691, 1695, 1700, 1703, 1707, 1711, 1715, 1718, 1722, 1726, 1730, 1733, 1737, 1741, 1745, 1748, 1752, 1756, 1760, 1763, 1766, 1770, 1774, 1778, 1781, 1785, 1789, 1792, 1796, 1800, 1804, 1808, 1811, 1815, 1820, 1823, 1827, 1830, 1834, 1838, 1841, 1845, 1849, 1853, 1856, 1860, 1864, 1868, 1871, 1875, 1880, 1883, 1886, 1890, 1894, 1898, 1901, 1905, 1909, 1912, 1916, 1920, 1924, 1928, 1931, 1935, 1940, 1943, 1946, 1950, 1954, 1958, 1961, 1965, 1969, 1972, 1976, 1980, 1984, 1988, 1991, 1995, 2000, 2003, 2006, 2010, 2014, 2017, 2021, 2025, 2029, 2032, 2036, 2040, 2044, 2048, 2051, 2055, 2060, 2063, 2067, 2070, 2074, 2078, 2081, 2085, 2089, 2093, 2096, 2100, 2105, 2108, 2112, 2116, 2120, 2123, 2126, 2129, 2133, 2136, 2139, 2143, 2147, 2150, 2153, 2157, 2161, 2164, 2168, 2171, 2176, 2179, 2182, 2186, 2190, 2193, 2197, 2201, 2205, 2208, 2212, 2216, 2220, 2224, 2227, 2231, 2236, 2239, 2242, 2245, 2249, 2252, 2255, 2259, 2263, 2266, 2269, 2273, 2277, 2280, 2284, 2287, 2292, 2295, 2298, 2302, 2306, 2309, 2313, 2317, 2321, 2324, 2328, 2332, 2336, 2340, 2343, 2347, 2352, 2355, 2358, 2362, 2365, 2368, 2372, 2375, 2379, 2382, 2386, 2389, 2393, 2396, 2400, 2404, 2408, 2410, 2414, 2417, 2421, 2424, 2427, 2431, 2435, 2438, 2441, 2445, 2449, 2452, 2456, 2460, 2464, 2466, 2470, 2473, 2477, 2480, 2483, 2486, 2490, 2493, 2497, 2501, 2505, 2508, 2511, 2515, 2520, 2523, 2526, 2530, 2534, 2537, 2541, 2545, 2549, 2552, 2556, 2560, 2564, 2568, 2571, 2575, 2580, 2583, 2586, 2589, 2593, 2596, 2600, 2603, 2607, 2610, 2613, 2617, 2621, 2624, 2628, 2631, 2636, 2638, 2641, 2645, 2649, 2652, 2655, 2658, 2662, 2665, 2669, 2673, 2677, 2680, 2683, 2687, 2691, 2694, 2698, 2701, 2705, 2708, 2712, 2715, 2719, 2722, 2726, 2729, 2733, 2737, 2740, 2744, 2747, 2750, 2753, 2756, 2760, 2762, 2765, 2768, 2772, 2775, 2778, 2781, 2785, 2788, 2792, 2795, 2799, 2802, 2806, 2810, 2814, 2817, 2820, 2824, 2829, 2832, 2836, 2840, 2844, 2847, 2851, 2855, 2859, 2862, 2865, 2869, 2872, 2875, 2878, 2881, 2885, 2888, 2891, 2894, 2898, 2901, 2904, 2908, 2911, 2914, 2917, 2920, 2924, 2927, 2930, 2934, 2938, 2941, 2944, 2948, 2952, 2956, 2959, 2963, 2967, 2970, 2974, 2977, 2981, 2984, 2987, 2991, 2995, 2998, 3001, 3005, 3009, 3012, 3016, 3019, 3023, 3026, 3029, 3032, 3036, 3038, 3041, 3045, 3048, 3051, 3054, 3058, 3062, 3064, 3068, 3071, 3075, 3078, 3081, 3085, 3089, 3091, 3095, 3098, 3102, 3105, 3109, 3113, 3117, 3120, 3123, 3127, 3131, 3134, 3137, 3140, 3144, 3147, 3150, 3153, 3157, 3160, 3163, 3166, 3170, 3173, 3176, 3179, 3183, 3186, 3189, 3192, 3196, 3198, 3201, 3205, 3208, 3211, 3214, 3218, 3222, 3225, 3228, 3231, 3235, 3238, 3241, 3244, 3247, 3250, 3253, 3256, 3260, 3263, 3266, 3269, 3273, 3276, 3279, 3283, 3287, 3290, 3293, 3297, 3301, 3303, 3306, 3310, 3314, 3317, 3321, 3324, 3329, 3332, 3335, 3339, 3343, 3346, 3349, 3352, 3356, 3359, 3361, 3365, 3369, 3371, 3374, 3378, 3382, 3385, 3388, 3391, 3395, 3398, 3401, 3404, 3408, 3410, 3413, 3416, 3420, 3423, 3426, 3429, 3434, 3436, 3440, 3443, 3447, 3450, 3453, 3456, 3460, 3462, 3465, 3468, 3472, 3475, 3478, 3481, 3486, 3488, 3492, 3495, 3499, 3502, 3505, 3508, 3512, 3514, 3517, 3521, 3525, 3527, 3530, 3534, 3538, 3541, 3544, 3547, 3551, 3554, 3556, 3559, 3562, 3564, 3567, 3570, 3574, 3576, 3579, 3582, 3586, 3589, 3592, 3595, 3599, 3602, 3605, 3608, 3612, 3615, 3618, 3622, 3626, 3629, 3632, 3636, 3641, 3644, 3647, 3651, 3655, 3658, 3660, 3664, 3667, 3669, 3672, 3675, 3679, 3681, 3684, 3687, 3691, 3693, 3696, 3699, 3703, 3706, 3708, 3711, 3715, 3717, 3720, 3724, 3728, 3730, 3733, 3737, 3741, 3744, 3747, 3751, 3755, 3758, 3761, 3764, 3768, 3770, 3773, 3777, 3781, 3783, 3786, 3790, 3794, 3797, 3800, 3803, 3807, 3809, 3812, 3815, 3819, 3821, 3823, 3826, 3830, 3832, 3835, 3838, 3842, 3845, 3848, 3851, 3855, 3858, 3860, 3864, 3867, 3870, 3873, 3876, 3880, 3883, 3886, 3889, 3894, 3896, 3900, 3903, 3907, 3909, 3912, 3915, 3919, 3921, 3923, 3926, 3930, 3932, 3935, 3938, 3942, 3945, 3948, 3951, 3955, 3958, 3960, 3963, 3967, 3970, 3972, 3976, 3980, 3982, 3985, 3989, 3993, 3996, 3999, 4003, 4007, 4010, 4012, 4015, 4019, 4021, 4023, 4027, 4031, 4033, 4035, 4039, 4043, 4045, 4048, 4051, 4055, 4057, 4060, 4063, 4066, 4068, 4071, 4074, 4078, 4080, 4083, 4086, 4090, 4093, 4096, 4099, 4103, 4105, 4108, 4111, 4114, 4116, 4119, 4122, 4126, 4128, 4131, 4134, 4138, 4141, 4144, 4147, 4151, 4153, 4156, 4159, 4162, 4164, 4167, 4170, 4174, 4176, 4179, 4182, 4186, 4189, 4192, 4195, 4199, 4201, 4204, 4207, 4210, 4212, 4215, 4218, 4222, 4224, 4227, 4230, 4234, 4237, 4240, 4243, 4247, 4249, 4252, 4255, 4258, 4260, 4263, 4266, 4270, 4272, 4275, 4278, 4282, 4285, 4288, 4291, 4295, 4297, 4300, 4303, 4306, 4308, 4311, 4314, 4318, 4320, 4323, 4326, 4330, 4333, 4336, 4339, 4343, 4345, 4348, 4351, 4354, 4356, 4359, 4362, 4366, 4368, 4371, 4374, 4378, 4381, 4384, 4387, 4391, 4393, 4396, 4399, 4403, 4405, 4407, 4410, 4414, 4416, 4419, 4423, 4427, 4429, 4432, 4435, 4439, 4441, 4443, 4446, 4449, 4451, 4453, 4456, 4460, 4462, 4464, 4467, 4471, 4473, 4476, 4479, 4483, 4485, 4487, 4490, 4494, 4496, 4498, 4501, 4505, 4507, 4510, 4514, 4518, 4520, 4523, 4527, 4531, 4533, 4536, 4539, 4543, 4544, 4547, 4550, 4554, 4556, 4559, 4563, 4567, 4569, 4572, 4575, 4579, 4581, 4583, 4586, 4590, 4591, 4594, 4597, 4600, 4602, 4604, 4608, 4611, 4614, 4616, 4619, 4623, 4625, 4627, 4630, 4633, 4634, 4637, 4640, 4643, 4645, 4648, 4651, 4655, 4657, 4660, 4663, 4667, 4669, 4671, 4674, 4678, 4680, 4682, 4686, 4690, 4692, 4695, 4698, 4702, 4705, 4708, 4711, 4715, 4717, 4719, 4722, 4726, 4727, 4729, 4733, 4736, 4738, 4740, 4744, 4747, 4749, 4752, 4755, 4759, 4761, 4763, 4766, 4769, 4771, 4773, 4776, 4780, 4781, 4784, 4787, 4791, 4793, 4796, 4799, 4803, 4805, 4807, 4810, 4813, 4815, 4817, 4820, 4824, 4826, 4828, 4831, 4835, 4837, 4840, 4843, 4847, 4849, 4851, 4854, 4857, 4859, 4861, 4864, 4868, 4869, 4872, 4875, 4879, 4881, 4884, 4887, 4891, 4893, 4895, 4898, 4901, 4903, 4905, 4908, 4912, 4913, 4916, 4919, 4923, 4925, 4928, 4931, 4935, 4937, 4939, 4942, 4945, 4947, 4949, 4952, 4956, 4957, 4960, 4963, 4967, 4969, 4972, 4975, 4979, 4981, 4983, 4986, 4989, 4990, 4993, 4996, 5000, 5001, 5004, 5007, 5011, 5013, 5016, 5019, 5023, 5025, 5027, 5030, 5033, 5035, 5037, 5040, 5044, 5046, 5048, 5051, 5055, 5057, 5060, 5063, 5067, 5068, 5070, 5073, 5076, 5077, 5079, 5082, 5086, 5087, 5089, 5092, 5096, 5098, 5100, 5103, 5107, 5108, 5110, 5113, 5117, 5118, 5120, 5123, 5127, 5129, 5131, 5135, 5139, 5141, 5144, 5147, 5151, 5153, 5155, 5158, 5161, 5163, 5165, 5168, 5172, 5174, 5176, 5180, 5183, 5185, 5188, 5191, 5195, 5196, 5198, 5201, 5204, 5205, 5207, 5210, 5213, 5215, 5217, 5220, 5224, 5226, 5228, 5231, 5235, 5237, 5239, 5241, 5245, 5246, 5249, 5252, 5256, 5257, 5260, 5263, 5267, 5269, 5272, 5275, 5279, 5280, 5282, 5285, 5288, 5289, 5291, 5294, 5297, 5299, 5301, 5304, 5308, 5309, 5312, 5315, 5319, 5321, 5323, 5326, 5329, 5331, 5333, 5336, 5340, 5342, 5344, 5347, 5351, 5353, 5356, 5359, 5363, 5364, 5366, 5368, 5371, 5372, 5374, 5376, 5379, 5380, 5382, 5385, 5389, 5390, 5392, 5395, 5399, 5400, 5402, 5405, 5409, 5410, 5412, 5416, 5419, 5421, 5424, 5427, 5431, 5433, 5436, 5439, 5443, 5444, 5446, 5448, 5451, 5452, 5454, 5456, 5459, 5461, 5462, 5465, 5469, 5470, 5472, 5475, 5479, 5480, 5482, 5485, 5489, 5490, 5492, 5495, 5499, 5501, 5504, 5507, 5511, 5513, 5516, 5519, 5523, 5524, 5526, 5528, 5531, 5532, 5534, 5536, 5539, 5540, 5542, 5545, 5549, 5550, 5552, 5555, 5559, 5560, 5562, 5565, 5568, 5570, 5572, 5575, 5579, 5581, 5583, 5587, 5591, 5593, 5596, 5599, 5603, 5604, 5606, 5608, 5611, 5612, 5614, 5617, 5620, 5621, 5623, 5626, 5629, 5630, 5633, 5635, 5639, 5640, 5642, 5644, 5647, 5648, 5650, 5653, 5657, 5658, 5660, 5663, 5667, 5669, 5672, 5675, 5679, 5680, 5682, 5685, 5688, 5689, 5691, 5694, 5698, 5699, 5701, 5704, 5708, 5710, 5712, 5715, 5719, 5720, 5721, 5724, 5727, 5728, 5729, 5732, 5735, 5736, 5738, 5741, 5745, 5746, 5748, 5751, 5755, 5756, 5758, 5760, 5763, 5764, 5766, 5769, 5773, 5774, 5776, 5779, 5783, 5785, 5788, 5791, 5795, 5796, 5798, 5801, 5804, 5805, 5807, 5810, 5814, 5815, 5817, 5820, 5824, 5826, 5828, 5831, 5835, 5836, 5838, 5840, 5843, 5844, 5846, 5848, 5852, 5853, 5855, 5857, 5861, 5862, 5864, 5867, 5871, 5872, 5873, 5875, 5878, 5879, 5881, 5883, 5887, 5888, 5890, 5893, 5896, 5898, 5900, 5903, 5907, 5908, 5910, 5912, 5916, 5917, 5919, 5922, 5925, 5927, 5929, 5932, 5936, 5938, 5940, 5943, 5947, 5948, 5950, 5952, 5955, 5956, 5958, 5960, 5964, 5965, 5966, 5969, 5973, 5974, 5976, 5979, 5983, 5984, 5985, 5988, 5991, 5991, 5993, 5996, 5999, 6000, 6002, 6005, 6009, 6010, 6012, 6015, 6019, 6020, 6021, 6024, 6027, 6027, 6029, 6032, 6035, 6036, 6038, 6041, 6045, 6046, 6048, 6051, 6055, 6056, 6057, 6060, 6063, 6063, 6065, 6068, 6071, 6072, 6074, 6077, 6081, 6082, 6084, 6087, 6091, 6092, 6093, 6096, 6099, 6099, 6101, 6104, 6107, 6108, 6110, 6113, 6117, 6118, 6120, 6123, 6127, 6128, 6129, 6132, 6135, 6135, 6137, 6140, 6143, 6144, 6146, 6149, 6153, 6154, 6156, 6159, 6163, 6164, 6165, 6168, 6171, 6171, 6173, 6176, 6179, 6180, 6182, 6185, 6189, 6190, 6192, 6195, 6199, 6200, 6201, 6203, 6207, 6207, 6209, 6211, 6215, 6216, 6218, 6221, 6224, 6226, 6228, 6231, 6235, 6236, 6237, 6240, 6243, 6244, 6245, 6248, 6252, 6253, 6254, 6257, 6261, 6262, 6264, 6267, 6271, 6271, 6273, 6275, 6278, 6278, 6279, 6282, 6285, 6286, 6287, 6290, 6293, 6294, 6296, 6299, 6303, 6304, 6305, 6307, 6310, 6311, 6313, 6315, 6319, 6320, 6322, 6325, 6329, 6330, 6332, 6335, 6339, 6339, 6341, 6343, 6346, 6346, 6347, 6350, 6353, 6354, 6355, 6358, 6361, 6363, 6364, 6367, 6371, 6372, 6373, 6375, 6378, 6379, 6381, 6383, 6387, 6388, 6390, 6393, 6397, 6398, 6400, 6403, 6407, 6407, 6409, 6411, 6414, 6414, 6415, 6418, 6421, 6422, 6423, 6426, 6429, 6430, 6432, 6435, 6439, 6440, 6441, 6443, 6446, 6447, 6449, 6451, 6455, 6456, 6458, 6461, 6465, 6466, 6468, 6471, 6475, 6475, 6477, 6479, 6482, 6482, 6483, 6486, 6489, 6490, 6491, 6494, 6497, 6498, 6500, 6503, 6507, 6507, 6509, 6511, 6514, 6515, 6517, 6519, 6523, 6524, 6526, 6529, 6533, 6534, 6536, 6539, 6543, 6543, 6545, 6547, 6550, 6550, 6551, 6554, 6557, 6558, 6559, 6562, 6565, 6566, 6568, 6571, 6575, 6575, 6577, 6579, 6582, 6583, 6584, 6587, 6591, 6592, 6594, 6597, 6600, 6602, 6604, 6607, 6611, 6611, 6613, 6615, 6618, 6618, 6620, 6622, 6625, 6626, 6627, 6630, 6634, 6635, 6637, 6639, 6643, 6643, 6644, 6646, 6649, 6650, 6651, 6653, 6657, 6657, 6659, 6662, 6665, 6666, 6668, 6671, 6675, 6675, 6676, 6679, 6682, 6682, 6683, 6686, 6689, 6690, 6691, 6694, 6698, 6699, 6700, 6703, 6707, 6707, 6708, 6710, 6713, 6713, 6715, 6717, 6720, 6721, 6723, 6725, 6729, 6730, 6732, 6735, 6739, 6739, 6741, 6743, 6746, 6747, 6748, 6751, 6755, 6756, 6758, 6761, 6764, 6766, 6768, 6771, 6775, 6775, 6777, 6779, 6782, 6782, 6783, 6786, 6789, 6790, 6791, 6794, 6798, 6799, 6800, 6803, 6807, 6807, 6808, 6810, 6813, 6814, 6815, 6817, 6821, 6821, 6823, 6826, 6829, 6830, 6832, 6835, 6839, 6839, 6840, 6842, 6845, 6846, 6847, 6849, 6853, 6853, 6855, 6858, 6861, 6862, 6864, 6867, 6871, 6871, 6872, 6875, 6878, 6878, 6879, 6882, 6885, 6886, 6887, 6890, 6894, 6895, 6897, 6899, 6903, 6903, 6904, 6906, 6908, 6908, 6909, 6912, 6915, 6915, 6916, 6919, 6922, 6923, 6925, 6927, 6931, 6931, 6932, 6934, 6937, 6937, 6938, 6941, 6944, 6945, 6946, 6949, 6953, 6954, 6956, 6959, 6963, 6963, 6964, 6967, 6970, 6970, 6971, 6974, 6977, 6978, 6979, 6982, 6986, 6987, 6989, 6991, 6995, 6995, 6996, 6998, 7000, 7000, 7001, 7004, 7007, 7007, 7008, 7011, 7014, 7015, 7017, 7019, 7023, 7023, 7024, 7026, 7029, 7029, 7030, 7033, 7036, 7037, 7038, 7041, 7045, 7046, 7048, 7051, 7055, 7055, 7056, 7059, 7062, 7062, 7063, 7066, 7069, 7070, 7071, 7074, 7078, 7079, 7080, 7083, 7087, 7087, 7088, 7090, 7092, 7092, 7093, 7095, 7099, 7099, 7100, 7103, 7106, 7107, 7108, 7111, 7115, 7115, 7116, 7118, 7121, 7121, 7123, 7125, 7129, 7129, 7131, 7133, 7137, 7138, 7140, 7143, 7147, 7147, 7148, 7150, 7153, 7153, 7154, 7156, 7159, 7159, 7161, 7163, 7166, 7167, 7169, 7171, 7175, 7175, 7176, 7177, 7180, 7180, 7181, 7183, 7187, 7187, 7188, 7191, 7194, 7195, 7197, 7199, 7203, 7203, 7203, 7205, 7208, 7208, 7209, 7211, 7214, 7214, 7216, 7218, 7222, 7223, 7224, 7227, 7231, 7231, 7232, 7234, 7237, 7237, 7239, 7241, 7245, 7245, 7247, 7249, 7253, 7254, 7256, 7259, 7263, 7263, 7264, 7266, 7269, 7269, 7270, 7272, 7275, 7275, 7276, 7279, 7282, 7283, 7285, 7287, 7291, 7291, 7291, 7293, 7296, 7296, 7297, 7299, 7302, 7303, 7304, 7306, 7310, 7311, 7312, 7315, 7319, 7319, 7320, 7321, 7324, 7324, 7325, 7327, 7331, 7331, 7332, 7335, 7338, 7339, 7341, 7343, 7347, 7347, 7347, 7349, 7352, 7352, 7353, 7355, 7358, 7358, 7359, 7362, 7366, 7366, 7368, 7371, 7375, 7375, 7376, 7378, 7381, 7382, 7383, 7385, 7389, 7389, 7391, 7394, 7398, 7399, 7400, 7403, 7407, 7407, 7407, 7409, 7412, 7411, 7412, 7414, 7417, 7417, 7418, 7420, 7423, 7424, 7425, 7427, 7431, 7430, 7431, 7433, 7435, 7435, 7436, 7438, 7441, 7442, 7443, 7446, 7449, 7450, 7452, 7455, 7459, 7459, 7460, 7462, 7465, 7466, 7467, 7470, 7473, 7474, 7475, 7478, 7482, 7483, 7484, 7487, 7491, 7491, 7491, 7493, 7496, 7495, 7496, 7498, 7501, 7501, 7502, 7504, 7507, 7508, 7509, 7511, 7515, 7514, 7515, 7517, 7520, 7519, 7520, 7522, 7526, 7526, 7527, 7530, 7534, 7534, 7536, 7539, 7543, 7543, 7544, 7546, 7548, 7548, 7549, 7552, 7555, 7555, 7556, 7559, 7563, 7563, 7565, 7567, 7571, 7570, 7571, 7573, 7575, 7575, 7575, 7577, 7580, 7580, 7581, 7584, 7587, 7587, 7589, 7591, 7595, 7594, 7595, 7597, 7600, 7599, 7600, 7603, 7606, 7606, 7607, 7610, 7614, 7614, 7616, 7619, 7623, 7623, 7624, 7626, 7628, 7628, 7629, 7632, 7635, 7635, 7636, 7639, 7642, 7643, 7645, 7647, 7651, 7650, 7651, 7653, 7655, 7655, 7655, 7657, 7660, 7660, 7661, 7664, 7667, 7667, 7669, 7671, 7675, 7674, 7675, 7677, 7680, 7679, 7680, 7683, 7686, 7686, 7687, 7690, 7694, 7694, 7696, 7699, 7703, 7703, 7704, 7705, 7708, 7708, 7709, 7712, 7715, 7715, 7716, 7719, 7722, 7723, 7725, 7727, 7731, 7730, 7731, 7732, 7735, 7735, 7735, 7737, 7740, 7740, 7741, 7743, 7747, 7747, 7749, 7751, 7755, 7754, 7755, 7757, 7760, 7760, 7761, 7763, 7766, 7766, 7768, 7770, 7774, 7775, 7776, 7779, 7783, 7782, 7783, 7785, 7787, 7787, 7788, 7790, 7793, 7793, 7794, 7796, 7799, 7800, 7801, 7803, 7807, 7806, 7807, 7808, 7811, 7810, 7811, 7813, 7816, 7816, 7817, 7819, 7822, 7823, 7824, 7827, 7831, 7830, 7831, 7833, 7836, 7836, 7837, 7839, 7843, 7843, 7844, 7847, 7850, 7851, 7852, 7855, 7859, 7858, 7859, 7860, 7863, 7862, 7863, 7865, 7868, 7868, 7869, 7871, 7875, 7875, 7877, 7879, 7883, 7882, 7883, 7885, 7888, 7888, 7889, 7891, 7895, 7895, 7896, 7899, 7902, 7903, 7905, 7907, 7911, 7910, 7910, 7912, 7914, 7913, 7914, 7915, 7918, 7918, 7919, 7921, 7924, 7924, 7925, 7927, 7931, 7930, 7931, 7933, 7935, 7935, 7936, 7938, 7942, 7942, 7943, 7946, 7950, 7951, 7952, 7955, 7959, 7958, 7959, 7961, 7963, 7963, 7963, 7965, 7968, 7968, 7969, 7971, 7975, 7975, 7977, 7979, 7983, 7982, 7983, 7985, 7988, 7987, 7988, 7991, 7994, 7994, 7995, 7998, 8002, 8003, 8004, 8007, 8011, 8010, 8011, 8013, 8015, 8015, 8016, 8018, 8021, 8021, 8021, 8024, 8027, 8027, 8029, 8031, 8035, 8034, 8035, 8036, 8039, 8038, 8039, 8041, 8044, 8044, 8045, 8047, 8051, 8051, 8053, 8055, 8058, 8058, 8059, 8060, 8063, 8062, 8063, 8065, 8068, 8068, 8069, 8071, 8075, 8075, 8077, 8079, 8082, 8082, 8083, 8084, 8087, 8086, 8087, 8089, 8092, 8092, 8093, 8095, 8099, 8099, 8101, 8103, 8106, 8106, 8107, 8108, 8111, 8110, 8111, 8113, 8116, 8116, 8117, 8119, 8123, 8123, 8125, 8127, 8130, 8130, 8131, 8132, 8135, 8134, 8135, 8137, 8140, 8140, 8141, 8143, 8147, 8147, 8149, 8151, 8154, 8154, 8154, 8156, 8158, 8158, 8158, 8160, 8164, 8163, 8164, 8167, 8170, 8171, 8172, 8175, 8178, 8178, 8179, 8181, 8184, 8184, 8185, 8187, 8191, 8191, 8192, 8195, 8198, 8199, 8200, 8203, 8206, 8206, 8206, 8208, 8210, 8209, 8210, 8211, 8214, 8214, 8214, 8216, 8220, 8220, 8221, 8223, 8226, 8226, 8227, 8228, 8231, 8231, 8232, 8234, 8238, 8238, 8239, 8242, 8246, 8246, 8248, 8251, 8254, 8254, 8255, 8257, 8259, 8259, 8259, 8261, 8265, 8264, 8265, 8268, 8271, 8271, 8273, 8275, 8278, 8278, 8279, 8280, 8283, 8282, 8283, 8285, 8288, 8288, 8289, 8292, 8295, 8295, 8297, 8299, 8302, 8302, 8302, 8304, 8306, 8305, 8305, 8307, 8310, 8310, 8310, 8312, 8316, 8316, 8317, 8319, 8322, 8322, 8322, 8324, 8326, 8326, 8326, 8328, 8332, 8331, 8332, 8335, 8338, 8339, 8340, 8343, 8346, 8346, 8347, 8348, 8351, 8350, 8351, 8353, 8356, 8356, 8357, 8359, 8363, 8363, 8365, 8367, 8370, 8370, 8370, 8372, 8375, 8374, 8375, 8377, 8380, 8380, 8381, 8383, 8387, 8387, 8388, 8391, 8394, 8394, 8394, 8396, 8399, 8398, 8399, 8401, 8404, 8404, 8405, 8407, 8411, 8411, 8412, 8415, 8418, 8418, 8419, 8420, 8423, 8422, 8423, 8425, 8428, 8428, 8429, 8432, 8435, 8435, 8437, 8439, 8442, 8442, 8442, 8443, 8446, 8445, 8445, 8447, 8450, 8450, 8450, 8452, 8456, 8456, 8457, 8459, 8462, 8462, 8462, 8464, 8466, 8466, 8466, 8468, 8471, 8471, 8472, 8475, 8478, 8479, 8480, 8483, 8486, 8486, 8487, 8488, 8491, 8491, 8491, 8493, 8497, 8496, 8497, 8500, 8503, 8503, 8505, 8507, 8510, 8510, 8510, 8511, 8514, 8513, 8513, 8515, 8518, 8517, 8518, 8520, 8523, 8524, 8525, 8527, 8530, 8530, 8530, 8532, 8535, 8534, 8535, 8537, 8540, 8540, 8541, 8543, 8547, 8547, 8548, 8551, 8554, 8554, 8554, 8555, 8558, 8557, 8557, 8559, 8562, 8562, 8562, 8564, 8568, 8568, 8569, 8571, 8574, 8574, 8574, 8576, 8578, 8578, 8578, 8580, 8583, 8583, 8584, 8587, 8590, 8591, 8592, 8595, 8598, 8598, 8599, 8600, 8603, 8602, 8603, 8605, 8608, 8608, 8609, 8611, 8615, 8615, 8617, 8619, 8622, 8622, 8622, 8624, 8626, 8625, 8626, 8627, 8630, 8630, 8630, 8633, 8636, 8636, 8637, 8639, 8642, 8642, 8642, 8643, 8645, 8644, 8645, 8646, 8649, 8649, 8650, 8652, 8655, 8655, 8657, 8659, 8662, 8662, 8662, 8664, 8667, 8666, 8667, 8669, 8672, 8672, 8673, 8675, 8679, 8679, 8680, 8683, 8686, 8686, 8686, 8688, 8690, 8689, 8690, 8691, 8694, 8694, 8695, 8697, 8700, 8700, 8701, 8703, 8706, 8706, 8706, 8707, 8709, 8708, 8709, 8710, 8713, 8713, 8713, 8716, 8719, 8719, 8720, 8723, 8726, 8726, 8726, 8728, 8731, 8730, 8730, 8733, 8736, 8736, 8737, 8739, 8743, 8743, 8744, 8747, 8750, 8750, 8750, 8751, 8754, 8753, 8753, 8755, 8758, 8758, 8758, 8761, 8764, 8764, 8765, 8767, 8770, 8770, 8770, 8771, 8774, 8773, 8773, 8775, 8778, 8777, 8778, 8780, 8784, 8784, 8785, 8787, 8790, 8790, 8790, 8791, 8793, 8792, 8793, 8794, 8797, 8797, 8798, 8800, 8803, 8803, 8805, 8807, 8810, 8810, 8810, 8812, 8814, 8814, 8814, 8816, 8820, 8819, 8820, 8823, 8827, 8827, 8828, 8831, 8834, 8834, 8834, 8836, 8838, 8837, 8838, 8840, 8843, 8842, 8843, 8845, 8848, 8848, 8849, 8851, 8854, 8853, 8853, 8854, 8857, 8855, 8855, 8857, 8860, 8859, 8859, 8861, 8864, 8864, 8865, 8867, 8870, 8869, 8869, 8871, 8873, 8872, 8872, 8874, 8877, 8876, 8877, 8879, 8883, 8883, 8884, 8887, 8890, 8890, 8890, 8892, 8895, 8894, 8894, 8897, 8900, 8900, 8901, 8903, 8907, 8907, 8908, 8911, 8914, 8914, 8914, 8915, 8918, 8917, 8917, 8919, 8922, 8922, 8922, 8924, 8928, 8928, 8929, 8931, 8934, 8934, 8934, 8935, 8938, 8937, 8937, 8939, 8942, 8942, 8942, 8944, 8948, 8948, 8949, 8951, 8954, 8953, 8953, 8954, 8957, 8955, 8955, 8957, 8960, 8959, 8959, 8961, 8964, 8964, 8965, 8967, 8970, 8969, 8969, 8971, 8973, 8972, 8973, 8974, 8978, 8977, 8978, 8980, 8983, 8983, 8985, 8987, 8990, 8990, 8990, 8991, 8993, 8992, 8992, 8994, 8997, 8997, 8997, 9000, 9003, 9003, 9004, 9007, 9010, 9010, 9010, 9012, 9015, 9014, 9015, 9017, 9020, 9020, 9021, 9023, 9027, 9027, 9028, 9031, 9034, 9033, 9033, 9035, 9037, 9036, 9036, 9037, 9040, 9039, 9039, 9041, 9045, 9044, 9045, 9047, 9050, 9049, 9049, 9051, 9053, 9052, 9053, 9054, 9058, 9057, 9058, 9060, 9064, 9064, 9065, 9067, 9070, 9069, 9069, 9070, 9073, 9071, 9071, 9073, 9076, 9075, 9075, 9077, 9080, 9080, 9081, 9083, 9086, 9085, 9085, 9087, 9089, 9088, 9088, 9090, 9093, 9093, 9093, 9096, 9099, 9099, 9100, 9103, 9106, 9106, 9106, 9107, 9110, 9109, 9109, 9111, 9114, 9113, 9114, 9116, 9120, 9120, 9121, 9123, 9126, 9125, 9126, 9127, 9129, 9128, 9129, 9131, 9134, 9133, 9134, 9136, 9139, 9139, 9141, 9143, 9146, 9145, 9146, 9147, 9149, 9148, 9149, 9150, 9154, 9153, 9154, 9156, 9159, 9159, 9160, 9163, 9166, 9166, 9166, 9167, 9170, 9169, 9169, 9171, 9174, 9174, 9174, 9176, 9180, 9180, 9181, 9183, 9186, 9185, 9185, 9186, 9188, 9187, 9187, 9189, 9192, 9191, 9191, 9193, 9196, 9196, 9197, 9199, 9202, 9201, 9201, 9203, 9205, 9204, 9205, 9207, 9210, 9209, 9210, 9212, 9216, 9216, 9217, 9219, 9222, 9221, 9221, 9222, 9225, 9223, 9223, 9225, 9228, 9227, 9227, 9229, 9232, 9232, 9233, 9235, 9238, 9237, 9237, 9238, 9241, 9240, 9240, 9242, 9245, 9244, 9245, 9247, 9251, 9251, 9252, 9255, 9258, 9258, 9258, 9259, 9262, 9261, 9261, 9263, 9266, 9266, 9266, 9268, 9272, 9272, 9273, 9275, 9278, 9277, 9277, 9278, 9280, 9279, 9279, 9281, 9284, 9283, 9283, 9285, 9288, 9288, 9289, 9291, 9294, 9293, 9293, 9294, 9297, 9296, 9296, 9298, 9301, 9300, 9301, 9303, 9307, 9307, 9308, 9311, 9314, 9314, 9314, 9315, 9318, 9317, 9317, 9319, 9322, 9322, 9322, 9324, 9328, 9328, 9329, 9331, 9334, 9333, 9333, 9334, 9336, 9335, 9335, 9337, 9339, 9339, 9339, 9341, 9344, 9344, 9345, 9347, 9350, 9349, 9349, 9351, 9353, 9352, 9353, 9354, 9358, 9357, 9358, 9360, 9363, 9363, 9365, 9367, 9370, 9369, 9369, 9370, 9372, 9371, 9371, 9373, 9376, 9375, 9375, 9377, 9380, 9380, 9381, 9383, 9386, 9385, 9385, 9387, 9389, 9388, 9388, 9390, 9393, 9393, 9393, 9396, 9399, 9399, 9400, 9403, 9406, 9405, 9405, 9406, 9409, 9408, 9408, 9409, 9412, 9411, 9412, 9413, 9417, 9416, 9417, 9419, 9422, 9421, 9421, 9422, 9424, 9423, 9422, 9424, 9427, 9426, 9426, 9428, 9432, 9432, 9433, 9435, 9438, 9437, 9437, 9439, 9441, 9440, 9441, 9443, 9446, 9445, 9446, 9448, 9452, 9451, 9453, 9455, 9458, 9457, 9457, 9458, 9460, 9459, 9459, 9461, 9464, 9463, 9463, 9465, 9468, 9468, 9469, 9471, 9474, 9473, 9473, 9475, 9477, 9476, 9476, 9478, 9482, 9481, 9482, 9484, 9487, 9487, 9488, 9491, 9494, 9493, 9493, 9494, 9496, 9495, 9495, 9497, 9500, 9499, 9499, 9501, 9504, 9504, 9505, 9507, 9510, 9509, 9509, 9511, 9513, 9512, 9512, 9514, 9518, 9517, 9518, 9520, 9523, 9523, 9524, 9527, 9530, 9529, 9529, 9530, 9532, 9531, 9531, 9533, 9536, 9535, 9535, 9537, 9540, 9540, 9541, 9543, 9546, 9545, 9545, 9547, 9549, 9548, 9548, 9550, 9553, 9553, 9553, 9556, 9559, 9559, 9560, 9563, 9566, 9565, 9565, 9566, 9569, 9567, 9567, 9569, 9572, 9571, 9571, 9573, 9577, 9576, 9577, 9579, 9582, 9581, 9581, 9582, 9584, 9582, 9582, 9584, 9587, 9586, 9586, 9588, 9592, 9592, 9593, 9595, 9598, 9597, 9597, 9599, 9601, 9600, 9600, 9602, 9605, 9605, 9605, 9608, 9611, 9611, 9612, 9615, 9618, 9617, 9617, 9618, 9621, 9619, 9619, 9621, 9624, 9623, 9623, 9625, 9629, 9628, 9629, 9631, 9634, 9633, 9633, 9634, 9636, 9634, 9634, 9636, 9639, 9638, 9638, 9640, 9644, 9644, 9644, 9647, 9650, 9649, 9649, 9651, 9653, 9652, 9652, 9654, 9657, 9657, 9657, 9660, 9663, 9663, 9664, 9667, 9670, 9669, 9669, 9670, 9673, 9671, 9671, 9673, 9676, 9675, 9675, 9677, 9681, 9680, 9681, 9683, 9686, 9685, 9685, 9686, 9688, 9687, 9687, 9688, 9691, 9690, 9691, 9693, 9696, 9696, 9697, 9699, 9702, 9701, 9701, 9702, 9704, 9703, 9703, 9704, 9707, 9706, 9707, 9709, 9712, 9712, 9713, 9715, 9718, 9717, 9717, 9718, 9720, 9719, 9719, 9721, 9724, 9723, 9723, 9725, 9728, 9728, 9729, 9731, 9734, 9733, 9733, 9734, 9736, 9734, 9734, 9736, 9739, 9738, 9738, 9740, 9744, 9744, 9744, 9747, 9750, 9749, 9749, 9751, 9753, 9752, 9752, 9754, 9757, 9757, 9757, 9760, 9763, 9763, 9764, 9767, 9770, 9769, 9769, 9770, 9773, 9771, 9771, 9773, 9776, 9775, 9775, 9777, 9780, 9780, 9781, 9783, 9786, 9785, 9785, 9786, 9788, 9787, 9787, 9788, 9791, 9790, 9791, 9793, 9796, 9796, 9797, 9799, 9802, 9801, 9801, 9802, 9804, 9803, 9803, 9804, 9807, 9806, 9807, 9809, 9812, 9812, 9813, 9815, 9818, 9817, 9817, 9818, 9820, 9819, 9819, 9820, 9823, 9822, 9823, 9825, 9828, 9828, 9829, 9831, 9834, 9833, 9833, 9834, 9836, 9835, 9835, 9836, 9839, 9838, 9839, 9841, 9844, 9844, 9845, 9847, 9850, 9849, 9849, 9850, 9852, 9851, 9851, 9852, 9855, 9854, 9855, 9857, 9860, 9860, 9861, 9863, 9866, 9865, 9865, 9866, 9868, 9867, 9867, 9869, 9872, 9871, 9871, 9873, 9877, 9876, 9877, 9879, 9882, 9881, 9880, 9881, 9883, 9882, 9881, 9883, 9885, 9884, 9884, 9886, 9889, 9888, 9889, 9891, 9894, 9893, 9892, 9893, 9896, 9894, 9894, 9896, 9899, 9898, 9898, 9900, 9904, 9904, 9905, 9907, 9910, 9909, 9909, 9910, 9912, 9911, 9911, 9912, 9915, 9914, 9915, 9917, 9920, 9920, 9921, 9923, 9926, 9925, 9925, 9926, 9928, 9927, 9927, 9928, 9931, 9930, 9931, 9933, 9936, 9936, 9937, 9939, 9942, 9941, 9941, 9942, 9944, 9943, 9943, 9944, 9947, 9946, 9947, 9949, 9952, 9952, 9953, 9955, 9958, 9957, 9957, 9958, 9960, 9959, 9959, 9960, 9963, 9962, 9963, 9965, 9968, 9968, 9969, 9971, 9974, 9973, 9973, 9974, 9976, 9975, 9975, 9976, 9979, 9978, 9979, 9981, 9984, 9984, 9985, 9987, 9990, 9989, 9989, 9990, 9992, 9991, 9990, 9992, 9995, 9994, 9994, 9997, 10000, 10000, 10001, 10003, 10006, 10005, 10005, 10006, 10008, 10007, 10007, 10009, 10012, 10011, 10011, 10013, 10017, 10016, 10017, 10019, 10022, 10021, 10020, 10021, 10023, 10021, 10021, 10022, 10025, 10024, 10024, 10026, 10029, 10028, 10029, 10031, 10034, 10033, 10032, 10034, 10036, 10035, 10034, 10036, 10039, 10038, 10039, 10041, 10044, 10044, 10045, 10047, 10050, 10049, 10048, 10049, 10051, 10050, 10049, 10051, 10053, 10052, 10052, 10054, 10057, 10056, 10057, 10059, 10062, 10061, 10060, 10061, 10064, 10062, 10062, 10064, 10067, 10066, 10066, 10068, 10072, 10071, 10072, 10075, 10078, 10077, 10077, 10078, 10080, 10079, 10079, 10080, 10083, 10082, 10083, 10085, 10088, 10088, 10089, 10091, 10094, 10093, 10092, 10094, 10096, 10094, 10094, 10096, 10099, 10098, 10098, 10100, 10104, 10104, 10104, 10107, 10110, 10109, 10109, 10110, 10112, 10111, 10111, 10113, 10116, 10115, 10115, 10117, 10120, 10120, 10121, 10123, 10126, 10125, 10124, 10125, 10127, 10125, 10125, 10126, 10129, 10128, 10128, 10130, 10133, 10132, 10133, 10135, 10138, 10137, 10136, 10138, 10140, 10138, 10138, 10140, 10143, 10142, 10143, 10145, 10148, 10148, 10149, 10151, 10154, 10153, 10152, 10153, 10155, 10153, 10153, 10154, 10157, 10156, 10156, 10158, 10161, 10160, 10161, 10163, 10166, 10165, 10164, 10165, 10168, 10166, 10166, 10168, 10171, 10170, 10170, 10173, 10176, 10176, 10177, 10179, 10182, 10181, 10180, 10181, 10183, 10182, 10181, 10183, 10185, 10184, 10184, 10186, 10189, 10188, 10189, 10191, 10194, 10193, 10192, 10193, 10196, 10194, 10194, 10196, 10199, 10198, 10198, 10200, 10204, 10203, 10204, 10207, 10210, 10209, 10209, 10210, 10212, 10211, 10211, 10213, 10216, 10215, 10215, 10217, 10221, 10220, 10221, 10223, 10226, 10225, 10224, 10225, 10227, 10225, 10225, 10226, 10229, 10228, 10228, 10230, 10233, 10232, 10233, 10235, 10238, 10237, 10236, 10237, 10240, 10238, 10238, 10240, 10243, 10242, 10242, 10245, 10248, 10248, 10249, 10251, 10254, 10253, 10252, 10253, 10255, 10253, 10253, 10255, 10257, 10256, 10256, 10258, 10261, 10260, 10261, 10263, 10266, 10265, 10264, 10265, 10268, 10266, 10266, 10267, 10271, 10270, 10270, 10272, 10276, 10275, 10276, 10279, 10282, 10281, 10281, 10282, 10284, 10283, 10283, 10285, 10288, 10287, 10287, 10289, 10292, 10292, 10293, 10295, 10298, 10297, 10296, 10297, 10299, 10297, 10297, 10298, 10301, 10300, 10300, 10302, 10305, 10304, 10305, 10307, 10310, 10309, 10308, 10309, 10312, 10310, 10310, 10312, 10315, 10314, 10314, 10316, 10320, 10320, 10320, 10323, 10326, 10325, 10324, 10325, 10327, 10326, 10325, 10327, 10330, 10328, 10328, 10330, 10333, 10333, 10333, 10335, 10338, 10336, 10336, 10337, 10339, 10337, 10336, 10338, 10341, 10339, 10339, 10341, 10345, 10344, 10345, 10347, 10350, 10349, 10348, 10349, 10352, 10350, 10350, 10352, 10355, 10354, 10354, 10356, 10360, 10359, 10360, 10363, 10366, 10365, 10365, 10366, 10368, 10367, 10367, 10368, 10372, 10370, 10371, 10373, 10376, 10376, 10377, 10379, 10382, 10381, 10380, 10381, 10383, 10382, 10381, 10383, 10386, 10384, 10384, 10386, 10389, 10389, 10389, 10391, 10394, 10392, 10392, 10393, 10395, 10393, 10392, 10394, 10397, 10395, 10395, 10397, 10400, 10400, 10401, 10403, 10406, 10405, 10404, 10405, 10408, 10406, 10406, 10408, 10411, 10410, 10410, 10413, 10416, 10416, 10417, 10419, 10422, 10421, 10420, 10421, 10423, 10421, 10421, 10422, 10425, 10424, 10424, 10426, 10429, 10428, 10429, 10431, 10434, 10433, 10432, 10433, 10435, 10434, 10434, 10435, 10439, 10437, 10438, 10440, 10444, 10443, 10444, 10447, 10450, 10449, 10449, 10450, 10452, 10451, 10451, 10452, 10456, 10454, 10455, 10457, 10460, 10460, 10461, 10463, 10466, 10465, 10464, 10465, 10467, 10465, 10465, 10467, 10469, 10468, 10468, 10470, 10473, 10472, 10473, 10475, 10478, 10476, 10476, 10477, 10479, 10477, 10477, 10478, 10481, 10480, 10480, 10482, 10485, 10484, 10485, 10487, 10490, 10488, 10488, 10489, 10491, 10489, 10488, 10490, 10493, 10491, 10491, 10493, 10497, 10496, 10497, 10499, 10502, 10501, 10500, 10501, 10504, 10502, 10502, 10503, 10507, 10506, 10506, 10508, 10512, 10511, 10512, 10515, 10518, 10517, 10516, 10518, 10520, 10519, 10519, 10520, 10523, 10522, 10523, 10525, 10528, 10528, 10529, 10531, 10534, 10533, 10532, 10533, 10535, 10533, 10533, 10534, 10537, 10536, 10536, 10538, 10541, 10540, 10541, 10543, 10546, 10544, 10544, 10545, 10547, 10545, 10545, 10546, 10549, 10548, 10548, 10550, 10553, 10552, 10553, 10555, 10558, 10556, 10556, 10557, 10559, 10557, 10556, 10558, 10561, 10559, 10559, 10561, 10565, 10564, 10565, 10567, 10570, 10569, 10568, 10569, 10572, 10570, 10570, 10572, 10575, 10574, 10574, 10576, 10580, 10580, 10580, 10583, 10586, 10584, 10584, 10585, 10587, 10585, 10585, 10586, 10589, 10588, 10588, 10589, 10593, 10592, 10593, 10595, 10598, 10597, 10596, 10597, 10600, 10598, 10598, 10600, 10603, 10602, 10602, 10604, 10608, 10607, 10608, 10611, 10614, 10613, 10612, 10613, 10615, 10613, 10613, 10615, 10617, 10616, 10616, 10618, 10621, 10620, 10621, 10623, 10626, 10624, 10624, 10625, 10627, 10625, 10625, 10626, 10629, 10628, 10628, 10630, 10633, 10632, 10633, 10635, 10638, 10636, 10636, 10636, 10639, 10637, 10636, 10638, 10641, 10639, 10639, 10641, 10644, 10644, 10644, 10647, 10650, 10649, 10648, 10649, 10652, 10650, 10650, 10652, 10655, 10654, 10654, 10656, 10660, 10660, 10660, 10663, 10666, 10665, 10664, 10665, 10667, 10665, 10665, 10666, 10669, 10668, 10668, 10670, 10673, 10672, 10673, 10675, 10678, 10676, 10676, 10677, 10679, 10677, 10677, 10678, 10681, 10680, 10680, 10681, 10685, 10684, 10685, 10687, 10690, 10688, 10688, 10688, 10691, 10689, 10688, 10690, 10693, 10691, 10691, 10693, 10696, 10696, 10696, 10699, 10702, 10701, 10700, 10701, 10704, 10702, 10702, 10704, 10707, 10706, 10706, 10708, 10712, 10711, 10712, 10715, 10718, 10716, 10716, 10717, 10719, 10717, 10717, 10718, 10721, 10720, 10720, 10722, 10725, 10724, 10725, 10727, 10730, 10728, 10728, 10729, 10731, 10729, 10728, 10730, 10733, 10731, 10731, 10733, 10737, 10736, 10737, 10739, 10742, 10740, 10740, 10741, 10743, 10741, 10741, 10742, 10745, 10744, 10744, 10746, 10749, 10748, 10749, 10751, 10754, 10752, 10752, 10752, 10755, 10753, 10752, 10754, 10757, 10755, 10755, 10757, 10760, 10760, 10760, 10763, 10766, 10765, 10764, 10765, 10768, 10766, 10766, 10768, 10771, 10770, 10770, 10772, 10776, 10775, 10776, 10779, 10782, 10780, 10780, 10781, 10783, 10781, 10781, 10782, 10785, 10784, 10784, 10786, 10789, 10788, 10789, 10791, 10794, 10792, 10792, 10792, 10795, 10793, 10792, 10794, 10797, 10795, 10795, 10797, 10801, 10800, 10801, 10803, 10806, 10804, 10804, 10805, 10807, 10805, 10805, 10806, 10809, 10808, 10808, 10810, 10813, 10812, 10813, 10815, 10818, 10816, 10816, 10816, 10819, 10817, 10816, 10818, 10821, 10819, 10819, 10821, 10824, 10824, 10824, 10827, 10830, 10828, 10828, 10829, 10832, 10830, 10830, 10832, 10835, 10834, 10834, 10836, 10840, 10839, 10840, 10843, 10846, 10845, 10844, 10845, 10848, 10846, 10845, 10847, 10850, 10848, 10848, 10850, 10854, 10853, 10853, 10855, 10858, 10856, 10855, 10856, 10858, 10855, 10855, 10856, 10858, 10857, 10856, 10858, 10861, 10860, 10861, 10863, 10866, 10864, 10864, 10865, 10867, 10866, 10865, 10867, 10870, 10869, 10870, 10872, 10876, 10875, 10876, 10879, 10882, 10880, 10880, 10881, 10883, 10881, 10881, 10883, 10885, 10884, 10884, 10886, 10889, 10888, 10889, 10891, 10894, 10892, 10892, 10892, 10895, 10893, 10892, 10894, 10897, 10895, 10895, 10897, 10901, 10900, 10901, 10903, 10906, 10904, 10904, 10905, 10907, 10905, 10904, 10906, 10909, 10907, 10907, 10909, 10913, 10912, 10913, 10915, 10918, 10916, 10916, 10917, 10919, 10917, 10916, 10918, 10921, 10919, 10919, 10921, 10925, 10924, 10925, 10927, 10930, 10928, 10928, 10929, 10931, 10929, 10928, 10930, 10933, 10931, 10931, 10933, 10937, 10936, 10937, 10939, 10942, 10940, 10940, 10940, 10943, 10941, 10940, 10942, 10945, 10943, 10943, 10945, 10949, 10948, 10949, 10951, 10954, 10952, 10952, 10952, 10955, 10953, 10952, 10954, 10957, 10955, 10955, 10957, 10961, 10960, 10961, 10963, 10966, 10964, 10964, 10964, 10967, 10965, 10964, 10966, 10969, 10967, 10967, 10969, 10973, 10972, 10973, 10975, 10978, 10976, 10976, 10976, 10979, 10977, 10976, 10978, 10981, 10979, 10979, 10981, 10985, 10984, 10985, 10987, 10990, 10988, 10988, 10988, 10991, 10989, 10988, 10990, 10993, 10991, 10991, 10993, 10997, 10996, 10997, 10999, 11002, 11000, 11000, 11000, 11003, 11001, 11000, 11002, 11005, 11003, 11003, 11005, 11009, 11008, 11009, 11011, 11014, 11012, 11012, 11012, 11015, 11013, 11012, 11014, 11017, 11015, 11015, 11017, 11021, 11020, 11021, 11023, 11026, 11024, 11024, 11024, 11027, 11025, 11024, 11026, 11029, 11027, 11027, 11029, 11033, 11032, 11033, 11035, 11038, 11036, 11036, 11036, 11039, 11037, 11036, 11038, 11041, 11039, 11039, 11041, 11045, 11044, 11045, 11047, 11050, 11048, 11048, 11048, 11051, 11049, 11048, 11050, 11053, 11051, 11051, 11053, 11057, 11056, 11057, 11059, 11062, 11060, 11060, 11060, 11063, 11061, 11060, 11062, 11065, 11063, 11063, 11065, 11069, 11068, 11069, 11071, 11074, 11072, 11072, 11072, 11075, 11073, 11072, 11074, 11077, 11075, 11075, 11077, 11081, 11080, 11080, 11083, 11086, 11084, 11084, 11084, 11087, 11085, 11084, 11086, 11089, 11087, 11087, 11089, 11093, 11092, 11093, 11095, 11098, 11096, 11095, 11096, 11099, 11097, 11096, 11098, 11101, 11099, 11099, 11101, 11105, 11104, 11104, 11107, 11110, 11108, 11108, 11109, 11111, 11109, 11109, 11110, 11113, 11112, 11112, 11114, 11117, 11116, 11117, 11119, 11122, 11120, 11119, 11120, 11122, 11120, 11119, 11120, 11123, 11121, 11121, 11123, 11126, 11125, 11125, 11127, 11130, 11128, 11127, 11128, 11130, 11128, 11127, 11129, 11132, 11130, 11130, 11132, 11136, 11135, 11136, 11138, 11142, 11140, 11140, 11141, 11144, 11142, 11142, 11144, 11147, 11146, 11146, 11149, 11152, 11152, 11152, 11155, 11158, 11156, 11155, 11156, 11158, 11156, 11155, 11156, 11159, 11157, 11157, 11159, 11162, 11161, 11161, 11163, 11166, 11164, 11163, 11164, 11166, 11164, 11164, 11165, 11168, 11167, 11167, 11169, 11172, 11172, 11172, 11175, 11178, 11176, 11176, 11176, 11179, 11177, 11176, 11178, 11181, 11179, 11179, 11181, 11185, 11184, 11184, 11187, 11190, 11188, 11187, 11188, 11191, 11189, 11188, 11190, 11193, 11191, 11191, 11193, 11197, 11196, 11196, 11199, 11202, 11200, 11199, 11200, 11203, 11201, 11200, 11202, 11205, 11203, 11203, 11205, 11209, 11208, 11208, 11211, 11214, 11212, 11211, 11212, 11215, 11213, 11212, 11214, 11217, 11215, 11215, 11217, 11221, 11220, 11220, 11223, 11226, 11224, 11223, 11224, 11227, 11225, 11224, 11226, 11229, 11227, 11227, 11229, 11233, 11232, 11232, 11235, 11238, 11236, 11236, 11237, 11239, 11237, 11237, 11238, 11241, 11240, 11240, 11242, 11245, 11244, 11245, 11247, 11250, 11248, 11247, 11248, 11250, 11248, 11247, 11248, 11251, 11249, 11249, 11250, 11254, 11253, 11253, 11255, 11258, 11256, 11255, 11256, 11258, 11256, 11255, 11257, 11260, 11258, 11258, 11260, 11264, 11263, 11264, 11266, 11270, 11268, 11268, 11269, 11272, 11270, 11270, 11272, 11275, 11274, 11274, 11276, 11280, 11280, 11280, 11283, 11286, 11284, 11283, 11284, 11286, 11284, 11283, 11284, 11287, 11285, 11285, 11287, 11290, 11289, 11289, 11291, 11294, 11292, 11291, 11292, 11294, 11292, 11292, 11293, 11296, 11295, 11295, 11297, 11300, 11300, 11300, 11303, 11306, 11304, 11303, 11304, 11307, 11305, 11304, 11306, 11309, 11307, 11307, 11309, 11313, 11312, 11312, 11315, 11318, 11316, 11315, 11316, 11318, 11316, 11316, 11317, 11321, 11319, 11319, 11321, 11324, 11324, 11324, 11327, 11330, 11328, 11328, 11329, 11331, 11329, 11329, 11330, 11333, 11332, 11332, 11334, 11337, 11336, 11337, 11339, 11342, 11340, 11339, 11339, 11341, 11339, 11338, 11339, 11342, 11340, 11340, 11342, 11345, 11344, 11344, 11347, 11350, 11348, 11348, 11349, 11351, 11350, 11349, 11351, 11355, 11353, 11354, 11356, 11360, 11359, 11360, 11362, 11366, 11364, 11363, 11364, 11366, 11364, 11363, 11364, 11367, 11365, 11365, 11367, 11370, 11369, 11369, 11371, 11374, 11372, 11371, 11372, 11374, 11372, 11371, 11373, 11376, 11375, 11375, 11377, 11380, 11379, 11380, 11382, 11386, 11384, 11383, 11384, 11387, 11385, 11384, 11386, 11389, 11387, 11387, 11389, 11393, 11392, 11392, 11395, 11398, 11396, 11395, 11396, 11398, 11396, 11396, 11397, 11400, 11399, 11399, 11401, 11404, 11404, 11404, 11407, 11410, 11408, 11407, 11408, 11411, 11409, 11408, 11410, 11413, 11412, 11411, 11413, 11417, 11416, 11417, 11419, 11422, 11420, 11419, 11420, 11422, 11419, 11419, 11420, 11423, 11421, 11420, 11422, 11425, 11424, 11425, 11427, 11430, 11428, 11427, 11428, 11430, 11428, 11428, 11429, 11432, 11431, 11431, 11433, 11436, 11436, 11436, 11438, 11442, 11440, 11439, 11440, 11443, 11441, 11440, 11442, 11445, 11443, 11443, 11445, 11449, 11448, 11448, 11451, 11454, 11452, 11451, 11452, 11455, 11453, 11452, 11454, 11457, 11455, 11455, 11457, 11461, 11460, 11461, 11463, 11466, 11464, 11463, 11464, 11466, 11463, 11463, 11464, 11467, 11465, 11464, 11466, 11469, 11468, 11469, 11471, 11474, 11472, 11471, 11472, 11474, 11472, 11472, 11473, 11476, 11475, 11475, 11477, 11480, 11480, 11480, 11482, 11486, 11484, 11483, 11484, 11487, 11484, 11484, 11485, 11489, 11487, 11487, 11489, 11492, 11492, 11492, 11494, 11498, 11496, 11495, 11496, 11499, 11497, 11496, 11498, 11501, 11500, 11500, 11501, 11505, 11504, 11505, 11507, 11510, 11508, 11507, 11507, 11509, 11507, 11506, 11507, 11510, 11508, 11508, 11510, 11513, 11512, 11512, 11515, 11518, 11516, 11516, 11517, 11519, 11518, 11517, 11519, 11523, 11521, 11522, 11524, 11528, 11527, 11528, 11530, 11534, 11532, 11531, 11532, 11534, 11532, 11531, 11532, 11535, 11533, 11533, 11535, 11538, 11537, 11537, 11539, 11542, 11540, 11539, 11540, 11542, 11540, 11539, 11541, 11544, 11542, 11542, 11544, 11548, 11547, 11548, 11550, 11554, 11552, 11551, 11552, 11555, 11552, 11552, 11554, 11557, 11555, 11555, 11557, 11561, 11560, 11560, 11562, 11566, 11564, 11563, 11564, 11567, 11565, 11564, 11566, 11569, 11567, 11567, 11569, 11573, 11572, 11572, 11575, 11578, 11576, 11575, 11576, 11578, 11575, 11574, 11576, 11579, 11577, 11576, 11578, 11581, 11580, 11581, 11583, 11586, 11584, 11583, 11584, 11586, 11584, 11583, 11585, 11588, 11587, 11587, 11589, 11592, 11591, 11592, 11594, 11598, 11596, 11595, 11596, 11599, 11596, 11596, 11597, 11601, 11599, 11599, 11601, 11604, 11604, 11604, 11606, 11610, 11608, 11607, 11608, 11611, 11609, 11608, 11610, 11613, 11611, 11611, 11613, 11617, 11616, 11616, 11619, 11622, 11620, 11619, 11620, 11622, 11619, 11618, 11620, 11623, 11621, 11620, 11622, 11625, 11624, 11625, 11627, 11630, 11628, 11627, 11628, 11630, 11628, 11627, 11629, 11632, 11630, 11630, 11632, 11636, 11635, 11636, 11638, 11642, 11640, 11639, 11640, 11643, 11641, 11640, 11642, 11645, 11643, 11643, 11645, 11649, 11648, 11648, 11651, 11654, 11652, 11651, 11651, 11654, 11651, 11650, 11652, 11655, 11653, 11652, 11654, 11657, 11656, 11657, 11659, 11662, 11660, 11659, 11660, 11662, 11660, 11659, 11661, 11664, 11663, 11662, 11665, 11668, 11667, 11668, 11670, 11674, 11672, 11671, 11672, 11674, 11672, 11672, 11673, 11677, 11675, 11675, 11677, 11680, 11680, 11680, 11682, 11686, 11684, 11683, 11684, 11687, 11685, 11684, 11686, 11689, 11687, 11687, 11689, 11693, 11692, 11692, 11695, 11698, 11696, 11695, 11696, 11698, 11696, 11695, 11696, 11699, 11697, 11697, 11699, 11702, 11701, 11701, 11703, 11706, 11704, 11702, 11703, 11705, 11702, 11701, 11703, 11706, 11704, 11703, 11705, 11709, 11708, 11708, 11710, 11714, 11712, 11711, 11713, 11715, 11713, 11713, 11715, 11718, 11717, 11717, 11720, 11724, 11723, 11724, 11726, 11730, 11728, 11727, 11728, 11730, 11728, 11727, 11729, 11731, 11730, 11729, 11731, 11734, 11733, 11733, 11735, 11738, 11736, 11734, 11735, 11737, 11735, 11734, 11735, 11738, 11736, 11736, 11738, 11741, 11740, 11740, 11743, 11746, 11744, 11743, 11744, 11746, 11744, 11744, 11745, 11748, 11747, 11747, 11749, 11752, 11751, 11752, 11754, 11758, 11756, 11755, 11756, 11758, 11756, 11756, 11757, 11760, 11759, 11759, 11761, 11764, 11764, 11764, 11766, 11770, 11768, 11767, 11768, 11771, 11769, 11768, 11770, 11773, 11771, 11771, 11773, 11777, 11776, 11776, 11779, 11782, 11780, 11779, 11779, 11782, 11779, 11778, 11780, 11782, 11781, 11780, 11782, 11785, 11784, 11785, 11787, 11790, 11788, 11787, 11788, 11790, 11788, 11787, 11789, 11792, 11790, 11790, 11792, 11796, 11795, 11796, 11798, 11802, 11800, 11799, 11800, 11803, 11801, 11800, 11802, 11805, 11803, 11803, 11805, 11809, 11808, 11808, 11811, 11814, 11812, 11811, 11811, 11813, 11811, 11810, 11811, 11814, 11812, 11812, 11814, 11817, 11816, 11816, 11819, 11822, 11820, 11819, 11820, 11822, 11820, 11820, 11821, 11824, 11823, 11823, 11825, 11829, 11828, 11828, 11830, 11834, 11832, 11831, 11831, 11834, 11831, 11830, 11832, 11834, 11833, 11832, 11834, 11837, 11836, 11836, 11839, 11842, 11840, 11839, 11840, 11842, 11840, 11840, 11841, 11844, 11843, 11843, 11845, 11848, 11848, 11848, 11850, 11854, 11852, 11851, 11851, 11854, 11851, 11850, 11852, 11855, 11853, 11852, 11854, 11857, 11856, 11857, 11859, 11862, 11860, 11859, 11860, 11862, 11860, 11859, 11861, 11864, 11862, 11862, 11864, 11868, 11867, 11868, 11870, 11874, 11872, 11871, 11872, 11875, 11873, 11872, 11874, 11877, 11875, 11875, 11877, 11881, 11880, 11880, 11883, 11886, 11884, 11883, 11883, 11885, 11883, 11882, 11884, 11886, 11884, 11884, 11886, 11889, 11888, 11888, 11891, 11894, 11892, 11891, 11892, 11894, 11892, 11891, 11893, 11896, 11894, 11894, 11896, 11900, 11899, 11900, 11902, 11906, 11904, 11903, 11904, 11907, 11905, 11904, 11906, 11909, 11907, 11907, 11909, 11913, 11912, 11912, 11914, 11918, 11916, 11915, 11916, 11918, 11915, 11915, 11916, 11919, 11917, 11917, 11918, 11922, 11920, 11921, 11923, 11926, 11924, 11922, 11923, 11925, 11923, 11922, 11923, 11926, 11924, 11924, 11926, 11929, 11928, 11928, 11930, 11934, 11932, 11931, 11932, 11934, 11932, 11931, 11933, 11936, 11934, 11934, 11936, 11940, 11939, 11940, 11942, 11946, 11944, 11943, 11944, 11947, 11945, 11944, 11946, 11949, 11947, 11947, 11949, 11953, 11952, 11952, 11955, 11958, 11956, 11955, 11955, 11957, 11955, 11954, 11955, 11958, 11956, 11956, 11958, 11961, 11960, 11960, 11962, 11966, 11964, 11963, 11964, 11966, 11964, 11964, 11965, 11968, 11967, 11967, 11969, 11972, 11972, 11972, 11974, 11978, 11976, 11975, 11975, 11977, 11975, 11974, 11975, 11978, 11976, 11976, 11978, 11981, 11980, 11980, 11982, 11986, 11984, 11983, 11984, 11986, 11984, 11984, 11985, 11988, 11987, 11987, 11989, 11992, 11992, 11992, 11994, 11998, 11996, 11995, 11995, 11997, 11995, 11994, 11995, 11998, 11996, 11996, 11998, 12001, 12000, 12000, 12002, 12006, 12004, 12003, 12004, 12006, 12004, 12004, 12005, 12008, 12007, 12007, 12009, 12012, 12012, 12012, 12014, 12018, 12016, 12015, 12015, 12018, 12015, 12014, 12016, 12019, 12017, 12016, 12018, 12021, 12020, 12020, 12023, 12026, 12024, 12023, 12024, 12026, 12024, 12023, 12025, 12028, 12026, 12026, 12028, 12032, 12031, 12032, 12034, 12038, 12036, 12035, 12036, 12039, 12036, 12036, 12038, 12041, 12039, 12039, 12041, 12045, 12044, 12044, 12046, 12050, 12048, 12047, 12047, 12050, 12047, 12047, 12048, 12051, 12049, 12048, 12050, 12054, 12052, 12053, 12055, 12058, 12055, 12054, 12055, 12057, 12054, 12054, 12055, 12058, 12056, 12055, 12057, 12061, 12060, 12060, 12062, 12066, 12064, 12063, 12064, 12066, 12064, 12064, 12065, 12068, 12067, 12067, 12069, 12073, 12072, 12072, 12074, 12078, 12076, 12075, 12075, 12077, 12075, 12074, 12075, 12078, 12076, 12076, 12078, 12081, 12080, 12080, 12082, 12086, 12084, 12083, 12084, 12086, 12084, 12083, 12085, 12088, 12087, 12087, 12089, 12092, 12092, 12092, 12094, 12098, 12096, 12095, 12095, 12097, 12095, 12094, 12095, 12098, 12096, 12096, 12098, 12101, 12100, 12100, 12102, 12106, 12104, 12103, 12104, 12106, 12104, 12103, 12105, 12108, 12107, 12107, 12109, 12112, 12112, 12112, 12114, 12118, 12116, 12115, 12115, 12117, 12115, 12114, 12115, 12118, 12116, 12116, 12118, 12121, 12120, 12120, 12122, 12126, 12124, 12123, 12124, 12126, 12124, 12123, 12125, 12128, 12126, 12126, 12129, 12132, 12131, 12132, 12134, 12138, 12136, 12135, 12136, 12138, 12135, 12135, 12136, 12139, 12137, 12137, 12138, 12142, 12140, 12141, 12143, 12146, 12143, 12142, 12143, 12145, 12142, 12142, 12143, 12146, 12144, 12144, 12145, 12149, 12148, 12148, 12150, 12154, 12152, 12151, 12152, 12154, 12152, 12151, 12153, 12156, 12154, 12154, 12156, 12160, 12159, 12160, 12162, 12166, 12164, 12163, 12164, 12167, 12164, 12164, 12165, 12169, 12167, 12167, 12169, 12173, 12172, 12172, 12174, 12178, 12176, 12175, 12175, 12178, 12175, 12174, 12176, 12179, 12177, 12176, 12178, 12182, 12180, 12181, 12183, 12186, 12183, 12182, 12183, 12185, 12182, 12181, 12183, 12186, 12184, 12183, 12185, 12189, 12188, 12188, 12190, 12194, 12192, 12191, 12192, 12194, 12192, 12191, 12193, 12196, 12195, 12195, 12197, 12200, 12199, 12200, 12202, 12206, 12204, 12203, 12203, 12206, 12203, 12203, 12204, 12207, 12205, 12204, 12206, 12210, 12208, 12209, 12211, 12214, 12211, 12210, 12211, 12213, 12210, 12209, 12211, 12214, 12212, 12211, 12213, 12217, 12216, 12216, 12218, 12222, 12220, 12219, 12220, 12222, 12220, 12219, 12221, 12224, 12223, 12222, 12225, 12228, 12227, 12228, 12230, 12234, 12232, 12231, 12231, 12234, 12231, 12230, 12232, 12235, 12233, 12232, 12234, 12238, 12236, 12237, 12239, 12242, 12239, 12238, 12239, 12241, 12238, 12237, 12239, 12242, 12240, 12239, 12241, 12245, 12244, 12244, 12246, 12250, 12248, 12247, 12248, 12250, 12248, 12247, 12249, 12252, 12251, 12250, 12253, 12256, 12255, 12256, 12258, 12262, 12260, 12259, 12259, 12262, 12259, 12258, 12260, 12263, 12261, 12260, 12262, 12266, 12264, 12265, 12267, 12270, 12267, 12266, 12267, 12269, 12266, 12265, 12267, 12270, 12268, 12267, 12269, 12273, 12272, 12272, 12274, 12278, 12276, 12275, 12276, 12278, 12276, 12275, 12277, 12280, 12279, 12279, 12281, 12284, 12284, 12284, 12286, 12290, 12288, 12286, 12287, 12289, 12287, 12286, 12287, 12290, 12288, 12288, 12290, 12293, 12292, 12292, 12294, 12298, 12296, 12295, 12296, 12298, 12296, 12295, 12297, 12300, 12299, 12298, 12301, 12304, 12303, 12304, 12306, 12310, 12308, 12306, 12307, 12309, 12307, 12306, 12307, 12310, 12308, 12308, 12310, 12313, 12312, 12312, 12314, 12318, 12316, 12315, 12316, 12318, 12316, 12315, 12317, 12320, 12318, 12318, 12320, 12324, 12323, 12324, 12326, 12330, 12328, 12327, 12327, 12330, 12327, 12326, 12328, 12331, 12329, 12328, 12330, 12334, 12332, 12333, 12335, 12338, 12335, 12334, 12335, 12337, 12334, 12333, 12335, 12338, 12336, 12335, 12337, 12341, 12340, 12340, 12342, 12346, 12344, 12343, 12344, 12346, 12344, 12343, 12345, 12348, 12346, 12346, 12349, 12352, 12351, 12352, 12354, 12358, 12356, 12355, 12355, 12358, 12355, 12354, 12356, 12359, 12357, 12356, 12358, 12362, 12360, 12361, 12363, 12366, 12363, 12362, 12363, 12365, 12362, 12361, 12363, 12366, 12364, 12363, 12365, 12369, 12368, 12368, 12370, 12374, 12372, 12371, 12372, 12374, 12372, 12371, 12373, 12376, 12374, 12374, 12376, 12380, 12379, 12380, 12382, 12386, 12384, 12383, 12383, 12386, 12383, 12382, 12384, 12387, 12385, 12384, 12386, 12390, 12388, 12388, 12391, 12394, 12391, 12390, 12391, 12393, 12390, 12389, 12391, 12394, 12392, 12391, 12393, 12397, 12396, 12396, 12398, 12402, 12400, 12399, 12400, 12402, 12400, 12399, 12401, 12404, 12402, 12402, 12404, 12408, 12407, 12408, 12410, 12414, 12412, 12411, 12411, 12414, 12411, 12410, 12412, 12415, 12413, 12412, 12414, 12417, 12416, 12416, 12418, 12422, 12419, 12418, 12419, 12421, 12418, 12418, 12419, 12422, 12420, 12420, 12421, 12425, 12424, 12424, 12426, 12430, 12427, 12426, 12427, 12429, 12427, 12426, 12427, 12430, 12428, 12428, 12430, 12433, 12432, 12432, 12434, 12438, 12435, 12434, 12435, 12437, 12434, 12433, 12435, 12438, 12436, 12435, 12437, 12441, 12440, 12440, 12442, 12446, 12444, 12443, 12444, 12446, 12444, 12443, 12445, 12448, 12446, 12446, 12448, 12452, 12451, 12452, 12454, 12458, 12456, 12455, 12455, 12458, 12455, 12454, 12456, 12459, 12457, 12456, 12458, 12462, 12460, 12460, 12462, 12466, 12463, 12462, 12463, 12465, 12462, 12461, 12463, 12466, 12464, 12463, 12465, 12469, 12468, 12468, 12470, 12474, 12472, 12471, 12472, 12474, 12472, 12471, 12473, 12476, 12474, 12474, 12476, 12480, 12479, 12480, 12482, 12486, 12484, 12483, 12483, 12486, 12483, 12482, 12484, 12487, 12485, 12484, 12486, 12490, 12488, 12488, 12490, 12494, 12491, 12490, 12491, 12493, 12490, 12489, 12491, 12494, 12492, 12491, 12493, 12497, 12496, 12496, 12498, 12502, 12500, 12499, 12500, 12502, 12500, 12499, 12501, 12504, 12502, 12502, 12504, 12508, 12507, 12508, 12510, 12514, 12511, 12510, 12511, 12513, 12511, 12510, 12512, 12515, 12512, 12512, 12514, 12517, 12516, 12516, 12518, 12522, 12519, 12518, 12519, 12521, 12519, 12518, 12519, 12522, 12520, 12520, 12522, 12525, 12524, 12524, 12526, 12530, 12527, 12526, 12527, 12529, 12526, 12525, 12527, 12530, 12528, 12527, 12529, 12533, 12532, 12532, 12534, 12538, 12536, 12535, 12536, 12538, 12536, 12535, 12537, 12540, 12538, 12538, 12540, 12544, 12543, 12544, 12546, 12550, 12547, 12546, 12547, 12550, 12547, 12546, 12548, 12551, 12548, 12548, 12550, 12553, 12552, 12552, 12554, 12558, 12555, 12554, 12555, 12557, 12554, 12554, 12555, 12558, 12556, 12556, 12557, 12561, 12560, 12560, 12562, 12566, 12563, 12562, 12563, 12565, 12563, 12562, 12563, 12566, 12564, 12564, 12566, 12569, 12568, 12568, 12570, 12574, 12571, 12570, 12571, 12573, 12570, 12569, 12571, 12574, 12572, 12571, 12573, 12577, 12576, 12576, 12578, 12582, 12580, 12579, 12580, 12582, 12580, 12579, 12581, 12584, 12582, 12582, 12584, 12588, 12587, 12588, 12590, 12594, 12591, 12590, 12591, 12594, 12591, 12590, 12592, 12595, 12593, 12592, 12594, 12597, 12596, 12596, 12598, 12602, 12599, 12598, 12599, 12601, 12598, 12597, 12598, 12602, 12599, 12599, 12601, 12605, 12603, 12604, 12606, 12610, 12608, 12607, 12608, 12610, 12608, 12607, 12609, 12612, 12610, 12610, 12612, 12616, 12615, 12616, 12618, 12622, 12619, 12618, 12619, 12621, 12619, 12618, 12619, 12622, 12620, 12620, 12622, 12625, 12624, 12624, 12626, 12630, 12627, 12626, 12627, 12629, 12627, 12626, 12627, 12630, 12628, 12628, 12630, 12633, 12632, 12632, 12634, 12638, 12635, 12634, 12635, 12637, 12634, 12633, 12634, 12637, 12635, 12635, 12637, 12641, 12639, 12640, 12642, 12646, 12644, 12643, 12644, 12646, 12644, 12644, 12645, 12649, 12647, 12647, 12649, 12653, 12652, 12652, 12654, 12658, 12655, 12654, 12654, 12656, 12653, 12652, 12653, 12656, 12654, 12653, 12655, 12658, 12656, 12656, 12658, 12662, 12659, 12658, 12659, 12661, 12659, 12658, 12660, 12663, 12662, 12662, 12664, 12668, 12667, 12668, 12670, 12674, 12672, 12671, 12671, 12674, 12671, 12670, 12672, 12675, 12673, 12672, 12674, 12678, 12676, 12676, 12678, 12682, 12679, 12678, 12679, 12681, 12678, 12677, 12678, 12681, 12679, 12679, 12681, 12685, 12683, 12684, 12686, 12690, 12687, 12687, 12687, 12690, 12688, 12687, 12689, 12692, 12690, 12690, 12692, 12696, 12695, 12696, 12698, 12702, 12699, 12698, 12699, 12701, 12699, 12698, 12699, 12702, 12700, 12700, 12702, 12705, 12704, 12704, 12706, 12710, 12707, 12706, 12707, 12709, 12706, 12705, 12707, 12710, 12708, 12707, 12709, 12713, 12712, 12712, 12714, 12718, 12715, 12714, 12715, 12717, 12714, 12714, 12715, 12718, 12716, 12716, 12717, 12721, 12720, 12720, 12722, 12726, 12723, 12722, 12723, 12725, 12723, 12722, 12723, 12726, 12724, 12724, 12726, 12729, 12728, 12728, 12730, 12734, 12731, 12730, 12731, 12733, 12730, 12729, 12731, 12734, 12732, 12731, 12733, 12737, 12735, 12736, 12738, 12742, 12739, 12738, 12739, 12742, 12739, 12739, 12740, 12744, 12742, 12742, 12744, 12748, 12747, 12748, 12750, 12754, 12751, 12751, 12751, 12754, 12751, 12750, 12752, 12755, 12753, 12752, 12754, 12758, 12756, 12757, 12758, 12762, 12759, 12757, 12758, 12760, 12757, 12756, 12757, 12759, 12757, 12756, 12758, 12761, 12760, 12760, 12762, 12766, 12763, 12762, 12763, 12766, 12763, 12763, 12764, 12768, 12766, 12766, 12768, 12772, 12771, 12772, 12774, 12778, 12775, 12774, 12775, 12778, 12775, 12774, 12776, 12779, 12777, 12776, 12778, 12782, 12780, 12780, 12782, 12786, 12783, 12782, 12782, 12785, 12782, 12781, 12782, 12785, 12783, 12783, 12785, 12788, 12787, 12788, 12790, 12794, 12791, 12791, 12792, 12794, 12792, 12791, 12793, 12796, 12795, 12795, 12797, 12801, 12799, 12800, 12802, 12806, 12803, 12802, 12803, 12805, 12802, 12801, 12802, 12805, 12802, 12801, 12803, 12806, 12805, 12805, 12807, 12810, 12807, 12806, 12806, 12808, 12806, 12805, 12806, 12809, 12807, 12807, 12809, 12812, 12811, 12812, 12814, 12818, 12815, 12815, 12816, 12818, 12816, 12815, 12817, 12820, 12818, 12818, 12820, 12824, 12823, 12824, 12826, 12830, 12827, 12826, 12827, 12829, 12827, 12826, 12827, 12830, 12828, 12828, 12830, 12833, 12832, 12832, 12834, 12838, 12835, 12834, 12835, 12837, 12834, 12833, 12835, 12838, 12836, 12835, 12837, 12841, 12840, 12840, 12842, 12846, 12843, 12842, 12843, 12845, 12842, 12841, 12843, 12846, 12844, 12843, 12845, 12849, 12848, 12848, 12850, 12854, 12851, 12850, 12851, 12853, 12850, 12850, 12851, 12854, 12852, 12852, 12853, 12857, 12856, 12856, 12858, 12862, 12859, 12858, 12858, 12861, 12858, 12857, 12858, 12861, 12859, 12859, 12861, 12864, 12863, 12864, 12866, 12870, 12867, 12867, 12868, 12870, 12868, 12867, 12869, 12873, 12871, 12871, 12873, 12877, 12876, 12876, 12878, 12882, 12879, 12878, 12878, 12880, 12877, 12876, 12877, 12880, 12878, 12877, 12878, 12882, 12880, 12880, 12882, 12886, 12883, 12882, 12883, 12885, 12883, 12882, 12884, 12887, 12885, 12885, 12888, 12892, 12891, 12891, 12894, 12898, 12895, 12895, 12895, 12898, 12895, 12895, 12896, 12899, 12897, 12897, 12898, 12902, 12900, 12901, 12902, 12906, 12903, 12901, 12902, 12904, 12901, 12899, 12901, 12903, 12901, 12900, 12902, 12905, 12904, 12904, 12906, 12910, 12907, 12906, 12907, 12910, 12907, 12906, 12908, 12912, 12910, 12910, 12912, 12916, 12915, 12915, 12918, 12922, 12919, 12918, 12919, 12921, 12919, 12918, 12919, 12923, 12920, 12920, 12922, 12925, 12924, 12924, 12926, 12930, 12927, 12926, 12927, 12929, 12926, 12925, 12927, 12930, 12928, 12927, 12929, 12933, 12932, 12932, 12934, 12938, 12935, 12934, 12935, 12937, 12934, 12933, 12935, 12938, 12936, 12935, 12937, 12941, 12940, 12940, 12942, 12946, 12943, 12942, 12943, 12945, 12942, 12942, 12943, 12946, 12944, 12944, 12945, 12949, 12948, 12948, 12950, 12954, 12951, 12950, 12950, 12953, 12950, 12949, 12950, 12953, 12951, 12951, 12953, 12956, 12955, 12956, 12958, 12962, 12959, 12958, 12960, 12962, 12960, 12959, 12961, 12964, 12962, 12962, 12965, 12968, 12967, 12968, 12970, 12974, 12971, 12970, 12970, 12973, 12970, 12969, 12970, 12973, 12970, 12969, 12971, 12974, 12973, 12973, 12974, 12978, 12975, 12973, 12974, 12976, 12973, 12972, 12974, 12977, 12975, 12974, 12976, 12980, 12979, 12979, 12982, 12986, 12983, 12983, 12984, 12986, 12984, 12983, 12985, 12989, 12987, 12987, 12989, 12993, 12992, 12992, 12994, 12998, 12995, 12994, 12994, 12996, 12993, 12992, 12993, 12996, 12993, 12993, 12994, 12998, 12996, 12996, 12998, 13002, 12999, 12998, 12999, 13001, 12999, 12998, 13000, 13003, 13001, 13001, 13004, 13008, 13007, 13007, 13010, 13014, 13011, 13010, 13011, 13013, 13011, 13010, 13011, 13014, 13012, 13012, 13014, 13017, 13016, 13016, 13018, 13022, 13019, 13018, 13019, 13021, 13018, 13017, 13019, 13022, 13020, 13019, 13021, 13025, 13024, 13024, 13026, 13030, 13027, 13026, 13027, 13029, 13026, 13025, 13027, 13030, 13028, 13027, 13029, 13033, 13032, 13032, 13034, 13038, 13035, 13034, 13035, 13037, 13034, 13033, 13035, 13038, 13036, 13035, 13037, 13041, 13040, 13040, 13042, 13046, 13043, 13042, 13043, 13045, 13042, 13041, 13043, 13046, 13044, 13043, 13045, 13049, 13048, 13048, 13050, 13054, 13051, 13050, 13051, 13053, 13050, 13049, 13051, 13054, 13052, 13051, 13053, 13057, 13056, 13056, 13058, 13062, 13059, 13058, 13059, 13061, 13058, 13057, 13059, 13062, 13060, 13059, 13061, 13065, 13064, 13064, 13066, 13070, 13067, 13066, 13067, 13069, 13066, 13065, 13067, 13070, 13068, 13067, 13069, 13073, 13072, 13072, 13074, 13078, 13075, 13074, 13075, 13077, 13074, 13073, 13075, 13078, 13076, 13075, 13077, 13081, 13080, 13080, 13082, 13086, 13083, 13082, 13083, 13085, 13082, 13081, 13083, 13086, 13084, 13083, 13085, 13089, 13088, 13088, 13090, 13094, 13091, 13090, 13090, 13093, 13090, 13089, 13090, 13093, 13091, 13091, 13093, 13096, 13095, 13096, 13098, 13102, 13099, 13098, 13099, 13102, 13100, 13099, 13101, 13104, 13102, 13102, 13104, 13108, 13107, 13108, 13110, 13114, 13111, 13110, 13110, 13112, 13110, 13108, 13110, 13112, 13110, 13109, 13111, 13114, 13113, 13112, 13114, 13118, 13115, 13113, 13114, 13116, 13113, 13112, 13114, 13117, 13115, 13114, 13116, 13120, 13119, 13119, 13122, 13126, 13123, 13122, 13123, 13126, 13123, 13123, 13124, 13128, 13126, 13126, 13128, 13132, 13131, 13131, 13134, 13138, 13135, 13134, 13135, 13138, 13135, 13134, 13136, 13139, 13137, 13136, 13138, 13142, 13140, 13140, 13142, 13146, 13143, 13141, 13142, 13144, 13141, 13139, 13140, 13143, 13141, 13140, 13142, 13145, 13144, 13144, 13146, 13150, 13147, 13146, 13147, 13149, 13147, 13146, 13148, 13151, 13149, 13149, 13152, 13156, 13155, 13155, 13158, 13162, 13159, 13158, 13159, 13162, 13159, 13158, 13160, 13163, 13161, 13160, 13162, 13166, 13164, 13164, 13166, 13170, 13167, 13165, 13166, 13168, 13165, 13163, 13164, 13167, 13165, 13164, 13166, 13169, 13168, 13168, 13170, 13174, 13171, 13170, 13171, 13173, 13171, 13170, 13172, 13175, 13174, 13173, 13176, 13180, 13179, 13179, 13182, 13186, 13183, 13182, 13183, 13185, 13183, 13182, 13183, 13186, 13184, 13184, 13186, 13189, 13188, 13188, 13190, 13194, 13191, 13190, 13190, 13193, 13190, 13189, 13190, 13194, 13191, 13191, 13193, 13197, 13195, 13196, 13198, 13202, 13199, 13198, 13199, 13201, 13198, 13197, 13199, 13202, 13200, 13199, 13201, 13205, 13204, 13204, 13206, 13210, 13207, 13206, 13207, 13209, 13206, 13205, 13207, 13210, 13208, 13207, 13209, 13213, 13212, 13212, 13214, 13218, 13215, 13214, 13215, 13217, 13214, 13213, 13215, 13218, 13216, 13215, 13217, 13221, 13220, 13220, 13222, 13226, 13223, 13222, 13223, 13225, 13222, 13221, 13223, 13226, 13224, 13223, 13225, 13229, 13228, 13228, 13230, 13234, 13231, 13230, 13231, 13233, 13230, 13229, 13231, 13234, 13232, 13231, 13233, 13237, 13236, 13236, 13238, 13242, 13239, 13238, 13239, 13241, 13238, 13237, 13239, 13242, 13240, 13239, 13241, 13245, 13244, 13244, 13246, 13250, 13247, 13246, 13247, 13249, 13246, 13245, 13247, 13250, 13248, 13247, 13249, 13253, 13252, 13252, 13254, 13258, 13255, 13254, 13255, 13257, 13254, 13253, 13255, 13258, 13256, 13255, 13257, 13261, 13260, 13260, 13262, 13266, 13263, 13262, 13263, 13265, 13262, 13261, 13263, 13266, 13264, 13263, 13265, 13269, 13268, 13268, 13270, 13274, 13271, 13270, 13271, 13273, 13270, 13269, 13271, 13274, 13272, 13271, 13273, 13277, 13276, 13276, 13278, 13282, 13279, 13278, 13279, 13281, 13278, 13277, 13279, 13282, 13280, 13279, 13281, 13285, 13284, 13284, 13286, 13290, 13287, 13286, 13287, 13289, 13286, 13285, 13287, 13290, 13288, 13287, 13289, 13293, 13292, 13292, 13294, 13298, 13295, 13294, 13295, 13297, 13294, 13293, 13295, 13298, 13296, 13295, 13297, 13301, 13300, 13300, 13302, 13306, 13303, 13302, 13303, 13305, 13302, 13301, 13303, 13306, 13304, 13303, 13305, 13309, 13308, 13308, 13310, 13314, 13311, 13310, 13310, 13313, 13310, 13309, 13311, 13314, 13312, 13311, 13313, 13317, 13315, 13316, 13318, 13322, 13319, 13318, 13318, 13321, 13318, 13317, 13319, 13322, 13320, 13319, 13321, 13325, 13323, 13324, 13326, 13330, 13327, 13326, 13326, 13329, 13326, 13325, 13327, 13330, 13328, 13327, 13329, 13333, 13331, 13332, 13334, 13338, 13335, 13334, 13334, 13337, 13334, 13333, 13335, 13338, 13336, 13335, 13337, 13341, 13339, 13340, 13342, 13346, 13343, 13342, 13342, 13345, 13342, 13341, 13343, 13346, 13344, 13343, 13345, 13349, 13347, 13348, 13350, 13354, 13351, 13350, 13350, 13353, 13350, 13349, 13351, 13354, 13352, 13351, 13353, 13357, 13355, 13356, 13358, 13362, 13359, 13358, 13358, 13361, 13358, 13357, 13359, 13362, 13360, 13359, 13361, 13365, 13363, 13364, 13366, 13370, 13367, 13366, 13366, 13369, 13366, 13365, 13367, 13370, 13368, 13367, 13369, 13373, 13371, 13372, 13374, 13378, 13375, 13374, 13374, 13377, 13374, 13373, 13375, 13378, 13376, 13375, 13377, 13381, 13379, 13380, 13382, 13386, 13383, 13382, 13382, 13385, 13382, 13381, 13382, 13386, 13383, 13383, 13385, 13389, 13387, 13388, 13390, 13394, 13391, 13390, 13390, 13393, 13390, 13389, 13390, 13394, 13391, 13391, 13393, 13397, 13395, 13396, 13398, 13402, 13399, 13398, 13398, 13401, 13398, 13397, 13398, 13402, 13399, 13399, 13401, 13405, 13403, 13404, 13406, 13410, 13407, 13406, 13406, 13409, 13406, 13405, 13407, 13410, 13408, 13407, 13409, 13413, 13411, 13412, 13414, 13417, 13415, 13414, 13414, 13417, 13414, 13413, 13414, 13418, 13415, 13415, 13417, 13421, 13419, 13420, 13422, 13425, 13423, 13422, 13423, 13425, 13422, 13422, 13423, 13426, 13424, 13424, 13426, 13429, 13428, 13428, 13430, 13433, 13431, 13429, 13430, 13432, 13429, 13427, 13428, 13431, 13429, 13428, 13430, 13433, 13432, 13432, 13434, 13437, 13435, 13434, 13435, 13437, 13435, 13434, 13436, 13439, 13437, 13437, 13439, 13443, 13442, 13443, 13446, 13449, 13447, 13446, 13447, 13450, 13447, 13446, 13448, 13451, 13449, 13448, 13450, 13454, 13452, 13452, 13454, 13457, 13455, 13453, 13453, 13455, 13452, 13451, 13452, 13455, 13453, 13452, 13454, 13457, 13456, 13456, 13458, 13461, 13459, 13458, 13459, 13461, 13459, 13458, 13460, 13463, 13461, 13461, 13463, 13467, 13466, 13467, 13470, 13473, 13471, 13470, 13471, 13474, 13471, 13470, 13472, 13475, 13473, 13472, 13474, 13478, 13476, 13476, 13478, 13481, 13479, 13477, 13477, 13479, 13476, 13475, 13476, 13479, 13476, 13476, 13477, 13481, 13480, 13480, 13482, 13485, 13483, 13482, 13483, 13486, 13483, 13482, 13484, 13488, 13486, 13486, 13488, 13492, 13491, 13491, 13494, 13497, 13495, 13494, 13494, 13496, 13493, 13492, 13493, 13496, 13494, 13493, 13495, 13498, 13496, 13496, 13498, 13501, 13499, 13497, 13498, 13500, 13497, 13496, 13497, 13500, 13498, 13498, 13500, 13504, 13503, 13503, 13506, 13509, 13507, 13506, 13507, 13510, 13508, 13507, 13509, 13512, 13510, 13510, 13512, 13516, 13515, 13516, 13518, 13521, 13519, 13518, 13518, 13520, 13517, 13516, 13517, 13520, 13518, 13517, 13518, 13522, 13520, 13520, 13522, 13525, 13523, 13521, 13522, 13524, 13521, 13520, 13522, 13525, 13523, 13522, 13524, 13528, 13527, 13528, 13530, 13533, 13531, 13530, 13530, 13533, 13530, 13529, 13531, 13534, 13532, 13531, 13533, 13537, 13535, 13536, 13538, 13541, 13539, 13538, 13538, 13541, 13538, 13537, 13538, 13542, 13539, 13539, 13541, 13545, 13543, 13544, 13546, 13549, 13547, 13546, 13546, 13549, 13546, 13545, 13546, 13550, 13547, 13547, 13549, 13553, 13551, 13552, 13554, 13557, 13555, 13554, 13554, 13557, 13554, 13553, 13554, 13558, 13555, 13555, 13557, 13561, 13559, 13560, 13562, 13565, 13563, 13562, 13562, 13565, 13562, 13561, 13562, 13566, 13563, 13563, 13565, 13569, 13567, 13568, 13570, 13573, 13571, 13570, 13570, 13573, 13570, 13569, 13570, 13574, 13571, 13571, 13573, 13577, 13575, 13576, 13578, 13581, 13579, 13578, 13578, 13581, 13578, 13577, 13578, 13582, 13579, 13579, 13581, 13585, 13583, 13584, 13586, 13589, 13587, 13586, 13586, 13589, 13586, 13585, 13586, 13590, 13587, 13587, 13589, 13593, 13591, 13592, 13594, 13597, 13595, 13594, 13594, 13597, 13594, 13593, 13594, 13598, 13595, 13595, 13597, 13601, 13599, 13600, 13602, 13605, 13603, 13602, 13602, 13605, 13602, 13601, 13602, 13606, 13603, 13603, 13605, 13609, 13607, 13608, 13610, 13613, 13611, 13610, 13610, 13613, 13610, 13609, 13610, 13613, 13611, 13611, 13613, 13617, 13615, 13616, 13618, 13621, 13619, 13618, 13619, 13621, 13618, 13617, 13619, 13622, 13620, 13619, 13621, 13625, 13624, 13624, 13626, 13629, 13627, 13625, 13626, 13628, 13624, 13623, 13624, 13627, 13625, 13624, 13626, 13629, 13628, 13628, 13630, 13633, 13631, 13630, 13631, 13633, 13630, 13630, 13631, 13635, 13633, 13633, 13635, 13639, 13638, 13639, 13642, 13645, 13643, 13642, 13643, 13646, 13643, 13642, 13643, 13647, 13644, 13644, 13646, 13650, 13648, 13648, 13650, 13653, 13651, 13649, 13649, 13651, 13648, 13647, 13648, 13651, 13648, 13648, 13649, 13653, 13652, 13652, 13654, 13657, 13655, 13654, 13655, 13657, 13655, 13654, 13655, 13659, 13657, 13657, 13659, 13663, 13662, 13663, 13666, 13669, 13667, 13666, 13667, 13669, 13667, 13666, 13667, 13671, 13668, 13668, 13670, 13673, 13672, 13672, 13674, 13677, 13675, 13673, 13674, 13676, 13673, 13671, 13673, 13676, 13673, 13672, 13674, 13678, 13676, 13676, 13678, 13681, 13679, 13677, 13678, 13680, 13677, 13676, 13677, 13681, 13678, 13678, 13680, 13684, 13683, 13683, 13686, 13689, 13687, 13686, 13687, 13690, 13687, 13687, 13689, 13692, 13690, 13690, 13692, 13696, 13695, 13695, 13698, 13701, 13699, 13697, 13698, 13700, 13697, 13696, 13697, 13700, 13698, 13697, 13698, 13702, 13700, 13700, 13702, 13705, 13703, 13701, 13702, 13704, 13701, 13700, 13701, 13704, 13702, 13702, 13704, 13708, 13707, 13707, 13710, 13713, 13711, 13710, 13711, 13714, 13711, 13711, 13713, 13716, 13714, 13714, 13716, 13720, 13719, 13719, 13722, 13725, 13723, 13721, 13722, 13724, 13721, 13720, 13721, 13724, 13721, 13721, 13722, 13726, 13724, 13724, 13726, 13729, 13727, 13725, 13726, 13728, 13725, 13724, 13726, 13729, 13727, 13726, 13728, 13732, 13731, 13731, 13734, 13737, 13735, 13734, 13734, 13737, 13734, 13733, 13734, 13738, 13735, 13735, 13737, 13741, 13739, 13740, 13742, 13745, 13743, 13742, 13742, 13745, 13742, 13741, 13742, 13746, 13743, 13743, 13745, 13749, 13747, 13748, 13750, 13753, 13751, 13750, 13750, 13753, 13750, 13749, 13750, 13754, 13751, 13751, 13753, 13757, 13755, 13756, 13758, 13761, 13759, 13758, 13758, 13761, 13758, 13757, 13758, 13762, 13759, 13759, 13761, 13765, 13763, 13764, 13766, 13769, 13767, 13766, 13766, 13769, 13766, 13765, 13766, 13770, 13767, 13767, 13769, 13773, 13771, 13772, 13774, 13777, 13775, 13774, 13774, 13777, 13774, 13773, 13774, 13778, 13775, 13775, 13777, 13781, 13779, 13780, 13782, 13785, 13783, 13782, 13782, 13785, 13782, 13781, 13782, 13786, 13783, 13783, 13785, 13789, 13787, 13788, 13790, 13793, 13791, 13790, 13790, 13793, 13790, 13789, 13790, 13794, 13791, 13791, 13793, 13797, 13795, 13796, 13798, 13801, 13799, 13798, 13798, 13801, 13798, 13797, 13798, 13802, 13799, 13799, 13801, 13805, 13803, 13804, 13806, 13809, 13807, 13806, 13806, 13809, 13806, 13805, 13806, 13810, 13807, 13807, 13809, 13813, 13811, 13812, 13814, 13817, 13815, 13814, 13814, 13817, 13814, 13813, 13814, 13818, 13815, 13815, 13817, 13821, 13819, 13820, 13822, 13825, 13823, 13822, 13822, 13825, 13822, 13821, 13822, 13826, 13823, 13823, 13825, 13829, 13827, 13828, 13830, 13833, 13831, 13830, 13830, 13833, 13830, 13829, 13830, 13834, 13831, 13831, 13833, 13837, 13835, 13836, 13838, 13841, 13839, 13838, 13838, 13841, 13838, 13837, 13838, 13842, 13839, 13839, 13841, 13845, 13843, 13844, 13846, 13849, 13847, 13846, 13846, 13849, 13846, 13845, 13846, 13850, 13847, 13847, 13849, 13853, 13851, 13852, 13854, 13857, 13855, 13853, 13854, 13857, 13854, 13853, 13854, 13857, 13855, 13855, 13857, 13860, 13859, 13859, 13862, 13865, 13863, 13862, 13862, 13865, 13862, 13861, 13863, 13866, 13864, 13863, 13865, 13869, 13868, 13868, 13870, 13873, 13871, 13869, 13869, 13871, 13868, 13867, 13868, 13871, 13868, 13868, 13869, 13873, 13872, 13872, 13874, 13877, 13875, 13874, 13874, 13877, 13874, 13874, 13875, 13879, 13877, 13877, 13879, 13883, 13882, 13883, 13886, 13889, 13887, 13886, 13887, 13889, 13887, 13886, 13887, 13890, 13888, 13888, 13890, 13893, 13892, 13892, 13894, 13897, 13895, 13893, 13894, 13896, 13893, 13891, 13892, 13895, 13893, 13892, 13894, 13898, 13896, 13896, 13898, 13901, 13899, 13897, 13898, 13900, 13897, 13896, 13897, 13900, 13898, 13898, 13900, 13904, 13903, 13903, 13906, 13909, 13907, 13906, 13907, 13910, 13907, 13907, 13908, 13912, 13910, 13910, 13912, 13916, 13915, 13915, 13918, 13921, 13919, 13917, 13918, 13920, 13917, 13916, 13917, 13920, 13917, 13916, 13918, 13922, 13920, 13920, 13922, 13925, 13923, 13921, 13922, 13924, 13921, 13920, 13922, 13925, 13923, 13922, 13924, 13928, 13927, 13927, 13930, 13933, 13931, 13930, 13930, 13933, 13930, 13929, 13930, 13934, 13931, 13931, 13933, 13937, 13935, 13936, 13938, 13941, 13939, 13937, 13938, 13941, 13938, 13937, 13938, 13941, 13939, 13939, 13941, 13945, 13943, 13943, 13946, 13949, 13947, 13945, 13946, 13949, 13946, 13945, 13946, 13949, 13947, 13947, 13949, 13953, 13951, 13951, 13954, 13957, 13955, 13953, 13954, 13957, 13954, 13953, 13954, 13957, 13955, 13955, 13957, 13961, 13959, 13959, 13962, 13965, 13963, 13961, 13962, 13965, 13962, 13961, 13962, 13965, 13963, 13963, 13965, 13969, 13967, 13967, 13970, 13973, 13971, 13969, 13970, 13972, 13970, 13968, 13970, 13973, 13971, 13970, 13973, 13976, 13975, 13975, 13978, 13981, 13979, 13978, 13978, 13981, 13978, 13977, 13979, 13982, 13980, 13979, 13981, 13985, 13984, 13984, 13986, 13989, 13987, 13985, 13985, 13987, 13984, 13983, 13984, 13987, 13984, 13984, 13985, 13989, 13987, 13988, 13990, 13993, 13991, 13990, 13990, 13993, 13990, 13990, 13991, 13995, 13993, 13993, 13995, 13999, 13998, 13999, 14001, 14005, 14003, 14002, 14003, 14005, 14002, 14002, 14003, 14006, 14004, 14004, 14005, 14009, 14008, 14008, 14010, 14013, 14011, 14009, 14009, 14012, 14008, 14007, 14008, 14011, 14009, 14008, 14010, 14013, 14012, 14012, 14014, 14017, 14015, 14013, 14014, 14016, 14013, 14012, 14013, 14016, 14014, 14014, 14016, 14020, 14019, 14019, 14021, 14025, 14023, 14022, 14023, 14026, 14023, 14023, 14024, 14028, 14026, 14026, 14028, 14032, 14031, 14031, 14034, 14037, 14035, 14033, 14034, 14036, 14033, 14032, 14033, 14036, 14033, 14032, 14034, 14038, 14036, 14036, 14038, 14041, 14039, 14037, 14038, 14040, 14037, 14036, 14037, 14041, 14039, 14038, 14040, 14044, 14043, 14043, 14046, 14049, 14047, 14045, 14046, 14049, 14046, 14045, 14046, 14050, 14047, 14047, 14049, 14053, 14051, 14051, 14054, 14057, 14055, 14053, 14054, 14057, 14054, 14053, 14054, 14057, 14055, 14055, 14057, 14061, 14059, 14059, 14062, 14065, 14063, 14061, 14062, 14065, 14062, 14061, 14062, 14065, 14063, 14063, 14065, 14069, 14067, 14067, 14070, 14073, 14071, 14069, 14070, 14073, 14070, 14069, 14070, 14073, 14071, 14071, 14073, 14077, 14075, 14075, 14078, 14081, 14079, 14077, 14078, 14080, 14077, 14076, 14078, 14081, 14079, 14078, 14080, 14084, 14083, 14083, 14086, 14089, 14087, 14085, 14086, 14089, 14086, 14085, 14086, 14090, 14087, 14087, 14089, 14093, 14091, 14092, 14094, 14097, 14095, 14093, 14094, 14096, 14093, 14091, 14092, 14096, 14093, 14092, 14094, 14098, 14096, 14096, 14098, 14101, 14098, 14097, 14097, 14100, 14097, 14096, 14097, 14100, 14098, 14098, 14100, 14104, 14102, 14103, 14105, 14109, 14107, 14106, 14107, 14110, 14107, 14106, 14108, 14112, 14110, 14110, 14112, 14116, 14115, 14115, 14118, 14121, 14119, 14117, 14118, 14120, 14117, 14116, 14117, 14120, 14117, 14116, 14118, 14122, 14120, 14120, 14122, 14125, 14123, 14121, 14122, 14124, 14121, 14120, 14121, 14125, 14122, 14122, 14124, 14128, 14127, 14127, 14130, 14133, 14131, 14129, 14130, 14133, 14130, 14129, 14130, 14133, 14131, 14131, 14133, 14137, 14135, 14135, 14138, 14141, 14139, 14137, 14138, 14141, 14138, 14137, 14138, 14142, 14139, 14139, 14141, 14145, 14143, 14144, 14146, 14149, 14147, 14145, 14145, 14148, 14144, 14143, 14144, 14148, 14145, 14144, 14146, 14150, 14148, 14148, 14150, 14153, 14150, 14149, 14149, 14152, 14149, 14148, 14149, 14152, 14150, 14150, 14152, 14156, 14154, 14155, 14157, 14161, 14159, 14158, 14159, 14162, 14159, 14158, 14160, 14164, 14162, 14162, 14164, 14168, 14167, 14167, 14170, 14173, 14171, 14169, 14170, 14172, 14169, 14167, 14169, 14172, 14169, 14168, 14170, 14174, 14172, 14172, 14174, 14177, 14174, 14173, 14174, 14176, 14173, 14172, 14173, 14177, 14174, 14174, 14176, 14180, 14179, 14179, 14182, 14185, 14183, 14181, 14182, 14185, 14182, 14181, 14182, 14185, 14183, 14183, 14185, 14188, 14187, 14187, 14190, 14193, 14191, 14189, 14190, 14193, 14190, 14189, 14190, 14194, 14191, 14191, 14193, 14197, 14195, 14196, 14198, 14201, 14198, 14197, 14197, 14200, 14196, 14195, 14196, 14199, 14197, 14196, 14198, 14201, 14200, 14200, 14202, 14205, 14203, 14201, 14202, 14204, 14201, 14200, 14201, 14205, 14203, 14202, 14204, 14208, 14207, 14207, 14210, 14213, 14211, 14209, 14210, 14213, 14210, 14209, 14210, 14213, 14211, 14211, 14213, 14217, 14215, 14215, 14218, 14221, 14219, 14217, 14218, 14220, 14217, 14216, 14218, 14221, 14219, 14218, 14220, 14224, 14223, 14223, 14226, 14229, 14227, 14225, 14226, 14228, 14225, 14224, 14226, 14229, 14227, 14226, 14228, 14232, 14231, 14231, 14234, 14237, 14235, 14233, 14234, 14237, 14234, 14233, 14234, 14238, 14235, 14235, 14237, 14241, 14239, 14240, 14242, 14245, 14242, 14241, 14241, 14244, 14240, 14239, 14240, 14243, 14241, 14240, 14242, 14245, 14244, 14244, 14246, 14249, 14246, 14245, 14246, 14248, 14245, 14244, 14245, 14249, 14247, 14246, 14248, 14252, 14251, 14251, 14254, 14257, 14255, 14253, 14254, 14256, 14253, 14252, 14254, 14257, 14255, 14254, 14256, 14260, 14259, 14259, 14262, 14265, 14263, 14261, 14262, 14265, 14262, 14261, 14262, 14266, 14263, 14263, 14265, 14269, 14267, 14268, 14270, 14273, 14270, 14269, 14269, 14272, 14268, 14267, 14268, 14271, 14269, 14268, 14270, 14273, 14272, 14272, 14274, 14277, 14274, 14273, 14274, 14276, 14273, 14272, 14273, 14277, 14274, 14274, 14276, 14280, 14279, 14279, 14282, 14285, 14283, 14281, 14282, 14285, 14282, 14281, 14282, 14285, 14283, 14283, 14285, 14289, 14287, 14287, 14290, 14293, 14291, 14289, 14290, 14292, 14289, 14288, 14290, 14293, 14291, 14290, 14292, 14296, 14295, 14295, 14298, 14301, 14299, 14297, 14298, 14300, 14297, 14296, 14298, 14301, 14299, 14298, 14300, 14304, 14303, 14303, 14306, 14309, 14307, 14305, 14306, 14309, 14306, 14305, 14306, 14310, 14307, 14307, 14309, 14313, 14311, 14312, 14314, 14317, 14314, 14313, 14313, 14316, 14312, 14311, 14312, 14315, 14313, 14312, 14314, 14317, 14316, 14316, 14318, 14321, 14318, 14317, 14318, 14320, 14317, 14316, 14317, 14321, 14318, 14318, 14320, 14324, 14323, 14323, 14326, 14329, 14327, 14325, 14326, 14328, 14325, 14324, 14326, 14329, 14327, 14326, 14328, 14332, 14331, 14331, 14334, 14337, 14335, 14333, 14334, 14337, 14334, 14333, 14334, 14338, 14335, 14335, 14337, 14341, 14339, 14339, 14342, 14345, 14342, 14341, 14341, 14344, 14340, 14339, 14340, 14343, 14341, 14340, 14342, 14345, 14344, 14344, 14346, 14349, 14346, 14345, 14346, 14348, 14345, 14344, 14345, 14349, 14346, 14346, 14348, 14352, 14351, 14351, 14354, 14357, 14355, 14353, 14354, 14357, 14354, 14353, 14354, 14357, 14355, 14354, 14357, 14361, 14359, 14359, 14362, 14365, 14363, 14361, 14362, 14364, 14361, 14360, 14362, 14365, 14363, 14362, 14364, 14368, 14367, 14367, 14370, 14373, 14371, 14369, 14370, 14373, 14370, 14369, 14370, 14374, 14371, 14371, 14373, 14377, 14375, 14375, 14378, 14381, 14378, 14377, 14377, 14380, 14376, 14375, 14376, 14379, 14377, 14376, 14378, 14381, 14380, 14380, 14382, 14385, 14382, 14381, 14382, 14384, 14381, 14380, 14381, 14385, 14382, 14382, 14384, 14388, 14387, 14387, 14390, 14393, 14391, 14389, 14390, 14392, 14389, 14388, 14390, 14393, 14391, 14390, 14392, 14396, 14395, 14395, 14398, 14401, 14399, 14397, 14398, 14401, 14398, 14397, 14398, 14402, 14399, 14399, 14401, 14405, 14403, 14403, 14406, 14409, 14406, 14405, 14405, 14407, 14404, 14403, 14404, 14407, 14405, 14404, 14406, 14409, 14408, 14408, 14410, 14413, 14410, 14409, 14410, 14412, 14409, 14408, 14409, 14413, 14410, 14410, 14412, 14416, 14415, 14415, 14418, 14421, 14419, 14417, 14418, 14420, 14417, 14416, 14418, 14421, 14419, 14418, 14420, 14424, 14423, 14423, 14426, 14429, 14427, 14425, 14426, 14429, 14426, 14425, 14426, 14430, 14427, 14427, 14429, 14433, 14431, 14431, 14434, 14437, 14434, 14433, 14433, 14436, 14432, 14431, 14432, 14435, 14433, 14432, 14434, 14437, 14436, 14436, 14438, 14441, 14438, 14437, 14438, 14440, 14437, 14436, 14437, 14441, 14438, 14438, 14440, 14444, 14443, 14443, 14445, 14449, 14447, 14445, 14446, 14449, 14446, 14445, 14446, 14450, 14447, 14447, 14449, 14453, 14451, 14451, 14454, 14457, 14454, 14453, 14453, 14455, 14452, 14451, 14452, 14455, 14452, 14452, 14453, 14457, 14456, 14456, 14458, 14461, 14458, 14457, 14458, 14460, 14457, 14456, 14457, 14461, 14458, 14458, 14460, 14464, 14463, 14463, 14466, 14469, 14467, 14465, 14466, 14468, 14465, 14464, 14466, 14469, 14467, 14466, 14468, 14472, 14471, 14471, 14474, 14477, 14475, 14473, 14474, 14477, 14474, 14473, 14474, 14478, 14475, 14475, 14477, 14481, 14479, 14479, 14482, 14485, 14482, 14481, 14481, 14483, 14480, 14478, 14480, 14483, 14480, 14479, 14481, 14485, 14483, 14483, 14486, 14489, 14487, 14485, 14486, 14489, 14486, 14485, 14487, 14491, 14489, 14489, 14491, 14495, 14494, 14495, 14497, 14501, 14499, 14497, 14498, 14500, 14497, 14496, 14497, 14500, 14498, 14497, 14498, 14502, 14500, 14500, 14502, 14505, 14502, 14500, 14501, 14503, 14499, 14498, 14499, 14502, 14499, 14499, 14500, 14504, 14503, 14503, 14505, 14509, 14507, 14506, 14506, 14509, 14507, 14506, 14508, 14511, 14509, 14509, 14511, 14516, 14514, 14515, 14517, 14521, 14519, 14517, 14518, 14520, 14517, 14515, 14517, 14520, 14517, 14516, 14518, 14522, 14520, 14520, 14522, 14525, 14522, 14521, 14521, 14524, 14521, 14520, 14521, 14525, 14522, 14522, 14524, 14528, 14527, 14527, 14529, 14533, 14531, 14529, 14530, 14532, 14529, 14528, 14530, 14533, 14531, 14530, 14532, 14536, 14535, 14535, 14537, 14541, 14539, 14537, 14538, 14541, 14538, 14537, 14538, 14542, 14539, 14539, 14541, 14545, 14543, 14543, 14546, 14549, 14546, 14545, 14545, 14547, 14544, 14543, 14544, 14547, 14544, 14544, 14545, 14549, 14548, 14548, 14550, 14553, 14550, 14549, 14549, 14552, 14549, 14548, 14549, 14553, 14550, 14550, 14552, 14556, 14555, 14555, 14557, 14561, 14559, 14557, 14558, 14561, 14558, 14557, 14558, 14562, 14559, 14559, 14561, 14565, 14563, 14563, 14566, 14569, 14566, 14565, 14565, 14567, 14564, 14563, 14564, 14567, 14564, 14564, 14565, 14569, 14567, 14567, 14570, 14573, 14570, 14569, 14570, 14572, 14569, 14568, 14569, 14573, 14570, 14570, 14572, 14576, 14575, 14575, 14577, 14581, 14579, 14577, 14578, 14580, 14577, 14576, 14578, 14581, 14579, 14578, 14580, 14584, 14583, 14583, 14585, 14589, 14587, 14585, 14586, 14589, 14586, 14585, 14586, 14590, 14587, 14587, 14589, 14593, 14591, 14591, 14594, 14597, 14594, 14593, 14593, 14595, 14592, 14591, 14592, 14595, 14592, 14592, 14593, 14597, 14595, 14596, 14598, 14601, 14598, 14597, 14597, 14600, 14597, 14596, 14597, 14601, 14598, 14598, 14600, 14604, 14603, 14603, 14605, 14609, 14607, 14605, 14606, 14609, 14606, 14605, 14606, 14610, 14607, 14607, 14609, 14613, 14611, 14611, 14614, 14617, 14614, 14613, 14613, 14615, 14612, 14611, 14612, 14615, 14612, 14612, 14613, 14617, 14615, 14615, 14618, 14621, 14618, 14617, 14617, 14620, 14617, 14616, 14617, 14621, 14618, 14618, 14620, 14624, 14623, 14623, 14625, 14629, 14627, 14625, 14626, 14628, 14625, 14624, 14626, 14629, 14627, 14626, 14628, 14632, 14631, 14631, 14633, 14637, 14635, 14633, 14634, 14637, 14634, 14633, 14634, 14638, 14635, 14635, 14637, 14641, 14639, 14639, 14642, 14645, 14642, 14641, 14641, 14643, 14640, 14639, 14640, 14643, 14640, 14640, 14641, 14645, 14643, 14643, 14646, 14649, 14646, 14645, 14645, 14648, 14645, 14644, 14645, 14649, 14646, 14646, 14648, 14652, 14651, 14651, 14653, 14657, 14655, 14653, 14654, 14657, 14654, 14653, 14654, 14658, 14655, 14655, 14657, 14661, 14659, 14659, 14662, 14665, 14662, 14661, 14661, 14663, 14660, 14659, 14660, 14663, 14660, 14660, 14661, 14665, 14663, 14663, 14666, 14669, 14666, 14665, 14665, 14668, 14665, 14664, 14665, 14669, 14666, 14666, 14668, 14672, 14671, 14671, 14673, 14677, 14674, 14673, 14674, 14676, 14673, 14672, 14674, 14677, 14675, 14674, 14676, 14680, 14679, 14679, 14681, 14685, 14683, 14681, 14682, 14685, 14681, 14680, 14682, 14686, 14683, 14683, 14685, 14689, 14687, 14687, 14690, 14693, 14690, 14689, 14689, 14691, 14688, 14687, 14688, 14691, 14688, 14688, 14689, 14693, 14691, 14691, 14694, 14697, 14694, 14693, 14693, 14696, 14693, 14692, 14693, 14697, 14694, 14694, 14696, 14700, 14698, 14699, 14701, 14705, 14703, 14701, 14702, 14705, 14702, 14701, 14702, 14706, 14703, 14703, 14705, 14709, 14707, 14707, 14710, 14713, 14710, 14709, 14709, 14711, 14708, 14707, 14708, 14711, 14708, 14708, 14709, 14713, 14711, 14711, 14714, 14717, 14714, 14713, 14713, 14716, 14713, 14712, 14713, 14717, 14714, 14714, 14716, 14720, 14718, 14719, 14721, 14725, 14723, 14721, 14722, 14725, 14722, 14721, 14722, 14726, 14723, 14723, 14725, 14729, 14727, 14727, 14730, 14733, 14730, 14729, 14729, 14731, 14728, 14727, 14728, 14731, 14728, 14727, 14729, 14733, 14731, 14731, 14734, 14737, 14734, 14733, 14733, 14736, 14733, 14732, 14733, 14737, 14734, 14734, 14736, 14740, 14739, 14739, 14741, 14745, 14742, 14741, 14742, 14744, 14741, 14740, 14742, 14745, 14743, 14742, 14744, 14748, 14747, 14747, 14749, 14753, 14750, 14749, 14750, 14753, 14749, 14748, 14750, 14753, 14751, 14750, 14753, 14757, 14755, 14755, 14758, 14761, 14758, 14757, 14757, 14759, 14756, 14755, 14756, 14759, 14756, 14756, 14757, 14761, 14759, 14759, 14762, 14765, 14762, 14761, 14761, 14764, 14761, 14759, 14761, 14764, 14762, 14762, 14764, 14768, 14766, 14767, 14769, 14773, 14771, 14769, 14770, 14773, 14770, 14769, 14770, 14774, 14771, 14771, 14773, 14777, 14775, 14775, 14778, 14781, 14778, 14777, 14777, 14779, 14776, 14775, 14776, 14779, 14776, 14775, 14777, 14781, 14779, 14779, 14782, 14785, 14782, 14781, 14781, 14784, 14781, 14779, 14781, 14784, 14782, 14782, 14784, 14788, 14786, 14787, 14789, 14793, 14791, 14789, 14790, 14793, 14790, 14789, 14790, 14794, 14791, 14791, 14793, 14797, 14795, 14795, 14798, 14801, 14798, 14797, 14797, 14799, 14796, 14795, 14796, 14799, 14796, 14795, 14797, 14801, 14799, 14799, 14802, 14805, 14802, 14801, 14801, 14804, 14801, 14800, 14801, 14805, 14802, 14802, 14804, 14808, 14807, 14807, 14809, 14813, 14810, 14809, 14810, 14812, 14809, 14808, 14810, 14813, 14811, 14810, 14812, 14816, 14815, 14815, 14817, 14821, 14818, 14817, 14818, 14820, 14817, 14816, 14818, 14821, 14819, 14818, 14821, 14825, 14823, 14823, 14826, 14829, 14826, 14825, 14825, 14827, 14824, 14823, 14824, 14827, 14824, 14823, 14825, 14829, 14827, 14827, 14830, 14833, 14830, 14829, 14829, 14832, 14829, 14827, 14829, 14832, 14830, 14829, 14832, 14836, 14834, 14835, 14837, 14841, 14838, 14837, 14838, 14841, 14838, 14836, 14838, 14842, 14839, 14839, 14841, 14845, 14843, 14843, 14846, 14849, 14846, 14845, 14845, 14847, 14844, 14843, 14844, 14847, 14844, 14843, 14845, 14849, 14847, 14847, 14850, 14853, 14850, 14849, 14849, 14852, 14849, 14847, 14849, 14852, 14850, 14849, 14852, 14856, 14854, 14855, 14857, 14861, 14858, 14857, 14858, 14861, 14858, 14856, 14858, 14862, 14859, 14859, 14861, 14865, 14863, 14863, 14866, 14869, 14866, 14865, 14865, 14867, 14864, 14863, 14864, 14867, 14864, 14863, 14865, 14869, 14867, 14867, 14870, 14873, 14870, 14869, 14869, 14872, 14869, 14868, 14869, 14873, 14870, 14870, 14872, 14876, 14875, 14875, 14877, 14881, 14878, 14877, 14878, 14880, 14877, 14876, 14878, 14881, 14879, 14878, 14880, 14884, 14883, 14883, 14885, 14889, 14886, 14885, 14886, 14888, 14885, 14884, 14886, 14889, 14887, 14886, 14888, 14892, 14891, 14891, 14893, 14897, 14894, 14893, 14893, 14896, 14892, 14891, 14892, 14896, 14893, 14892, 14894, 14898, 14896, 14896, 14898, 14901, 14898, 14896, 14896, 14899, 14895, 14894, 14895, 14898, 14895, 14894, 14896, 14900, 14899, 14899, 14901, 14905, 14903, 14901, 14902, 14905, 14902, 14901, 14903, 14907, 14905, 14905, 14907, 14912, 14910, 14911, 14913, 14917, 14914, 14913, 14913, 14916, 14912, 14911, 14912, 14915, 14913, 14912, 14913, 14917, 14915, 14915, 14918, 14921, 14918, 14917, 14917, 14920, 14917, 14916, 14917, 14921, 14918, 14918, 14920, 14924, 14923, 14923, 14925, 14929, 14926, 14924, 14925, 14927, 14924, 14922, 14923, 14927, 14924, 14923, 14925, 14929, 14927, 14927, 14929, 14933, 14930, 14929, 14930, 14933, 14930, 14929, 14931, 14935, 14933, 14932, 14935, 14939, 14938, 14939, 14941, 14945, 14942, 14941, 14942, 14944, 14941, 14939, 14941, 14944, 14941, 14940, 14942, 14946, 14944, 14944, 14946, 14949, 14946, 14944, 14945, 14947, 14943, 14942, 14943, 14946, 14944, 14943, 14945, 14949, 14947, 14947, 14949, 14953, 14950, 14949, 14949, 14952, 14949, 14948, 14949, 14953, 14950, 14950, 14952, 14956, 14955, 14955, 14957, 14961, 14958, 14957, 14958, 14960, 14957, 14956, 14957, 14961, 14958, 14958, 14960, 14964, 14963, 14963, 14965, 14969, 14966, 14965, 14966, 14968, 14965, 14964, 14966, 14969, 14967, 14966, 14968, 14973, 14971, 14971, 14973, 14977, 14974, 14972, 14973, 14975, 14972, 14970, 14972, 14975, 14972, 14971, 14973, 14977, 14975, 14975, 14978, 14981, 14978, 14977, 14977, 14980, 14977, 14975, 14977, 14981, 14978, 14978, 14980, 14984, 14982, 14983, 14985, 14989, 14986, 14985, 14986, 14988, 14985, 14984, 14985, 14989, 14986, 14986, 14988, 14992, 14991, 14991, 14993, 14997, 14994, 14993, 14994, 14996, 14993, 14992, 14994, 14997, 14995, 14994, 14996, 15001, 14999, 14999, 15001, 15005, 15002, 15000, 15001, 15003, 15000, 14998, 15000, 15003, 15000, 14999, 15001, 15005, 15003, 15003, 15006, 15009, 15006, 15005, 15005, 15008, 15005, 15003, 15005, 15009, 15006, 15006, 15008, 15012, 15010, 15011, 15013, 15017, 15014, 15013, 15014, 15016, 15013, 15012, 15013, 15017, 15014, 15014, 15016, 15020, 15019, 15019, 15021, 15025, 15022, 15021, 15022, 15024, 15021, 15020, 15022, 15025, 15023, 15022, 15024, 15029, 15027, 15027, 15029, 15033, 15030, 15028, 15029, 15031, 15028, 15026, 15028, 15031, 15028, 15027, 15029, 15033, 15031, 15031, 15033, 15037, 15034, 15033, 15033, 15036, 15033, 15031, 15033, 15037, 15034, 15033, 15036, 15040, 15038, 15039, 15041, 15045, 15042, 15041, 15042, 15044, 15041, 15040, 15041, 15045, 15042, 15042, 15044, 15048, 15047, 15047, 15049, 15053, 15050, 15049, 15050, 15052, 15049, 15048, 15050, 15053, 15051, 15050, 15052, 15057, 15055, 15055, 15057, 15061, 15058, 15056, 15057, 15059, 15056, 15054, 15056, 15059, 15056, 15055, 15057, 15061, 15059, 15059, 15061, 15065, 15062, 15061, 15061, 15064, 15061, 15059, 15061, 15065, 15062, 15061, 15064, 15068, 15066, 15067, 15069, 15073, 15070, 15069, 15070, 15072, 15069, 15068, 15069, 15073, 15070, 15070, 15072, 15076, 15075, 15075, 15077, 15081, 15078, 15077, 15078, 15080, 15077, 15076, 15078, 15081, 15079, 15078, 15080, 15084, 15083, 15083, 15085, 15089, 15086, 15084, 15085, 15087, 15084, 15082, 15084, 15087, 15084, 15083, 15085, 15089, 15087, 15087, 15089, 15093, 15090, 15089, 15089, 15092, 15089, 15087, 15089, 15093, 15090, 15089, 15092, 15096, 15094, 15095, 15097, 15101, 15098, 15097, 15098, 15100, 15097, 15096, 15097, 15101, 15098, 15098, 15100, 15104, 15103, 15103, 15105, 15109, 15106, 15105, 15106, 15108, 15105, 15104, 15106, 15109, 15107, 15106, 15108, 15112, 15111, 15111, 15113, 15117, 15114, 15112, 15113, 15115, 15112, 15110, 15112, 15115, 15112, 15111, 15113, 15117, 15115, 15115, 15117, 15121, 15118, 15117, 15117, 15120, 15116, 15115, 15117, 15120, 15118, 15117, 15120, 15124, 15122, 15123, 15125, 15129, 15126, 15125, 15126, 15128, 15125, 15124, 15125, 15129, 15126, 15126, 15128, 15132, 15131, 15131, 15133, 15137, 15134, 15133, 15133, 15136, 15133, 15132, 15133, 15137, 15134, 15134, 15136, 15140, 15138, 15139, 15141, 15145, 15142, 15141, 15142, 15144, 15141, 15140, 15142, 15145, 15143, 15142, 15144, 15148, 15147, 15147, 15149, 15153, 15150, 15148, 15149, 15151, 15148, 15146, 15148, 15151, 15148, 15147, 15149, 15153, 15151, 15151, 15153, 15157, 15154, 15153, 15153, 15156, 15152, 15151, 15153, 15156, 15154, 15153, 15156, 15160, 15158, 15159, 15161, 15165, 15162, 15161, 15162, 15164, 15161, 15160, 15161, 15165, 15162, 15162, 15164, 15168, 15167, 15167, 15169, 15173, 15170, 15169, 15169, 15172, 15169, 15168, 15169, 15173, 15170, 15170, 15172, 15176, 15174, 15175, 15177, 15181, 15178, 15177, 15178, 15180, 15177, 15176, 15178, 15181, 15179, 15178, 15180, 15184, 15183, 15183, 15185, 15189, 15186, 15184, 15185, 15187, 15184, 15182, 15184, 15187, 15184, 15183, 15185, 15189, 15187, 15187, 15189, 15193, 15190, 15189, 15189, 15192, 15188, 15187, 15189, 15192, 15190, 15189, 15192, 15196, 15194, 15195, 15197, 15201, 15198, 15197, 15198, 15200, 15197, 15196, 15197, 15201, 15198, 15198, 15200, 15204, 15203, 15203, 15205, 15209, 15206, 15205, 15205, 15208, 15205, 15204, 15205, 15209, 15206, 15206, 15208, 15212, 15210, 15211, 15213, 15217, 15214, 15213, 15214, 15216, 15213, 15212, 15214, 15217, 15215, 15214, 15216, 15220, 15219, 15219, 15221, 15225, 15222, 15220, 15221, 15223, 15220, 15218, 15220, 15223, 15220, 15219, 15221, 15225, 15223, 15223, 15225, 15229, 15226, 15225, 15225, 15228, 15224, 15223, 15225, 15228, 15226, 15225, 15228, 15232, 15230, 15231, 15233, 15237, 15234, 15233, 15234, 15236, 15233, 15232, 15233, 15237, 15234, 15234, 15236, 15240, 15239, 15239, 15241, 15245, 15242, 15241, 15241, 15244, 15241, 15240, 15241, 15245, 15242, 15242, 15244, 15248, 15246, 15247, 15249, 15253, 15250, 15249, 15250, 15252, 15249, 15248, 15250, 15253, 15251, 15250, 15252, 15256, 15255, 15255, 15257, 15261, 15258, 15256, 15257, 15259, 15256, 15254, 15256, 15259, 15256, 15255, 15257, 15261, 15259, 15259, 15261, 15265, 15262, 15260, 15261, 15264, 15260, 15259, 15261, 15264, 15262, 15261, 15263, 15268, 15266, 15267, 15269, 15273, 15270, 15269, 15270, 15272, 15269, 15268, 15269, 15273, 15270, 15270, 15272, 15276, 15275, 15275, 15277, 15281, 15278, 15277, 15277, 15280, 15277, 15276, 15277, 15281, 15278, 15278, 15280, 15284, 15282, 15283, 15285, 15289, 15286, 15285, 15285, 15288, 15285, 15284, 15285, 15289, 15286, 15286, 15288, 15292, 15290, 15291, 15293, 15297, 15294, 15293, 15294, 15296, 15293, 15292, 15294, 15297, 15295, 15294, 15296, 15300, 15299, 15299, 15301, 15305, 15302, 15300, 15301, 15303, 15300, 15298, 15299, 15303, 15300, 15299, 15301, 15305, 15303, 15303, 15305, 15309, 15306, 15304, 15305, 15308, 15304, 15303, 15305, 15308, 15306, 15305, 15307, 15312, 15310, 15311, 15313, 15317, 15314, 15313, 15314, 15316, 15313, 15312, 15313, 15317, 15314, 15314, 15316, 15320, 15319, 15319, 15321, 15325, 15322, 15321, 15321, 15324, 15321, 15319, 15321, 15325, 15322, 15321, 15324, 15328, 15326, 15327, 15329, 15333, 15330, 15329, 15330, 15332, 15329, 15328, 15330, 15333, 15331, 15330, 15332, 15336, 15335, 15335, 15337, 15341, 15338, 15336, 15337, 15339, 15336, 15334, 15335, 15339, 15336, 15335, 15337, 15341, 15339, 15339, 15341, 15345, 15342, 15340, 15341, 15344, 15340, 15339, 15341, 15344, 15342, 15341, 15343, 15348, 15346, 15347, 15349, 15353, 15350, 15349, 15350, 15352, 15349, 15348, 15349, 15353, 15350, 15350, 15352, 15356, 15355, 15355, 15357, 15361, 15358, 15357, 15357, 15360, 15357, 15355, 15357, 15361, 15358, 15357, 15360, 15364, 15362, 15363, 15365, 15369, 15366, 15365, 15366, 15368, 15365, 15364, 15366, 15369, 15367, 15366, 15368, 15372, 15371, 15371, 15373, 15377, 15374, 15372, 15373, 15375, 15372, 15370, 15371, 15375, 15372, 15371, 15373, 15377, 15375, 15375, 15377, 15381, 15378, 15376, 15377, 15380, 15376, 15375, 15377, 15380, 15378, 15377, 15379, 15384, 15382, 15382, 15385, 15389, 15386, 15385, 15386, 15388, 15385, 15384, 15386, 15389, 15387, 15386, 15388, 15392, 15391, 15391, 15393, 15397, 15394, 15392, 15393, 15395, 15392, 15390, 15391, 15395, 15392, 15391, 15393, 15397, 15395, 15395, 15397, 15401, 15398, 15396, 15397, 15400, 15396, 15395, 15397, 15400, 15398, 15397, 15399, 15404, 15402, 15403, 15405, 15409, 15406, 15405, 15406, 15408, 15405, 15404, 15405, 15409, 15406, 15406, 15408, 15412, 15410, 15411, 15413, 15417, 15414, 15413, 15413, 15416, 15413, 15411, 15413, 15417, 15414, 15413, 15416, 15420, 15418, 15419, 15421, 15425, 15422, 15421, 15422, 15424, 15421, 15420, 15422, 15425, 15423, 15422, 15424, 15428, 15427, 15427, 15429, 15433, 15430, 15428, 15429, 15431, 15428, 15426, 15427, 15431, 15428, 15427, 15429, 15433, 15431, 15431, 15433, 15437, 15434, 15432, 15433, 15436, 15432, 15431, 15433, 15436, 15434, 15433, 15435, 15440, 15438, 15439, 15441, 15445, 15442, 15441, 15441, 15444, 15441, 15440, 15441, 15445, 15442, 15442, 15444, 15448, 15446, 15447, 15449, 15453, 15450, 15449, 15449, 15452, 15449, 15447, 15449, 15453, 15450, 15449, 15452, 15456, 15454, 15455, 15457, 15461, 15458, 15457, 15458, 15460, 15457, 15456, 15458, 15461, 15459, 15458, 15460, 15464, 15463, 15463, 15465, 15469, 15466, 15464, 15465, 15467, 15464, 15462, 15463, 15467, 15464, 15463, 15465, 15469, 15467, 15467, 15469, 15473, 15470, 15468, 15469, 15472, 15468, 15467, 15469, 15472, 15470, 15469, 15471, 15476, 15474, 15475, 15477, 15481, 15478, 15477, 15477, 15480, 15477, 15476, 15477, 15481, 15478, 15478, 15480, 15484, 15482, 15483, 15485, 15489, 15486, 15485, 15486, 15488, 15485, 15484, 15485, 15489, 15487, 15486, 15488, 15492, 15491, 15491, 15493, 15497, 15494, 15492, 15493, 15495, 15492, 15490, 15491, 15495, 15492, 15491, 15493, 15497, 15495, 15495, 15497, 15501, 15498, 15496, 15497, 15500, 15496, 15495, 15497, 15500, 15498, 15497, 15499, 15504, 15502, 15502, 15505, 15509, 15506, 15505, 15505, 15508, 15505, 15504, 15505, 15509, 15506, 15506, 15508, 15512, 15510, 15511, 15513, 15517, 15514, 15513, 15513, 15516, 15513, 15511, 15513, 15517, 15514, 15513, 15516, 15520, 15518, 15519, 15521, 15525, 15522, 15521, 15522, 15524, 15521, 15520, 15521, 15525, 15523, 15522, 15524, 15528, 15527, 15527, 15529, 15533, 15530, 15528, 15529, 15531, 15527, 15526, 15527, 15531, 15528, 15527, 15529, 15533, 15531, 15531, 15533, 15537, 15534, 15532, 15533, 15536, 15533, 15531, 15533, 15537, 15534, 15534, 15536, 15540, 15538, 15539, 15541, 15545, 15542, 15540, 15541, 15543, 15540, 15538, 15539, 15543, 15540, 15539, 15541, 15545, 15543, 15543, 15545, 15549, 15546, 15544, 15545, 15548, 15544, 15543, 15545, 15548, 15546, 15545, 15547, 15552, 15550, 15550, 15553, 15557, 15554, 15553, 15553, 15556, 15553, 15551, 15553, 15557, 15554, 15553, 15556, 15560, 15558, 15559, 15561, 15565, 15562, 15561, 15561, 15564, 15561, 15560, 15561, 15565, 15562, 15562, 15564, 15568, 15567, 15567, 15569, 15573, 15570, 15568, 15569, 15571, 15567, 15566, 15567, 15571, 15568, 15567, 15569, 15573, 15571, 15571, 15573, 15577, 15574, 15572, 15573, 15576, 15572, 15571, 15573, 15576, 15574, 15573, 15575, 15580, 15578, 15578, 15581, 15585, 15582, 15581, 15581, 15584, 15581, 15579, 15581, 15585, 15582, 15581, 15584, 15588, 15586, 15587, 15589, 15593, 15590, 15589, 15589, 15592, 15589, 15588, 15589, 15593, 15590, 15590, 15592, 15596, 15595, 15595, 15597, 15601, 15598, 15596, 15597, 15599, 15595, 15594, 15595, 15599, 15596, 15595, 15597, 15601, 15599, 15599, 15601, 15605, 15602, 15600, 15601, 15604, 15601, 15599, 15601, 15605, 15602, 15601, 15604, 15608, 15606, 15607, 15609, 15613, 15610, 15608, 15609, 15611, 15608, 15606, 15607, 15611, 15608, 15607, 15609, 15613, 15611, 15611, 15613, 15617, 15614, 15612, 15613, 15616, 15612, 15611, 15613, 15616, 15614, 15613, 15615, 15620, 15618, 15618, 15621, 15625, 15622, 15621, 15621, 15624, 15621, 15619, 15621, 15625, 15622, 15621, 15624, 15628, 15626, 15627, 15629, 15633, 15630, 15629, 15629, 15632, 15629, 15628, 15629, 15633, 15630, 15630, 15632, 15636, 15635, 15635, 15637, 15641, 15638, 15636, 15637, 15639, 15635, 15634, 15635, 15639, 15636, 15635, 15637, 15641, 15639, 15639, 15641, 15645, 15642, 15640, 15641, 15644, 15640, 15639, 15641, 15644, 15642, 15641, 15643, 15648, 15646, 15646, 15649, 15653, 15650, 15649, 15649, 15652, 15649, 15647, 15649, 15653, 15650, 15649, 15652, 15656, 15654, 15654, 15657, 15661, 15658, 15657, 15657, 15660, 15657, 15656, 15657, 15661, 15658, 15658, 15660, 15664, 15663, 15663, 15665, 15669, 15666, 15664, 15665, 15667, 15663, 15662, 15663, 15667, 15664, 15663, 15665, 15669, 15667, 15667, 15669, 15673, 15670, 15668, 15669, 15672, 15668, 15667, 15669, 15673, 15670, 15669, 15672, 15676, 15674, 15675, 15677, 15681, 15678, 15676, 15677, 15679, 15676, 15674, 15675, 15679, 15676, 15675, 15677, 15681, 15679, 15679, 15681, 15685, 15682, 15680, 15681, 15684, 15680, 15679, 15681, 15684, 15682, 15681, 15683, 15688, 15686, 15686, 15689, 15693, 15690, 15689, 15689, 15692, 15689, 15687, 15689, 15693, 15690, 15689, 15692, 15696, 15694, 15694, 15697, 15701, 15698, 15697, 15697, 15700, 15697, 15696, 15697, 15701, 15698, 15698, 15700, 15704, 15703, 15703, 15705, 15709, 15706, 15704, 15705, 15707, 15703, 15702, 15703, 15707, 15704, 15703, 15705, 15709, 15707, 15707, 15709, 15713, 15710, 15708, 15709, 15712, 15708, 15707, 15709, 15712, 15710, 15709, 15711, 15716, 15714, 15714, 15717, 15721, 15718, 15717, 15717, 15720, 15717, 15715, 15717, 15721, 15718, 15717, 15720, 15724, 15722, 15722, 15725, 15729, 15726, 15725, 15725, 15728, 15725, 15724, 15725, 15729, 15726, 15726, 15728, 15732, 15731, 15731, 15733, 15737, 15734, 15732, 15733, 15735, 15731, 15730, 15731, 15734, 15732, 15731, 15733, 15737, 15735, 15735, 15737, 15741, 15738, 15736, 15737, 15740, 15736, 15735, 15737, 15741, 15738, 15737, 15740, 15744, 15742, 15743, 15745, 15749, 15746, 15744, 15745, 15747, 15743, 15742, 15743, 15747, 15744, 15743, 15745, 15749, 15747, 15747, 15749, 15753, 15750, 15748, 15749, 15751, 15748, 15747, 15748, 15752, 15749, 15749, 15751, 15756, 15754, 15754, 15757, 15761, 15758, 15757, 15757, 15760, 15757, 15755, 15757, 15761, 15758, 15757, 15759, 15764, 15762, 15762, 15765, 15769, 15766, 15765, 15765, 15768, 15765, 15764, 15765, 15769, 15766, 15766, 15768, 15772, 15771, 15771, 15773, 15777, 15774, 15772, 15773, 15775, 15771, 15770, 15771, 15775, 15772, 15771, 15773, 15777, 15775, 15775, 15777, 15781, 15778, 15776, 15777, 15779, 15776, 15775, 15776, 15780, 15777, 15777, 15779, 15784, 15782, 15782, 15785, 15789, 15786, 15784, 15785, 15788, 15785, 15783, 15785, 15789, 15786, 15785, 15787, 15792, 15790, 15790, 15793, 15797, 15794, 15793, 15793, 15796, 15793, 15792, 15793, 15797, 15794, 15794, 15796, 15800, 15799, 15799, 15801, 15805, 15802, 15800, 15800, 15803, 15799, 15798, 15799, 15802, 15799, 15799, 15801, 15805, 15803, 15803, 15805, 15809, 15806, 15804, 15805, 15808, 15804, 15803, 15805, 15809, 15806, 15805, 15808, 15812, 15810, 15811, 15813, 15817, 15814, 15812, 15813, 15815, 15811, 15810, 15811, 15815, 15812, 15811, 15813, 15817, 15815, 15815, 15817, 15821, 15818, 15816, 15817, 15819, 15816, 15815, 15816, 15820, 15817, 15817, 15819, 15823, 15822, 15822, 15825, 15829, 15826, 15825, 15825, 15828, 15825, 15824, 15825, 15829, 15826, 15826, 15828, 15832, 15831, 15831, 15833, 15837, 15834, 15832, 15832, 15835, 15831, 15830, 15831, 15834, 15831, 15831, 15832, 15837, 15835, 15835, 15837, 15841, 15838, 15836, 15837, 15840, 15836, 15835, 15837, 15841, 15838, 15837, 15840, 15844, 15842, 15843, 15845, 15849, 15846, 15844, 15845, 15847, 15843, 15842, 15843, 15847, 15844, 15843, 15845, 15849, 15847, 15847, 15849, 15853, 15850, 15848, 15849, 15851, 15848, 15847, 15848, 15852, 15849, 15849, 15851, 15856, 15854, 15854, 15857, 15861, 15858, 15856, 15857, 15860, 15856, 15855, 15857, 15861, 15858, 15857, 15859, 15864, 15862, 15862, 15865, 15869, 15866, 15865, 15865, 15868, 15865, 15864, 15865, 15869, 15866, 15866, 15868, 15872, 15870, 15871, 15873, 15877, 15874, 15872, 15873, 15875, 15871, 15870, 15871, 15875, 15872, 15871, 15873, 15877, 15875, 15875, 15877, 15881, 15878, 15876, 15877, 15879, 15876, 15875, 15876, 15880, 15877, 15877, 15879, 15884, 15882, 15882, 15885, 15889, 15886, 15884, 15885, 15888, 15884, 15883, 15885, 15889, 15886, 15885, 15887, 15892, 15890, 15890, 15893, 15897, 15894, 15893, 15893, 15896, 15893, 15892, 15893, 15897, 15894, 15894, 15896, 15900, 15898, 15899, 15901, 15905, 15902, 15900, 15900, 15903, 15899, 15898, 15899, 15902, 15899, 15899, 15900, 15905, 15903, 15903, 15905, 15909, 15906, 15904, 15905, 15908, 15904, 15903, 15905, 15909, 15906, 15905, 15908, 15912, 15910, 15911, 15913, 15917, 15914, 15912, 15913, 15915, 15911, 15910, 15911, 15915, 15912, 15911, 15913, 15917, 15915, 15915, 15917, 15921, 15918, 15916, 15917, 15919, 15916, 15915, 15916, 15920, 15917, 15917, 15919, 15924, 15922, 15922, 15925, 15929, 15926, 15924, 15925, 15928, 15925, 15923, 15925, 15929, 15926, 15925, 15928, 15932, 15930, 15930, 15933, 15937, 15934, 15932, 15933, 15936, 15932, 15931, 15933, 15936, 15934, 15933, 15935, 15940, 15938, 15938, 15941, 15945, 15942, 15941, 15941, 15944, 15941, 15940, 15941, 15945, 15942, 15942, 15944, 15948, 15946, 15947, 15949, 15953, 15950, 15948, 15948, 15951, 15947, 15946, 15947, 15950, 15947, 15946, 15948, 15953, 15951, 15951, 15953, 15957, 15954, 15952, 15953, 15956, 15952, 15951, 15953, 15957, 15954, 15953, 15955, 15960, 15958, 15958, 15961, 15965, 15962, 15960, 15961, 15963, 15959, 15958, 15959, 15963, 15960, 15959, 15961, 15965, 15963, 15963, 15965, 15969, 15966, 15964, 15965, 15967, 15964, 15963, 15964, 15968, 15965, 15965, 15967, 15972, 15970, 15970, 15973, 15977, 15974, 15972, 15973, 15976, 15972, 15971, 15973, 15976, 15974, 15973, 15975, 15980, 15978, 15978, 15981, 15985, 15982, 15980, 15981, 15984, 15981, 15980, 15981, 15985, 15982, 15982, 15984, 15988, 15986, 15987, 15989, 15993, 15990, 15988, 15988, 15991, 15987, 15986, 15987, 15990, 15987, 15987, 15989, 15993, 15991, 15991, 15993, 15997, 15994, 15992, 15993, 15995, 15992, 15991, 15992, 15996, 15993, 15993, 15995, 16000, 15998, 15998, 16001, 16005, 16002, 16000, 16001, 16004, 16000, 15999, 16001, 16004, 16002, 16001, 16003, 16008, 16006, 16006, 16009, 16013, 16010, 16008, 16009, 16012, 16009, 16008, 16009, 16013, 16010, 16010, 16012, 16016, 16014, 16015, 16017, 16021, 16018, 16016, 16016, 16019, 16015, 16014, 16015, 16018, 16015, 16014, 16016, 16021, 16019, 16019, 16021, 16025, 16022, 16020, 16021, 16024, 16020, 16019, 16021, 16024, 16022, 16021, 16023, 16028, 16026, 16026, 16029, 16033, 16030, 16028, 16029, 16031, 16027, 16026, 16027, 16031, 16028, 16027, 16029, 16033, 16031, 16031, 16033, 16037, 16034, 16032, 16033, 16035, 16032, 16031, 16032, 16036, 16033, 16033, 16035, 16039, 16038, 16038, 16041, 16045, 16042, 16040, 16041, 16044, 16040, 16039, 16041, 16044, 16042, 16041, 16043, 16048, 16046, 16046, 16049, 16053, 16050, 16048, 16049, 16052, 16049, 16047, 16049, 16053, 16050, 16050, 16052, 16056, 16054, 16055, 16057, 16061, 16058, 16056, 16056, 16059, 16055, 16054, 16055, 16058, 16055, 16054, 16056, 16061, 16059, 16059, 16061, 16065, 16062, 16060, 16061, 16064, 16060, 16059, 16061, 16064, 16062, 16061, 16063, 16068, 16066, 16066, 16069, 16073, 16070, 16068, 16069, 16071, 16067, 16066, 16067, 16071, 16068, 16067, 16069, 16073, 16071, 16071, 16073, 16077, 16074, 16072, 16073, 16075, 16072, 16071, 16072, 16076, 16073, 16073, 16075, 16079, 16078, 16078, 16081, 16085, 16082, 16080, 16081, 16084, 16080, 16079, 16081, 16085, 16082, 16081, 16083, 16088, 16086, 16086, 16089, 16093, 16090, 16088, 16089, 16092, 16088, 16087, 16089, 16092, 16090, 16089, 16091, 16096, 16094, 16094, 16097, 16101, 16098, 16096, 16097, 16100, 16097, 16095, 16097, 16101, 16098, 16098, 16100, 16104, 16102, 16103, 16105, 16109, 16106, 16104, 16104, 16107, 16103, 16101, 16103, 16106, 16103, 16102, 16104, 16109, 16107, 16107, 16109, 16113, 16110, 16108, 16109, 16112, 16108, 16107, 16109, 16112, 16110, 16109, 16111, 16116, 16114, 16114, 16117, 16121, 16118, 16116, 16116, 16119, 16115, 16114, 16115, 16119, 16116, 16115, 16117, 16121, 16119, 16119, 16121, 16125, 16122, 16120, 16121, 16123, 16120, 16119, 16120, 16124, 16121, 16121, 16123, 16127, 16126, 16126, 16129, 16133, 16130, 16128, 16129, 16132, 16128, 16127, 16129, 16132, 16130, 16129, 16131, 16136, 16134, 16134, 16137, 16141, 16138, 16136, 16137, 16140, 16137, 16135, 16137, 16141, 16138, 16137, 16140, 16144, 16142, 16143, 16145, 16149, 16146, 16144, 16144, 16147, 16143, 16141, 16143, 16146, 16143, 16142, 16144, 16149, 16147, 16147, 16149, 16153, 16150, 16148, 16149, 16152, 16148, 16147, 16149, 16152, 16150, 16149, 16151, 16156, 16154, 16154, 16157, 16161, 16158, 16156, 16156, 16159, 16155, 16154, 16155, 16159, 16155, 16155, 16157, 16161, 16159, 16159, 16161, 16165, 16162, 16160, 16161, 16163, 16160, 16159, 16160, 16164, 16161, 16161, 16163, 16167, 16166, 16166, 16169, 16173, 16170, 16168, 16169, 16172, 16168, 16167, 16169, 16173, 16170, 16169, 16171, 16176, 16174, 16174, 16177, 16181, 16178, 16176, 16177, 16180, 16176, 16175, 16176, 16180, 16177, 16177, 16179, 16184, 16182, 16182, 16185, 16189, 16186, 16184, 16185, 16188, 16185, 16183, 16185, 16189, 16186, 16185, 16188, 16192, 16190, 16191, 16193, 16197, 16194, 16192, 16192, 16195, 16191, 16189, 16191, 16194, 16191, 16190, 16192, 16196, 16195, 16195, 16197, 16201, 16198, 16196, 16197, 16200, 16196, 16195, 16197, 16200, 16198, 16197, 16199, 16204, 16202, 16202, 16205, 16209, 16206, 16204, 16204, 16207, 16203, 16202, 16203, 16207, 16203, 16203, 16204, 16209, 16207, 16207, 16209, 16213, 16210, 16208, 16209, 16211, 16208, 16207, 16208, 16212, 16209, 16209, 16211, 16215, 16214, 16214, 16217, 16221, 16218, 16216, 16217, 16220, 16216, 16215, 16217, 16220, 16218, 16217, 16219, 16224, 16222, 16222, 16225, 16229, 16226, 16224, 16225, 16228, 16225, 16223, 16225, 16229, 16226, 16225, 16228, 16232, 16230, 16230, 16233, 16237, 16234, 16232, 16232, 16235, 16231, 16229, 16231, 16234, 16231, 16230, 16232, 16236, 16235, 16235, 16237, 16241, 16238, 16236, 16237, 16240, 16236, 16235, 16237, 16240, 16238, 16237, 16239, 16244, 16242, 16242, 16245, 16249, 16246, 16244, 16244, 16247, 16243, 16242, 16243, 16247, 16243, 16243, 16244, 16249, 16247, 16247, 16249, 16253, 16250, 16248, 16249, 16251, 16248, 16246, 16248, 16252, 16249, 16249, 16251, 16255, 16254, 16254, 16257, 16261, 16258, 16256, 16257, 16260, 16256, 16255, 16257, 16261, 16258, 16257, 16259, 16264, 16262, 16262, 16265, 16269, 16266, 16264, 16265, 16268, 16264, 16263, 16264, 16268, 16265, 16265, 16267, 16272, 16270, 16270, 16273, 16277, 16274, 16272, 16273, 16276, 16273, 16271, 16273, 16277, 16274, 16273, 16276, 16280, 16278, 16278, 16281, 16285, 16282, 16280, 16280, 16283, 16279, 16277, 16279, 16282, 16279, 16278, 16280, 16284, 16282, 16283, 16285, 16289, 16286, 16284, 16285, 16288, 16284, 16283, 16285, 16288, 16286, 16285, 16287, 16292, 16290, 16290, 16293, 16297, 16294, 16292, 16292, 16295, 16291, 16290, 16291, 16294, 16291, 16290, 16292, 16297, 16295, 16295, 16297, 16301, 16298, 16296, 16297, 16299, 16296, 16294, 16296, 16300, 16297, 16297, 16299, 16303, 16302, 16302, 16305, 16309, 16306, 16304, 16305, 16308, 16304, 16303, 16305, 16308, 16306, 16305, 16307, 16312, 16310, 16310, 16313, 16317, 16314, 16312, 16313, 16316, 16312, 16311, 16313, 16317, 16314, 16313, 16316, 16320, 16318, 16318, 16321, 16325, 16322, 16320, 16320, 16323, 16319, 16317, 16319, 16322, 16319, 16318, 16320, 16324, 16322, 16322, 16325, 16329, 16326, 16324, 16325, 16328, 16324, 16323, 16324, 16328, 16326, 16325, 16327, 16332, 16330, 16330, 16333, 16337, 16334, 16332, 16332, 16335, 16331, 16330, 16331, 16334, 16331, 16330, 16332, 16337, 16335, 16335, 16337, 16341, 16338, 16336, 16337, 16339, 16336, 16334, 16336, 16340, 16337, 16336, 16339, 16343, 16342, 16342, 16345, 16349, 16346, 16344, 16345, 16348, 16344, 16343, 16345, 16349, 16346, 16345, 16347, 16352, 16350, 16350, 16353, 16357, 16354, 16352, 16353, 16355, 16352, 16351, 16352, 16356, 16353, 16353, 16355, 16359, 16358, 16358, 16361, 16365, 16362, 16360, 16361, 16364, 16361, 16360, 16362, 16366, 16363, 16363, 16366, 16370, 16369, 16369, 16372, 16377, 16374, 16373, 16374, 16377, 16374, 16373, 16375, 16379, 16376, 16376, 16379, 16383, 16381, 16381, 16383] + is_save: false + +auto_exposure: + is_enable: true + is_debug: true + center_illuminance: 90 + histogram_skewness: 0.9 + + +color_space_conversion: + conv_standard: 2 + # Bt.709 HD = 1 + # Bt.601/4407 = 2 + is_save: false + + +ldci: + is_enable: false + clip_limit: 1 + wind: 16 + is_save: false + +sharpen: + is_enable: true + sharpen_sigma: 5 + sharpen_strength: 1 + is_save: false + +2d_noise_reduction: + is_enable: false + # nlm + window_size: 21 + patch_size: 9 + wts: 10 + is_save: false + +rgb_conversion: + is_enable: true + is_save: false + +scale: + is_enable: false + is_debug: true + new_width: 1920 + new_height: 1080 + isHardware: true + # Nearest_Neighbor # Bilinear + Algo: "Nearest_Neighbor" + upscale_method: "Nearest_Neighbor" + downscale_method: "Bilinear" + is_save: false + +yuv_conversion_format: + # The conversion wont run if csc is false + is_enable: false + conv_type: '444' + is_save: false + +pre_gamma: + is_enable: false + is_save: false + +tone_mapping: + is_enable: false + is_save: false + +jpeg_conversion: + is_enable: false + is_save: false diff --git a/in_frames/normal/Outdoor2_2592x1536_12bit_RGGB.raw b/in_frames/normal/data/Outdoor2_2592x1536_12bit_RGGB.raw similarity index 100% rename from in_frames/normal/Outdoor2_2592x1536_12bit_RGGB.raw rename to in_frames/normal/data/Outdoor2_2592x1536_12bit_RGGB.raw diff --git a/in_frames/normal/data/Outdoor3_2592x1536_12bit_RGGB-configs.yml b/in_frames/normal/data/Outdoor3_2592x1536_12bit_RGGB-configs.yml new file mode 100644 index 0000000..e3ad8df --- /dev/null +++ b/in_frames/normal/data/Outdoor3_2592x1536_12bit_RGGB-configs.yml @@ -0,0 +1,184 @@ +platform: + filename: "Outdoor3_2592x1536_12bit_RGGB.raw" + disable_progress_bar: false + leave_pbar_string: false + render_3a: false + # npy, png or both + save_format: both + +sensor_info: + bayer_pattern: "rggb" + range: 1023 + bit_depth: 12 + width: 2592 + height: 1536 + +crop: + is_enable: false + is_debug: false + new_width: 1280 + new_height: 720 + is_save: false + +dead_pixel_correction: + is_enable: false + dp_threshold: 80 + is_debug: true + is_save: false + +hdr_stitching: + is_enable: false + +black_level_correction: + is_enable: true + r_offset: 200 + gr_offset: 200 + gb_offset: 200 + b_offset: 200 + is_linear: false + r_sat: 4095 + gr_sat: 4095 + gb_sat: 4095 + b_sat: 4095 + is_save: false + +OECF: + is_enable: false + # Make sure the LUT has the right bit range i.e. if image is of 10 bit LUT should be from [0 - (2^10)-1] + # LUT here does nothing to the sensor response i.e. a value of 800 maps to 800 and 2000 maps to 2000 + r_lut: [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2094,2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,2480,2481,2482,2483,2484,2485,2486,2487,2488,2489,2490,2491,2492,2493,2494,2495,2496,2497,2498,2499,2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559,2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574,2575,2576,2577,2578,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2601,2602,2603,2604,2605,2606,2607,2608,2609,2610,2611,2612,2613,2614,2615,2616,2617,2618,2619,2620,2621,2622,2623,2624,2625,2626,2627,2628,2629,2630,2631,2632,2633,2634,2635,2636,2637,2638,2639,2640,2641,2642,2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658,2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,2691,2692,2693,2694,2695,2696,2697,2698,2699,2700,2701,2702,2703,2704,2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2729,2730,2731,2732,2733,2734,2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,2751,2752,2753,2754,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,2766,2767,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2780,2781,2782,2783,2784,2785,2786,2787,2788,2789,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,2810,2811,2812,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2857,2858,2859,2860,2861,2862,2863,2864,2865,2866,2867,2868,2869,2870,2871,2872,2873,2874,2875,2876,2877,2878,2879,2880,2881,2882,2883,2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,2962,2963,2964,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020,3021,3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069,3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3113,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174,3175,3176,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,3188,3189,3190,3191,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,3278,3279,3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295,3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327,3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343,3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,3388,3389,3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405,3406,3407,3408,3409,3410,3411,3412,3413,3414,3415,3416,3417,3418,3419,3420,3421,3422,3423,3424,3425,3426,3427,3428,3429,3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443,3444,3445,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3456,3457,3458,3459,3460,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,3512,3513,3514,3515,3516,3517,3518,3519,3520,3521,3522,3523,3524,3525,3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541,3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557,3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573,3574,3575,3576,3577,3578,3579,3580,3581,3582,3583,3584,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695,3696,3697,3698,3699,3700,3701,3702,3703,3704,3705,3706,3707,3708,3709,3710,3711,3712,3713,3714,3715,3716,3717,3718,3719,3720,3721,3722,3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744,3745,3746,3747,3748,3749,3750,3751,3752,3753,3754,3755,3756,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,3767,3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,3779,3780,3781,3782,3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3802,3803,3804,3805,3806,3807,3808,3809,3810,3811,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,3822,3823,3824,3825,3826,3827,3828,3829,3830,3831,3832,3833,3834,3835,3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847,3848,3849,3850,3851,3852,3853,3854,3855,3856,3857,3858,3859,3860,3861,3862,3863,3864,3865,3866,3867,3868,3869,3870,3871,3872,3873,3874,3875,3876,3877,3878,3879,3880,3881,3882,3883,3884,3885,3886,3887,3888,3889,3890,3891,3892,3893,3894,3895,3896,3897,3898,3899,3900,3901,3902,3903,3904,3905,3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,3940,3941,3942,3943,3944,3945,3946,3947,3948,3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,3978,3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,3992,3993,3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,4056,4057,4058,4059,4060,4061,4062,4063,4064,4065,4066,4067,4068,4069,4070,4071,4072,4073,4074,4075,4076,4077,4078,4079,4080,4081,4082,4083,4084,4085,4086,4087,4088,4089,4090,4091,4092,4093,4094,4095] + is_save: false + +digital_gain: + is_debug: true + is_auto: true + # Array of pre-define Gains + gain_array: [1, 2, 4, 6, 8, 10, 12, 16, 32, 64] + # Index of default gain + current_gain: 0 + ae_feedback: 0 + is_save: false + +lens_shading_correction: + is_enable: false + is_save: false + +bayer_noise_reduction: + is_enable: true + filter_window: 9 + r_std_dev_s: 1 + r_std_dev_r: 0.1 + g_std_dev_s: 1 + g_std_dev_r: 0.08 + b_std_dev_s: 1 + b_std_dev_r: 0.1 + is_save: false + +auto_white_balance: + is_enable: true + is_debug: true + underexposed_percentage: 5 + overexposed_percentage: 5 + algorithm: "norm_2" + # grey_world, norm_2, pca + percentage: 3.5 # pca + +white_balance: + is_enable: true + # is_auto refers to auto white balance module + is_debug: true + is_auto: true + r_gain: 1.768566 + b_gain: 1.641026 + is_save: false + +demosaic: + is_save: false + +color_correction_matrix: + #Row sum to 1 convention + is_enable: true + corrected_red: [ 1.87578, -0.59375, -0.08203125 ] + corrected_green: [ -0.2421875, 1.5078125, -0.265625 ] + corrected_blue: [ -0.0078125, -0.44921875, 1.35703125 ] + is_save: false + +gamma_correction: + is_enable: true + # 8-bit + gamma_lut_8: [0, 5, 9, 13, 17, 22, 25, 29, 33, 37, 40, 44, 47, 50, 54, 57, 60, 63, 66, 69, 72, 75, 78, 80, 83, 85, 88, 90, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113, 115, 117, 118, 120, 122, 123, 125, 126, 128, 129, 131, 132, 134, 135, 136, 138, 139, 140, 141, 142, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 162, 163, 164, 165, 166, 167, 167, 168, 169, 170, 171, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 179, 179, 180, 181, 181, 182, 183, 183, 184, 185, 185, 186, 187, 187, 188, 188, 189, 190, 190, 191, 191, 192, 193, 193, 194, 194, 195, 195, 196, 197, 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 205, 205, 206, 206, 207, 207, 208, 208, 209, 209, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 216, 217, 217, 218, 218, 219, 219, 220, 220, 221, 221, 221, 222, 222, 223, 223, 224, 224, 225, 225, 225, 226, 226, 227, 227, 228, 228, 228, 229, 229, 230, 230, 231, 231, 231, 232, 232, 233, 233, 234, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240, 241, 241, 241, 242, 242, 243, 243, 244, 244, 244, 245, 245, 246, 246, 247, 247, 247, 248, 248, 249, 249, 250, 250, 250, 251, 251, 252, 252, 252, 253, 253, 254, 254, 255] + # 10-bit + gamma_lut_10: [0, 9, 13, 17, 21, 25, 29, 34, 38, 42, 46, 50, 54, 58, 62, 66, 70, 74, 78, 82, 86, 90, 94, 98, 102, 106, 110, 114, 117, 121, 125, 129, 132, 136, 140, 143, 147, 150, 154, 157, 161, 165, 168, 172, 175, 179, 182, 185, 189, 192, 196, 199, 202, 205, 209, 212, 215, 219, 222, 225, 228, 231, 235, 238, 241, 244, 247, 250, 253, 256, 259, 262, 265, 268, 271, 274, 277, 280, 283, 286, 289, 292, 295, 297, 300, 303, 306, 308, 311, 314, 317, 319, 322, 325, 327, 330, 332, 335, 337, 340, 342, 345, 347, 350, 352, 355, 357, 359, 362, 364, 367, 369, 371, 374, 376, 378, 380, 383, 385, 387, 389, 392, 394, 396, 398, 400, 402, 404, 406, 409, 411, 413, 415, 417, 419, 421, 423, 425, 427, 429, 431, 433, 435, 437, 439, 441, 443, 444, 446, 448, 450, 452, 454, 455, 457, 459, 461, 463, 464, 466, 468, 469, 471, 473, 474, 476, 478, 479, 481, 483, 484, 486, 488, 489, 491, 492, 494, 495, 497, 499, 500, 502, 503, 505, 506, 508, 509, 511, 513, 514, 516, 517, 519, 520, 521, 523, 524, 526, 527, 529, 530, 532, 533, 534, 536, 537, 539, 540, 541, 543, 544, 545, 547, 548, 549, 550, 552, 553, 554, 555, 557, 558, 559, 560, 562, 563, 564, 565, 567, 568, 569, 570, 571, 573, 574, 575, 576, 577, 578, 580, 581, 582, 583, 584, 585, 586, 588, 589, 590, 591, 592, 593, 594, 595, 596, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 633, 634, 635, 636, 637, 638, 639, 640, 641, 641, 642, 643, 644, 645, 646, 647, 648, 649, 649, 650, 651, 652, 653, 654, 655, 655, 656, 657, 658, 659, 660, 660, 661, 662, 663, 664, 665, 665, 666, 667, 668, 669, 670, 670, 671, 672, 673, 674, 674, 675, 676, 677, 678, 678, 679, 680, 681, 681, 682, 683, 683, 684, 685, 686, 686, 687, 688, 689, 689, 690, 691, 692, 692, 693, 694, 695, 695, 696, 697, 697, 698, 699, 700, 700, 701, 702, 703, 703, 704, 705, 705, 706, 707, 708, 708, 709, 710, 710, 711, 712, 713, 713, 714, 715, 715, 716, 717, 717, 718, 719, 719, 720, 721, 722, 722, 723, 724, 724, 725, 726, 726, 727, 728, 728, 729, 730, 731, 731, 732, 733, 733, 734, 734, 735, 736, 736, 737, 738, 738, 739, 740, 740, 741, 742, 742, 743, 744, 744, 745, 745, 746, 747, 747, 748, 749, 749, 750, 751, 751, 752, 753, 753, 754, 754, 755, 756, 756, 757, 757, 758, 759, 759, 760, 761, 761, 762, 762, 763, 763, 764, 765, 765, 766, 766, 767, 768, 768, 769, 769, 770, 771, 771, 772, 772, 773, 774, 774, 775, 775, 776, 776, 777, 777, 778, 779, 779, 780, 780, 781, 782, 782, 783, 783, 784, 784, 785, 785, 786, 787, 787, 788, 788, 789, 789, 790, 791, 791, 792, 792, 793, 793, 794, 794, 795, 795, 796, 797, 797, 797, 798, 799, 799, 800, 800, 801, 801, 802, 802, 803, 803, 804, 805, 805, 806, 806, 806, 807, 808, 808, 809, 809, 810, 810, 811, 811, 812, 812, 813, 813, 814, 814, 815, 815, 816, 816, 817, 817, 818, 818, 819, 819, 820, 821, 821, 821, 822, 823, 823, 824, 824, 825, 825, 826, 826, 827, 827, 828, 828, 829, 829, 830, 830, 831, 831, 832, 832, 833, 833, 834, 834, 835, 835, 836, 836, 837, 837, 838, 838, 839, 839, 839, 840, 841, 841, 842, 842, 842, 843, 843, 844, 845, 845, 845, 846, 846, 847, 847, 848, 848, 849, 849, 850, 850, 851, 851, 852, 852, 853, 853, 854, 854, 855, 855, 856, 856, 857, 857, 858, 858, 859, 859, 860, 860, 861, 861, 862, 862, 863, 863, 864, 864, 865, 865, 866, 866, 867, 867, 868, 868, 868, 869, 870, 870, 870, 871, 871, 872, 872, 873, 873, 874, 874, 875, 875, 876, 876, 877, 877, 878, 878, 879, 879, 880, 880, 881, 881, 881, 882, 882, 883, 883, 884, 884, 885, 885, 886, 886, 887, 887, 887, 888, 888, 889, 889, 890, 890, 891, 891, 892, 892, 892, 893, 893, 894, 894, 895, 895, 896, 896, 896, 897, 897, 898, 898, 899, 899, 900, 900, 900, 901, 901, 902, 902, 903, 903, 903, 904, 904, 905, 905, 906, 906, 906, 907, 907, 908, 908, 909, 909, 910, 910, 910, 911, 911, 912, 912, 913, 913, 913, 914, 914, 915, 915, 916, 916, 916, 917, 917, 918, 918, 919, 919, 919, 920, 920, 921, 921, 922, 922, 922, 923, 923, 924, 924, 925, 925, 925, 926, 926, 927, 927, 928, 928, 928, 929, 929, 930, 930, 931, 931, 931, 932, 932, 933, 933, 934, 934, 934, 935, 935, 936, 936, 936, 937, 937, 938, 938, 939, 939, 939, 940, 940, 941, 941, 942, 942, 943, 943, 943, 944, 944, 945, 945, 946, 946, 947, 947, 947, 948, 948, 949, 949, 950, 950, 951, 951, 951, 952, 952, 953, 953, 954, 954, 955, 955, 956, 956, 956, 957, 957, 958, 958, 959, 959, 960, 960, 961, 961, 961, 962, 962, 963, 963, 964, 964, 964, 965, 965, 966, 966, 967, 967, 968, 968, 968, 969, 969, 970, 970, 971, 971, 971, 972, 972, 973, 973, 974, 974, 975, 975, 975, 976, 976, 977, 977, 977, 978, 978, 979, 979, 980, 980, 980, 981, 981, 982, 982, 983, 983, 983, 984, 984, 985, 985, 986, 986, 986, 987, 987, 988, 988, 988, 989, 989, 990, 990, 990, 991, 991, 992, 992, 993, 993, 994, 994, 994, 995, 995, 996, 996, 997, 997, 997, 998, 998, 999, 999, 999, 1000, 1000, 1001, 1001, 1002, 1002, 1002, 1003, 1003, 1004, 1004, 1004, 1005, 1005, 1006, 1006, 1007, 1007, 1007, 1008, 1008, 1009, 1009, 1010, 1010, 1010, 1011, 1011, 1012, 1012, 1013, 1013, 1013, 1014, 1014, 1015, 1015, 1015, 1016, 1016, 1017, 1017, 1018, 1018, 1018, 1019, 1019, 1020, 1020, 1021, 1021, 1021, 1022, 1022, 1023, 1023] + # 12-bit + gamma_lut_12: [0, 11, 21, 30, 37, 42, 46, 50, 53, 57, 61, 65, 70, 74, 78, 82, 86, 90, 94, 98, 102, 106, 110, 114, 118, 122, 126, 131, 135, 139, 143, 147, 151, 155, 159, 163, 167, 171, 175, 179, 183, 187, 191, 195, 199, 203, 207, 212, 216, 220, 224, 228, 232, 236, 240, 245, 249, 253, 257, 261, 265, 269, 273, 277, 281, 285, 289, 293, 297, 301, 305, 309, 313, 317, 321, 326, 330, 334, 338, 342, 346, 350, 354, 358, 362, 365, 369, 373, 377, 381, 385, 390, 394, 398, 401, 405, 409, 413, 417, 421, 425, 429, 432, 436, 440, 443, 447, 451, 455, 458, 462, 466, 470, 473, 477, 481, 485, 488, 492, 496, 500, 503, 507, 511, 515, 519, 522, 526, 530, 533, 537, 540, 544, 547, 551, 555, 559, 562, 566, 569, 573, 576, 580, 584, 588, 591, 595, 598, 602, 605, 609, 612, 616, 619, 622, 626, 630, 633, 637, 641, 645, 648, 652, 655, 659, 662, 665, 669, 673, 676, 680, 683, 687, 690, 693, 696, 700, 703, 707, 711, 715, 718, 721, 724, 728, 731, 734, 738, 742, 745, 749, 752, 756, 759, 762, 765, 769, 772, 775, 779, 783, 786, 789, 792, 796, 799, 802, 805, 809, 812, 815, 818, 822, 825, 828, 832, 836, 839, 842, 845, 849, 852, 855, 858, 862, 865, 868, 871, 875, 878, 881, 884, 888, 890, 893, 896, 900, 903, 906, 910, 914, 917, 920, 923, 926, 929, 932, 935, 939, 942, 945, 948, 952, 954, 957, 960, 964, 967, 970, 973, 977, 979, 982, 985, 989, 992, 995, 998, 1002, 1005, 1007, 1010, 1014, 1016, 1019, 1022, 1026, 1028, 1031, 1034, 1038, 1040, 1043, 1046, 1050, 1052, 1055, 1058, 1062, 1064, 1067, 1070, 1074, 1076, 1079, 1082, 1086, 1088, 1091, 1094, 1098, 1100, 1103, 1106, 1110, 1112, 1115, 1118, 1121, 1123, 1126, 1129, 1133, 1135, 1138, 1141, 1145, 1147, 1150, 1153, 1156, 1158, 1161, 1163, 1167, 1169, 1172, 1175, 1179, 1181, 1184, 1187, 1190, 1192, 1195, 1198, 1201, 1203, 1206, 1209, 1212, 1214, 1217, 1220, 1223, 1225, 1228, 1231, 1234, 1236, 1239, 1242, 1245, 1247, 1250, 1253, 1256, 1258, 1261, 1264, 1267, 1269, 1271, 1274, 1277, 1279, 1282, 1284, 1288, 1290, 1293, 1296, 1299, 1301, 1303, 1306, 1309, 1311, 1314, 1317, 1320, 1322, 1324, 1327, 1330, 1332, 1335, 1338, 1341, 1343, 1345, 1347, 1350, 1352, 1355, 1358, 1360, 1363, 1365, 1367, 1369, 1372, 1375, 1378, 1380, 1383, 1385, 1387, 1389, 1392, 1395, 1397, 1400, 1403, 1405, 1407, 1409, 1412, 1414, 1417, 1419, 1422, 1424, 1427, 1429, 1431, 1434, 1436, 1438, 1441, 1443, 1446, 1448, 1451, 1453, 1456, 1458, 1461, 1463, 1465, 1467, 1469, 1471, 1474, 1476, 1479, 1481, 1484, 1486, 1488, 1491, 1493, 1495, 1497, 1499, 1502, 1504, 1506, 1509, 1511, 1513, 1515, 1518, 1520, 1522, 1524, 1527, 1529, 1531, 1533, 1535, 1538, 1540, 1542, 1544, 1547, 1549, 1551, 1553, 1556, 1558, 1560, 1563, 1565, 1567, 1569, 1571, 1573, 1575, 1577, 1579, 1582, 1584, 1586, 1588, 1590, 1592, 1594, 1596, 1599, 1601, 1603, 1605, 1607, 1609, 1611, 1613, 1616, 1618, 1620, 1622, 1624, 1626, 1628, 1630, 1633, 1635, 1637, 1639, 1641, 1643, 1645, 1647, 1650, 1652, 1654, 1656, 1658, 1660, 1662, 1664, 1666, 1668, 1670, 1672, 1674, 1676, 1678, 1680, 1682, 1684, 1686, 1688, 1691, 1693, 1695, 1697, 1699, 1701, 1703, 1705, 1707, 1709, 1711, 1713, 1715, 1717, 1719, 1721, 1723, 1725, 1727, 1728, 1730, 1732, 1734, 1736, 1738, 1740, 1742, 1744, 1746, 1748, 1750, 1751, 1753, 1755, 1757, 1759, 1761, 1763, 1765, 1767, 1769, 1771, 1773, 1774, 1776, 1778, 1780, 1782, 1784, 1786, 1788, 1789, 1791, 1793, 1795, 1796, 1798, 1800, 1802, 1803, 1805, 1807, 1809, 1811, 1813, 1815, 1817, 1818, 1820, 1822, 1824, 1825, 1827, 1829, 1831, 1832, 1834, 1836, 1838, 1839, 1841, 1843, 1845, 1847, 1849, 1851, 1853, 1854, 1856, 1857, 1858, 1860, 1862, 1864, 1866, 1868, 1870, 1872, 1874, 1875, 1876, 1878, 1880, 1881, 1883, 1885, 1887, 1888, 1890, 1892, 1893, 1895, 1896, 1898, 1900, 1901, 1903, 1905, 1907, 1908, 1910, 1912, 1913, 1915, 1916, 1918, 1920, 1921, 1923, 1925, 1927, 1928, 1930, 1932, 1933, 1935, 1936, 1938, 1940, 1941, 1943, 1945, 1947, 1948, 1949, 1951, 1952, 1954, 1955, 1957, 1959, 1960, 1962, 1964, 1965, 1967, 1968, 1970, 1972, 1973, 1975, 1977, 1978, 1979, 1981, 1982, 1983, 1985, 1987, 1989, 1990, 1992, 1993, 1995, 1997, 1998, 2000, 2002, 2003, 2005, 2006, 2008, 2009, 2011, 2012, 2014, 2015, 2017, 2018, 2020, 2021, 2023, 2024, 2026, 2027, 2029, 2030, 2032, 2033, 2035, 2036, 2038, 2039, 2041, 2042, 2044, 2046, 2047, 2049, 2051, 2052, 2053, 2055, 2056, 2057, 2059, 2061, 2063, 2064, 2066, 2067, 2069, 2070, 2072, 2073, 2075, 2076, 2077, 2079, 2080, 2081, 2083, 2084, 2086, 2087, 2089, 2090, 2092, 2093, 2095, 2096, 2098, 2099, 2101, 2102, 2104, 2105, 2107, 2108, 2110, 2111, 2112, 2114, 2115, 2116, 2117, 2119, 2121, 2122, 2124, 2125, 2127, 2128, 2129, 2130, 2132, 2133, 2135, 2136, 2138, 2139, 2140, 2142, 2143, 2144, 2145, 2147, 2149, 2150, 2152, 2153, 2155, 2156, 2157, 2159, 2160, 2161, 2162, 2163, 2165, 2166, 2168, 2169, 2171, 2172, 2173, 2175, 2176, 2177, 2178, 2179, 2181, 2182, 2184, 2185, 2187, 2188, 2189, 2191, 2192, 2193, 2194, 2195, 2197, 2198, 2199, 2200, 2202, 2203, 2205, 2206, 2208, 2209, 2210, 2212, 2213, 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2222, 2223, 2225, 2226, 2228, 2229, 2230, 2232, 2233, 2234, 2235, 2237, 2238, 2239, 2240, 2241, 2242, 2243, 2244, 2245, 2247, 2248, 2249, 2250, 2252, 2253, 2255, 2256, 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274, 2276, 2277, 2278, 2279, 2281, 2282, 2283, 2284, 2286, 2287, 2288, 2289, 2291, 2292, 2293, 2295, 2296, 2297, 2297, 2299, 2300, 2301, 2302, 2303, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2314, 2315, 2316, 2318, 2319, 2320, 2320, 2322, 2323, 2324, 2325, 2326, 2328, 2329, 2330, 2332, 2333, 2334, 2334, 2336, 2337, 2338, 2339, 2340, 2342, 2343, 2343, 2345, 2346, 2347, 2348, 2349, 2351, 2352, 2353, 2354, 2355, 2356, 2356, 2358, 2359, 2360, 2361, 2362, 2364, 2365, 2365, 2367, 2368, 2369, 2370, 2371, 2373, 2374, 2374, 2376, 2377, 2378, 2379, 2380, 2382, 2383, 2383, 2385, 2386, 2387, 2388, 2389, 2391, 2392, 2393, 2394, 2395, 2396, 2396, 2398, 2399, 2400, 2401, 2402, 2404, 2405, 2406, 2407, 2408, 2409, 2409, 2411, 2412, 2413, 2414, 2415, 2417, 2418, 2419, 2420, 2421, 2422, 2422, 2424, 2425, 2426, 2426, 2428, 2429, 2430, 2430, 2432, 2433, 2434, 2434, 2436, 2437, 2438, 2439, 2440, 2442, 2443, 2444, 2445, 2446, 2447, 2447, 2449, 2450, 2451, 2451, 2453, 2454, 2455, 2455, 2457, 2458, 2459, 2459, 2461, 2462, 2463, 2463, 2465, 2466, 2467, 2468, 2469, 2470, 2470, 2471, 2472, 2473, 2473, 2474, 2476, 2477, 2478, 2478, 2480, 2481, 2482, 2482, 2484, 2485, 2486, 2486, 2488, 2489, 2490, 2490, 2492, 2493, 2494, 2494, 2496, 2497, 2498, 2498, 2500, 2501, 2502, 2502, 2504, 2505, 2505, 2506, 2507, 2508, 2509, 2509, 2511, 2512, 2512, 2513, 2514, 2515, 2515, 2516, 2517, 2519, 2520, 2520, 2522, 2523, 2524, 2524, 2526, 2527, 2528, 2528, 2530, 2531, 2531, 2532, 2533, 2534, 2535, 2535, 2537, 2538, 2538, 2539, 2540, 2541, 2542, 2542, 2544, 2545, 2545, 2546, 2547, 2548, 2548, 2549, 2550, 2552, 2553, 2553, 2555, 2556, 2556, 2557, 2558, 2559, 2560, 2560, 2562, 2563, 2563, 2564, 2565, 2566, 2566, 2567, 2568, 2570, 2571, 2571, 2573, 2574, 2574, 2575, 2576, 2577, 2577, 2578, 2580, 2581, 2581, 2582, 2583, 2584, 2584, 2585, 2586, 2587, 2587, 2588, 2589, 2591, 2592, 2592, 2594, 2595, 2595, 2596, 2597, 2598, 2598, 2599, 2600, 2601, 2602, 2602, 2604, 2605, 2605, 2606, 2607, 2608, 2608, 2609, 2610, 2612, 2613, 2613, 2615, 2616, 2616, 2617, 2618, 2619, 2619, 2620, 2621, 2622, 2622, 2623, 2624, 2625, 2625, 2626, 2627, 2629, 2630, 2630, 2632, 2633, 2633, 2634, 2635, 2636, 2636, 2637, 2638, 2639, 2639, 2640, 2641, 2642, 2642, 2643, 2645, 2646, 2646, 2647, 2648, 2649, 2649, 2650, 2651, 2653, 2653, 2654, 2655, 2656, 2656, 2657, 2658, 2659, 2659, 2660, 2661, 2662, 2662, 2663, 2665, 2666, 2666, 2667, 2668, 2669, 2669, 2670, 2671, 2672, 2672, 2673, 2674, 2675, 2675, 2676, 2677, 2679, 2679, 2680, 2681, 2682, 2682, 2683, 2684, 2685, 2685, 2686, 2687, 2688, 2688, 2689, 2690, 2691, 2691, 2692, 2693, 2695, 2695, 2696, 2697, 2698, 2698, 2699, 2700, 2701, 2701, 2702, 2703, 2704, 2704, 2705, 2706, 2707, 2707, 2708, 2709, 2711, 2711, 2712, 2713, 2714, 2714, 2714, 2715, 2716, 2716, 2717, 2718, 2720, 2720, 2721, 2722, 2723, 2723, 2724, 2725, 2726, 2726, 2727, 2728, 2729, 2729, 2730, 2731, 2732, 2732, 2733, 2734, 2735, 2735, 2736, 2737, 2738, 2738, 2739, 2740, 2741, 2741, 2742, 2743, 2744, 2744, 2745, 2746, 2747, 2747, 2748, 2749, 2750, 2750, 2751, 2752, 2753, 2753, 2754, 2755, 2756, 2756, 2757, 2758, 2759, 2759, 2760, 2761, 2762, 2762, 2763, 2764, 2765, 2765, 2766, 2767, 2768, 2768, 2769, 2770, 2771, 2771, 2772, 2773, 2774, 2774, 2775, 2776, 2777, 2777, 2778, 2779, 2780, 2780, 2780, 2781, 2782, 2782, 2782, 2783, 2785, 2785, 2786, 2788, 2789, 2789, 2789, 2790, 2791, 2791, 2792, 2793, 2794, 2794, 2795, 2796, 2797, 2797, 2798, 2799, 2800, 2800, 2801, 2802, 2803, 2803, 2804, 2805, 2806, 2806, 2807, 2808, 2809, 2809, 2810, 2811, 2812, 2812, 2812, 2813, 2814, 2814, 2814, 2815, 2817, 2817, 2818, 2820, 2821, 2821, 2821, 2822, 2823, 2823, 2824, 2825, 2826, 2826, 2827, 2828, 2829, 2829, 2830, 2831, 2832, 2832, 2833, 2834, 2835, 2835, 2835, 2836, 2837, 2837, 2838, 2839, 2841, 2841, 2841, 2842, 2843, 2843, 2843, 2845, 2846, 2846, 2847, 2848, 2849, 2849, 2850, 2851, 2852, 2852, 2853, 2854, 2855, 2855, 2855, 2856, 2857, 2857, 2858, 2859, 2860, 2860, 2861, 2862, 2863, 2863, 2864, 2865, 2866, 2866, 2866, 2867, 2868, 2868, 2869, 2870, 2871, 2871, 2872, 2873, 2874, 2874, 2875, 2876, 2877, 2877, 2877, 2878, 2879, 2879, 2880, 2881, 2883, 2883, 2883, 2884, 2885, 2885, 2885, 2887, 2888, 2888, 2889, 2890, 2891, 2891, 2892, 2893, 2894, 2894, 2894, 2895, 2896, 2896, 2897, 2898, 2899, 2899, 2900, 2901, 2902, 2902, 2903, 2904, 2905, 2905, 2905, 2906, 2907, 2907, 2907, 2908, 2910, 2910, 2911, 2912, 2913, 2913, 2913, 2914, 2915, 2915, 2915, 2917, 2918, 2918, 2919, 2920, 2921, 2921, 2922, 2923, 2924, 2924, 2924, 2925, 2926, 2926, 2926, 2927, 2928, 2928, 2929, 2930, 2932, 2932, 2932, 2933, 2934, 2934, 2934, 2935, 2936, 2936, 2937, 2938, 2939, 2939, 2940, 2941, 2942, 2942, 2943, 2944, 2945, 2945, 2945, 2946, 2947, 2947, 2947, 2948, 2950, 2950, 2951, 2952, 2953, 2953, 2953, 2954, 2955, 2955, 2956, 2957, 2958, 2958, 2958, 2959, 2960, 2960, 2961, 2962, 2963, 2963, 2963, 2964, 2965, 2965, 2965, 2966, 2968, 2968, 2969, 2970, 2971, 2971, 2971, 2972, 2973, 2973, 2973, 2974, 2976, 2976, 2977, 2978, 2979, 2979, 2979, 2980, 2981, 2981, 2981, 2982, 2983, 2983, 2983, 2984, 2986, 2986, 2987, 2988, 2989, 2989, 2989, 2990, 2991, 2991, 2992, 2993, 2994, 2994, 2994, 2995, 2996, 2996, 2997, 2998, 2999, 2999, 2999, 3000, 3001, 3001, 3002, 3003, 3004, 3004, 3004, 3005, 3006, 3006, 3006, 3007, 3009, 3009, 3010, 3011, 3012, 3012, 3012, 3013, 3014, 3014, 3014, 3015, 3016, 3016, 3017, 3018, 3019, 3019, 3019, 3020, 3021, 3021, 3022, 3023, 3024, 3024, 3024, 3025, 3026, 3026, 3027, 3028, 3029, 3029, 3029, 3030, 3031, 3031, 3031, 3033, 3034, 3034, 3034, 3035, 3036, 3036, 3036, 3037, 3038, 3038, 3038, 3039, 3041, 3041, 3042, 3043, 3044, 3044, 3044, 3045, 3046, 3046, 3046, 3047, 3048, 3048, 3049, 3050, 3051, 3051, 3051, 3052, 3053, 3053, 3053, 3054, 3055, 3055, 3056, 3057, 3058, 3058, 3058, 3059, 3060, 3060, 3060, 3061, 3062, 3062, 3063, 3064, 3065, 3065, 3065, 3066, 3067, 3067, 3067, 3068, 3069, 3069, 3070, 3071, 3072, 3072, 3072, 3073, 3074, 3074, 3074, 3076, 3077, 3077, 3077, 3078, 3079, 3079, 3079, 3080, 3082, 3082, 3082, 3083, 3084, 3084, 3084, 3085, 3086, 3086, 3086, 3088, 3089, 3089, 3089, 3090, 3091, 3091, 3091, 3092, 3093, 3093, 3093, 3095, 3096, 3096, 3096, 3097, 3098, 3098, 3098, 3099, 3100, 3100, 3100, 3102, 3103, 3103, 3103, 3104, 3105, 3105, 3105, 3106, 3107, 3107, 3107, 3108, 3109, 3109, 3109, 3110, 3111, 3111, 3111, 3112, 3114, 3114, 3114, 3115, 3116, 3116, 3116, 3117, 3118, 3118, 3118, 3119, 3121, 3121, 3121, 3122, 3123, 3123, 3123, 3124, 3125, 3125, 3125, 3126, 3128, 3128, 3128, 3129, 3130, 3130, 3130, 3131, 3132, 3132, 3132, 3133, 3134, 3134, 3134, 3135, 3137, 3137, 3137, 3138, 3139, 3139, 3139, 3140, 3141, 3141, 3141, 3142, 3143, 3143, 3143, 3144, 3145, 3145, 3145, 3146, 3148, 3148, 3148, 3149, 3150, 3150, 3150, 3151, 3152, 3152, 3152, 3153, 3155, 3155, 3155, 3156, 3157, 3157, 3157, 3158, 3159, 3159, 3159, 3160, 3161, 3161, 3162, 3163, 3164, 3163, 3163, 3164, 3165, 3165, 3165, 3166, 3168, 3168, 3168, 3169, 3170, 3170, 3170, 3171, 3172, 3172, 3172, 3173, 3175, 3175, 3175, 3176, 3177, 3177, 3177, 3178, 3179, 3179, 3179, 3180, 3181, 3181, 3181, 3182, 3183, 3183, 3183, 3184, 3185, 3185, 3185, 3186, 3188, 3188, 3188, 3189, 3190, 3189, 3189, 3190, 3191, 3191, 3191, 3192, 3194, 3194, 3194, 3195, 3196, 3196, 3196, 3197, 3198, 3198, 3199, 3200, 3201, 3201, 3201, 3201, 3202, 3201, 3202, 3202, 3204, 3204, 3204, 3205, 3207, 3207, 3207, 3208, 3209, 3209, 3209, 3210, 3211, 3211, 3211, 3212, 3213, 3213, 3213, 3214, 3215, 3215, 3215, 3216, 3217, 3217, 3218, 3219, 3220, 3219, 3219, 3220, 3221, 3221, 3221, 3222, 3224, 3224, 3224, 3225, 3226, 3225, 3225, 3226, 3227, 3227, 3227, 3228, 3230, 3230, 3230, 3231, 3232, 3232, 3232, 3233, 3234, 3234, 3234, 3235, 3236, 3236, 3236, 3237, 3238, 3238, 3238, 3239, 3240, 3240, 3240, 3242, 3243, 3243, 3243, 3243, 3244, 3243, 3244, 3244, 3246, 3246, 3247, 3248, 3249, 3248, 3248, 3249, 3250, 3250, 3250, 3251, 3253, 3253, 3253, 3254, 3255, 3255, 3255, 3256, 3257, 3257, 3257, 3258, 3259, 3259, 3259, 3260, 3261, 3261, 3261, 3262, 3263, 3263, 3263, 3264, 3265, 3265, 3265, 3266, 3267, 3267, 3267, 3268, 3269, 3269, 3269, 3270, 3271, 3271, 3271, 3272, 3273, 3273, 3273, 3274, 3275, 3275, 3275, 3276, 3278, 3278, 3278, 3278, 3279, 3278, 3279, 3279, 3281, 3281, 3281, 3282, 3284, 3284, 3284, 3285, 3286, 3285, 3285, 3286, 3287, 3287, 3287, 3288, 3290, 3290, 3290, 3291, 3292, 3291, 3291, 3292, 3293, 3293, 3293, 3294, 3296, 3296, 3296, 3297, 3298, 3298, 3298, 3299, 3300, 3300, 3300, 3301, 3302, 3302, 3302, 3303, 3304, 3304, 3304, 3305, 3306, 3306, 3306, 3307, 3308, 3308, 3308, 3309, 3310, 3310, 3310, 3311, 3312, 3312, 3312, 3313, 3314, 3314, 3314, 3315, 3316, 3316, 3316, 3317, 3318, 3318, 3318, 3319, 3320, 3320, 3320, 3321, 3322, 3322, 3322, 3323, 3324, 3324, 3324, 3325, 3326, 3326, 3326, 3327, 3328, 3328, 3328, 3329, 3330, 3330, 3330, 3331, 3332, 3332, 3332, 3333, 3334, 3334, 3334, 3335, 3336, 3336, 3336, 3337, 3338, 3338, 3338, 3339, 3340, 3340, 3340, 3341, 3342, 3342, 3342, 3343, 3344, 3344, 3344, 3345, 3346, 3346, 3346, 3347, 3348, 3348, 3348, 3349, 3350, 3350, 3350, 3351, 3352, 3352, 3352, 3353, 3354, 3354, 3354, 3355, 3356, 3356, 3356, 3357, 3358, 3357, 3357, 3358, 3359, 3359, 3359, 3360, 3362, 3362, 3362, 3363, 3364, 3363, 3363, 3364, 3365, 3365, 3365, 3366, 3368, 3368, 3368, 3369, 3370, 3369, 3369, 3370, 3371, 3371, 3371, 3372, 3374, 3373, 3373, 3374, 3375, 3374, 3375, 3375, 3377, 3377, 3377, 3378, 3380, 3379, 3379, 3380, 3381, 3380, 3381, 3381, 3383, 3383, 3383, 3384, 3385, 3385, 3385, 3386, 3387, 3387, 3387, 3388, 3389, 3389, 3389, 3390, 3391, 3391, 3391, 3392, 3393, 3393, 3393, 3394, 3395, 3395, 3395, 3396, 3397, 3397, 3397, 3398, 3399, 3399, 3399, 3400, 3401, 3401, 3401, 3402, 3403, 3403, 3403, 3404, 3405, 3405, 3405, 3406, 3407, 3406, 3406, 3407, 3408, 3408, 3408, 3409, 3411, 3411, 3411, 3412, 3413, 3412, 3412, 3413, 3414, 3414, 3414, 3415, 3417, 3417, 3417, 3418, 3419, 3418, 3418, 3419, 3420, 3419, 3420, 3420, 3422, 3422, 3422, 3423, 3425, 3424, 3424, 3425, 3426, 3425, 3425, 3426, 3428, 3428, 3428, 3429, 3431, 3430, 3430, 3431, 3432, 3431, 3432, 3432, 3434, 3434, 3434, 3435, 3436, 3436, 3436, 3437, 3438, 3438, 3438, 3439, 3440, 3440, 3440, 3441, 3442, 3442, 3442, 3443, 3444, 3444, 3444, 3445, 3446, 3446, 3446, 3447, 3448, 3448, 3448, 3449, 3450, 3450, 3450, 3451, 3452, 3452, 3452, 3453, 3454, 3454, 3454, 3455, 3456, 3456, 3456, 3457, 3458, 3458, 3458, 3459, 3460, 3460, 3460, 3461, 3462, 3462, 3462, 3463, 3464, 3463, 3464, 3464, 3466, 3466, 3466, 3467, 3468, 3467, 3467, 3468, 3469, 3469, 3469, 3470, 3472, 3472, 3472, 3473, 3474, 3473, 3473, 3474, 3475, 3474, 3474, 3475, 3477, 3477, 3477, 3478, 3480, 3479, 3479, 3480, 3481, 3480, 3481, 3481, 3483, 3483, 3483, 3484, 3485, 3485, 3485, 3486, 3487, 3487, 3487, 3488, 3489, 3489, 3489, 3490, 3491, 3491, 3491, 3492, 3493, 3492, 3493, 3493, 3495, 3495, 3495, 3496, 3497, 3496, 3496, 3497, 3498, 3498, 3498, 3499, 3501, 3501, 3501, 3502, 3503, 3502, 3502, 3503, 3504, 3503, 3503, 3504, 3506, 3506, 3506, 3507, 3509, 3508, 3508, 3509, 3510, 3509, 3510, 3510, 3512, 3512, 3512, 3513, 3514, 3513, 3514, 3514, 3516, 3515, 3516, 3516, 3518, 3517, 3518, 3518, 3520, 3519, 3520, 3520, 3522, 3522, 3522, 3523, 3524, 3523, 3523, 3524, 3525, 3524, 3524, 3525, 3527, 3527, 3527, 3528, 3530, 3529, 3529, 3530, 3531, 3530, 3531, 3531, 3533, 3532, 3533, 3533, 3535, 3535, 3535, 3536, 3537, 3536, 3536, 3537, 3538, 3537, 3537, 3538, 3540, 3540, 3540, 3541, 3543, 3542, 3542, 3543, 3544, 3543, 3544, 3544, 3546, 3545, 3546, 3546, 3548, 3548, 3548, 3549, 3550, 3549, 3549, 3550, 3551, 3550, 3551, 3551, 3553, 3552, 3553, 3553, 3555, 3554, 3555, 3555, 3557, 3556, 3557, 3557, 3559, 3559, 3559, 3560, 3561, 3560, 3560, 3561, 3562, 3561, 3562, 3562, 3564, 3563, 3564, 3564, 3566, 3566, 3566, 3567, 3568, 3567, 3567, 3568, 3569, 3568, 3569, 3569, 3571, 3570, 3571, 3571, 3573, 3572, 3573, 3573, 3575, 3574, 3575, 3575, 3577, 3577, 3577, 3578, 3579, 3578, 3578, 3579, 3580, 3579, 3580, 3580, 3582, 3581, 3582, 3582, 3584, 3584, 3584, 3585, 3586, 3585, 3585, 3586, 3587, 3586, 3587, 3587, 3589, 3588, 3589, 3589, 3591, 3590, 3591, 3591, 3593, 3593, 3593, 3594, 3595, 3594, 3594, 3595, 3596, 3595, 3596, 3596, 3598, 3597, 3598, 3598, 3600, 3600, 3600, 3601, 3602, 3601, 3601, 3602, 3603, 3602, 3603, 3603, 3605, 3604, 3605, 3605, 3607, 3606, 3607, 3608, 3609, 3608, 3608, 3609, 3610, 3609, 3610, 3610, 3612, 3612, 3612, 3613, 3614, 3613, 3613, 3614, 3615, 3614, 3615, 3615, 3617, 3616, 3617, 3617, 3619, 3619, 3619, 3620, 3621, 3620, 3620, 3621, 3622, 3622, 3622, 3623, 3625, 3624, 3624, 3625, 3626, 3625, 3625, 3625, 3627, 3627, 3627, 3628, 3630, 3629, 3629, 3630, 3631, 3630, 3630, 3631, 3633, 3632, 3633, 3633, 3635, 3634, 3635, 3636, 3637, 3636, 3636, 3637, 3638, 3637, 3637, 3638, 3640, 3640, 3640, 3641, 3642, 3641, 3641, 3642, 3643, 3642, 3643, 3643, 3645, 3644, 3645, 3645, 3647, 3646, 3647, 3648, 3649, 3648, 3648, 3649, 3650, 3649, 3649, 3650, 3652, 3652, 3652, 3653, 3654, 3653, 3653, 3654, 3655, 3654, 3655, 3655, 3657, 3656, 3657, 3657, 3659, 3658, 3659, 3659, 3661, 3660, 3660, 3661, 3662, 3661, 3661, 3662, 3664, 3663, 3664, 3665, 3666, 3665, 3665, 3666, 3667, 3666, 3667, 3667, 3669, 3668, 3669, 3669, 3671, 3670, 3671, 3671, 3673, 3672, 3672, 3673, 3674, 3673, 3673, 3674, 3676, 3675, 3676, 3677, 3678, 3677, 3677, 3678, 3679, 3678, 3678, 3679, 3681, 3680, 3681, 3682, 3683, 3682, 3682, 3683, 3684, 3683, 3683, 3684, 3686, 3685, 3686, 3686, 3688, 3687, 3688, 3688, 3690, 3689, 3689, 3690, 3691, 3690, 3690, 3691, 3693, 3692, 3693, 3694, 3695, 3694, 3694, 3695, 3696, 3695, 3695, 3696, 3698, 3697, 3698, 3699, 3700, 3699, 3699, 3700, 3701, 3700, 3700, 3701, 3703, 3702, 3703, 3703, 3705, 3704, 3705, 3705, 3707, 3706, 3706, 3707, 3708, 3707, 3707, 3708, 3710, 3709, 3710, 3710, 3712, 3711, 3711, 3712, 3713, 3712, 3712, 3713, 3715, 3714, 3715, 3715, 3717, 3716, 3716, 3717, 3718, 3717, 3717, 3718, 3720, 3719, 3720, 3720, 3722, 3721, 3722, 3722, 3724, 3723, 3723, 3724, 3725, 3724, 3724, 3724, 3726, 3726, 3726, 3727, 3729, 3728, 3728, 3729, 3730, 3729, 3730, 3730, 3732, 3731, 3731, 3731, 3733, 3733, 3733, 3734, 3736, 3735, 3735, 3736, 3737, 3736, 3736, 3736, 3738, 3737, 3737, 3738, 3740, 3739, 3740, 3740, 3742, 3741, 3742, 3742, 3744, 3743, 3743, 3744, 3745, 3744, 3744, 3745, 3747, 3746, 3747, 3747, 3749, 3748, 3749, 3749, 3751, 3750, 3750, 3751, 3752, 3751, 3751, 3752, 3754, 3753, 3754, 3754, 3756, 3755, 3756, 3756, 3758, 3757, 3757, 3758, 3759, 3758, 3758, 3759, 3761, 3760, 3761, 3761, 3763, 3762, 3763, 3763, 3765, 3764, 3764, 3765, 3766, 3765, 3765, 3766, 3768, 3767, 3768, 3768, 3770, 3769, 3770, 3770, 3772, 3771, 3771, 3772, 3773, 3772, 3772, 3773, 3775, 3774, 3775, 3775, 3777, 3776, 3777, 3777, 3779, 3778, 3778, 3779, 3780, 3779, 3779, 3780, 3782, 3781, 3782, 3782, 3784, 3783, 3783, 3784, 3786, 3785, 3786, 3786, 3788, 3787, 3787, 3788, 3789, 3788, 3788, 3789, 3791, 3790, 3791, 3791, 3793, 3792, 3792, 3793, 3795, 3794, 3795, 3795, 3797, 3796, 3796, 3797, 3798, 3797, 3797, 3798, 3800, 3799, 3800, 3800, 3802, 3801, 3801, 3802, 3804, 3803, 3804, 3804, 3806, 3805, 3805, 3806, 3807, 3806, 3806, 3807, 3809, 3808, 3809, 3809, 3811, 3810, 3810, 3811, 3813, 3812, 3813, 3813, 3815, 3814, 3814, 3815, 3816, 3815, 3815, 3816, 3818, 3817, 3818, 3818, 3820, 3819, 3820, 3820, 3822, 3821, 3821, 3822, 3824, 3823, 3824, 3824, 3826, 3825, 3825, 3826, 3827, 3826, 3826, 3827, 3829, 3828, 3829, 3829, 3831, 3830, 3830, 3831, 3833, 3832, 3833, 3833, 3835, 3834, 3834, 3835, 3836, 3835, 3835, 3836, 3838, 3837, 3838, 3838, 3840, 3839, 3839, 3840, 3842, 3841, 3842, 3842, 3844, 3843, 3843, 3844, 3845, 3844, 3844, 3845, 3847, 3846, 3847, 3847, 3849, 3848, 3848, 3849, 3850, 3849, 3849, 3850, 3852, 3851, 3852, 3852, 3854, 3853, 3853, 3854, 3856, 3855, 3856, 3856, 3858, 3857, 3857, 3858, 3859, 3858, 3858, 3859, 3861, 3860, 3861, 3861, 3863, 3862, 3862, 3863, 3865, 3864, 3865, 3865, 3867, 3866, 3866, 3867, 3868, 3867, 3867, 3868, 3870, 3869, 3869, 3870, 3872, 3871, 3872, 3872, 3874, 3873, 3873, 3874, 3875, 3874, 3874, 3875, 3877, 3876, 3877, 3877, 3879, 3878, 3878, 3879, 3881, 3880, 3881, 3881, 3883, 3882, 3882, 3882, 3884, 3883, 3883, 3884, 3886, 3885, 3885, 3886, 3887, 3886, 3886, 3887, 3889, 3888, 3888, 3889, 3891, 3890, 3891, 3891, 3893, 3892, 3892, 3892, 3894, 3893, 3893, 3894, 3896, 3895, 3895, 3896, 3898, 3897, 3898, 3898, 3900, 3899, 3899, 3899, 3901, 3900, 3900, 3901, 3903, 3902, 3902, 3903, 3904, 3903, 3903, 3904, 3906, 3905, 3905, 3906, 3908, 3907, 3908, 3908, 3910, 3909, 3909, 3909, 3911, 3910, 3910, 3911, 3913, 3912, 3912, 3913, 3915, 3914, 3915, 3915, 3917, 3916, 3916, 3916, 3918, 3917, 3917, 3918, 3920, 3919, 3919, 3920, 3921, 3920, 3920, 3921, 3923, 3922, 3922, 3923, 3925, 3924, 3925, 3925, 3927, 3926, 3926, 3926, 3928, 3927, 3927, 3928, 3930, 3929, 3929, 3930, 3932, 3931, 3932, 3932, 3934, 3933, 3933, 3933, 3935, 3934, 3934, 3935, 3937, 3936, 3936, 3936, 3938, 3937, 3937, 3938, 3940, 3939, 3939, 3940, 3942, 3941, 3942, 3942, 3944, 3943, 3943, 3943, 3945, 3944, 3944, 3945, 3947, 3946, 3946, 3947, 3949, 3948, 3949, 3949, 3951, 3950, 3950, 3950, 3952, 3951, 3951, 3952, 3954, 3953, 3953, 3953, 3955, 3954, 3954, 3955, 3957, 3956, 3957, 3957, 3959, 3958, 3958, 3958, 3960, 3959, 3959, 3960, 3962, 3961, 3961, 3961, 3963, 3962, 3962, 3963, 3965, 3964, 3964, 3965, 3967, 3966, 3967, 3967, 3969, 3968, 3968, 3968, 3970, 3969, 3969, 3970, 3972, 3971, 3971, 3972, 3974, 3973, 3974, 3974, 3976, 3975, 3975, 3975, 3977, 3976, 3976, 3977, 3979, 3978, 3978, 3978, 3980, 3979, 3979, 3980, 3982, 3981, 3981, 3982, 3984, 3983, 3983, 3984, 3986, 3985, 3986, 3986, 3988, 3987, 3987, 3987, 3989, 3988, 3988, 3989, 3991, 3990, 3990, 3990, 3992, 3991, 3991, 3992, 3994, 3993, 3993, 3994, 3996, 3995, 3995, 3996, 3998, 3997, 3997, 3997, 3999, 3998, 3998, 3999, 4001, 4000, 4000, 4001, 4003, 4002, 4002, 4003, 4005, 4004, 4004, 4004, 4006, 4005, 4005, 4006, 4008, 4007, 4007, 4007, 4009, 4008, 4008, 4009, 4011, 4010, 4010, 4011, 4013, 4012, 4012, 4013, 4015, 4014, 4014, 4014, 4016, 4015, 4015, 4016, 4018, 4017, 4017, 4017, 4019, 4018, 4018, 4019, 4021, 4020, 4020, 4021, 4023, 4022, 4022, 4023, 4025, 4024, 4024, 4025, 4027, 4026, 4026, 4026, 4028, 4027, 4027, 4028, 4030, 4029, 4029, 4029, 4031, 4030, 4030, 4031, 4033, 4032, 4032, 4033, 4035, 4034, 4034, 4035, 4037, 4036, 4036, 4036, 4038, 4037, 4037, 4038, 4040, 4039, 4039, 4039, 4041, 4040, 4040, 4041, 4043, 4042, 4042, 4043, 4045, 4044, 4044, 4045, 4047, 4046, 4046, 4047, 4049, 4048, 4048, 4048, 4050, 4049, 4049, 4050, 4052, 4051, 4051, 4051, 4053, 4052, 4052, 4053, 4055, 4054, 4054, 4055, 4057, 4056, 4056, 4057, 4059, 4058, 4058, 4058, 4060, 4059, 4059, 4060, 4062, 4061, 4061, 4061, 4062, 4062, 4062, 4063, 4064, 4064, 4064, 4065, 4066, 4066, 4066, 4067, 4068, 4068, 4068, 4069, 4070, 4070, 4070, 4070, 4071, 4071, 4071, 4072, 4073, 4073, 4073, 4073, 4074, 4074, 4074, 4075, 4076, 4076, 4076, 4077, 4078, 4078, 4078, 4079, 4080, 4080, 4080, 4080, 4081, 4081, 4081, 4082, 4083, 4083, 4083, 4083, 4084, 4084, 4084, 4085, 4086, 4086, 4086, 4087, 4088, 4088, 4088, 4089, 4090, 4090, 4091, 4092, 4093, 4093, 4094, 4095] + # 14-bit + gamma_lut_14: [0, 11, 22, 32, 43, 53, 64, 74, 83, 93, 102, 110, 119, 127, 134, 141, 148, 154, 160, 165, 170, 174, 178, 182, 186, 190, 193, 196, 199, 202, 205, 209, 212, 215, 219, 223, 227, 231, 235, 239, 244, 248, 252, 257, 262, 266, 271, 275, 280, 284, 288, 293, 297, 301, 305, 309, 313, 317, 321, 325, 329, 332, 336, 340, 344, 348, 352, 356, 360, 364, 368, 372, 376, 380, 384, 388, 392, 396, 400, 404, 408, 412, 416, 420, 424, 427, 431, 435, 439, 443, 447, 451, 455, 459, 464, 468, 472, 476, 480, 484, 489, 493, 497, 501, 506, 510, 514, 519, 523, 527, 531, 536, 540, 544, 548, 552, 556, 560, 564, 568, 572, 576, 580, 584, 588, 592, 596, 600, 604, 608, 612, 616, 620, 623, 627, 631, 636, 639, 643, 647, 652, 656, 660, 664, 668, 672, 676, 680, 684, 688, 692, 696, 700, 704, 708, 712, 716, 720, 724, 728, 732, 736, 739, 743, 747, 751, 755, 759, 763, 767, 771, 775, 779, 783, 787, 792, 796, 800, 804, 808, 813, 817, 821, 825, 830, 834, 838, 842, 847, 851, 855, 860, 864, 868, 872, 876, 880, 884, 887, 891, 896, 899, 903, 907, 912, 915, 919, 924, 928, 932, 936, 940, 944, 948, 953, 957, 961, 966, 970, 974, 979, 983, 987, 991, 996, 1000, 1004, 1008, 1012, 1016, 1020, 1024, 1028, 1032, 1036, 1040, 1044, 1048, 1052, 1056, 1060, 1064, 1067, 1071, 1075, 1079, 1083, 1087, 1091, 1095, 1099, 1103, 1107, 1111, 1115, 1120, 1124, 1128, 1131, 1135, 1140, 1143, 1147, 1151, 1156, 1159, 1163, 1167, 1172, 1175, 1179, 1184, 1188, 1191, 1195, 1199, 1203, 1207, 1211, 1215, 1219, 1223, 1227, 1231, 1235, 1239, 1243, 1247, 1252, 1256, 1260, 1264, 1268, 1272, 1277, 1281, 1285, 1289, 1294, 1298, 1303, 1307, 1311, 1315, 1320, 1324, 1327, 1332, 1336, 1339, 1343, 1347, 1352, 1355, 1359, 1363, 1368, 1371, 1375, 1379, 1384, 1387, 1391, 1395, 1400, 1403, 1407, 1411, 1416, 1420, 1423, 1428, 1432, 1436, 1440, 1444, 1448, 1451, 1455, 1458, 1462, 1465, 1469, 1473, 1477, 1480, 1484, 1488, 1492, 1495, 1499, 1503, 1508, 1511, 1515, 1520, 1524, 1528, 1532, 1537, 1541, 1545, 1549, 1554, 1559, 1563, 1567, 1571, 1576, 1579, 1583, 1587, 1591, 1594, 1598, 1602, 1606, 1609, 1613, 1616, 1621, 1624, 1628, 1632, 1636, 1639, 1643, 1647, 1651, 1655, 1658, 1663, 1667, 1671, 1675, 1679, 1683, 1687, 1691, 1695, 1700, 1703, 1707, 1711, 1715, 1718, 1722, 1726, 1730, 1733, 1737, 1741, 1745, 1748, 1752, 1756, 1760, 1763, 1766, 1770, 1774, 1778, 1781, 1785, 1789, 1792, 1796, 1800, 1804, 1808, 1811, 1815, 1820, 1823, 1827, 1830, 1834, 1838, 1841, 1845, 1849, 1853, 1856, 1860, 1864, 1868, 1871, 1875, 1880, 1883, 1886, 1890, 1894, 1898, 1901, 1905, 1909, 1912, 1916, 1920, 1924, 1928, 1931, 1935, 1940, 1943, 1946, 1950, 1954, 1958, 1961, 1965, 1969, 1972, 1976, 1980, 1984, 1988, 1991, 1995, 2000, 2003, 2006, 2010, 2014, 2017, 2021, 2025, 2029, 2032, 2036, 2040, 2044, 2048, 2051, 2055, 2060, 2063, 2067, 2070, 2074, 2078, 2081, 2085, 2089, 2093, 2096, 2100, 2105, 2108, 2112, 2116, 2120, 2123, 2126, 2129, 2133, 2136, 2139, 2143, 2147, 2150, 2153, 2157, 2161, 2164, 2168, 2171, 2176, 2179, 2182, 2186, 2190, 2193, 2197, 2201, 2205, 2208, 2212, 2216, 2220, 2224, 2227, 2231, 2236, 2239, 2242, 2245, 2249, 2252, 2255, 2259, 2263, 2266, 2269, 2273, 2277, 2280, 2284, 2287, 2292, 2295, 2298, 2302, 2306, 2309, 2313, 2317, 2321, 2324, 2328, 2332, 2336, 2340, 2343, 2347, 2352, 2355, 2358, 2362, 2365, 2368, 2372, 2375, 2379, 2382, 2386, 2389, 2393, 2396, 2400, 2404, 2408, 2410, 2414, 2417, 2421, 2424, 2427, 2431, 2435, 2438, 2441, 2445, 2449, 2452, 2456, 2460, 2464, 2466, 2470, 2473, 2477, 2480, 2483, 2486, 2490, 2493, 2497, 2501, 2505, 2508, 2511, 2515, 2520, 2523, 2526, 2530, 2534, 2537, 2541, 2545, 2549, 2552, 2556, 2560, 2564, 2568, 2571, 2575, 2580, 2583, 2586, 2589, 2593, 2596, 2600, 2603, 2607, 2610, 2613, 2617, 2621, 2624, 2628, 2631, 2636, 2638, 2641, 2645, 2649, 2652, 2655, 2658, 2662, 2665, 2669, 2673, 2677, 2680, 2683, 2687, 2691, 2694, 2698, 2701, 2705, 2708, 2712, 2715, 2719, 2722, 2726, 2729, 2733, 2737, 2740, 2744, 2747, 2750, 2753, 2756, 2760, 2762, 2765, 2768, 2772, 2775, 2778, 2781, 2785, 2788, 2792, 2795, 2799, 2802, 2806, 2810, 2814, 2817, 2820, 2824, 2829, 2832, 2836, 2840, 2844, 2847, 2851, 2855, 2859, 2862, 2865, 2869, 2872, 2875, 2878, 2881, 2885, 2888, 2891, 2894, 2898, 2901, 2904, 2908, 2911, 2914, 2917, 2920, 2924, 2927, 2930, 2934, 2938, 2941, 2944, 2948, 2952, 2956, 2959, 2963, 2967, 2970, 2974, 2977, 2981, 2984, 2987, 2991, 2995, 2998, 3001, 3005, 3009, 3012, 3016, 3019, 3023, 3026, 3029, 3032, 3036, 3038, 3041, 3045, 3048, 3051, 3054, 3058, 3062, 3064, 3068, 3071, 3075, 3078, 3081, 3085, 3089, 3091, 3095, 3098, 3102, 3105, 3109, 3113, 3117, 3120, 3123, 3127, 3131, 3134, 3137, 3140, 3144, 3147, 3150, 3153, 3157, 3160, 3163, 3166, 3170, 3173, 3176, 3179, 3183, 3186, 3189, 3192, 3196, 3198, 3201, 3205, 3208, 3211, 3214, 3218, 3222, 3225, 3228, 3231, 3235, 3238, 3241, 3244, 3247, 3250, 3253, 3256, 3260, 3263, 3266, 3269, 3273, 3276, 3279, 3283, 3287, 3290, 3293, 3297, 3301, 3303, 3306, 3310, 3314, 3317, 3321, 3324, 3329, 3332, 3335, 3339, 3343, 3346, 3349, 3352, 3356, 3359, 3361, 3365, 3369, 3371, 3374, 3378, 3382, 3385, 3388, 3391, 3395, 3398, 3401, 3404, 3408, 3410, 3413, 3416, 3420, 3423, 3426, 3429, 3434, 3436, 3440, 3443, 3447, 3450, 3453, 3456, 3460, 3462, 3465, 3468, 3472, 3475, 3478, 3481, 3486, 3488, 3492, 3495, 3499, 3502, 3505, 3508, 3512, 3514, 3517, 3521, 3525, 3527, 3530, 3534, 3538, 3541, 3544, 3547, 3551, 3554, 3556, 3559, 3562, 3564, 3567, 3570, 3574, 3576, 3579, 3582, 3586, 3589, 3592, 3595, 3599, 3602, 3605, 3608, 3612, 3615, 3618, 3622, 3626, 3629, 3632, 3636, 3641, 3644, 3647, 3651, 3655, 3658, 3660, 3664, 3667, 3669, 3672, 3675, 3679, 3681, 3684, 3687, 3691, 3693, 3696, 3699, 3703, 3706, 3708, 3711, 3715, 3717, 3720, 3724, 3728, 3730, 3733, 3737, 3741, 3744, 3747, 3751, 3755, 3758, 3761, 3764, 3768, 3770, 3773, 3777, 3781, 3783, 3786, 3790, 3794, 3797, 3800, 3803, 3807, 3809, 3812, 3815, 3819, 3821, 3823, 3826, 3830, 3832, 3835, 3838, 3842, 3845, 3848, 3851, 3855, 3858, 3860, 3864, 3867, 3870, 3873, 3876, 3880, 3883, 3886, 3889, 3894, 3896, 3900, 3903, 3907, 3909, 3912, 3915, 3919, 3921, 3923, 3926, 3930, 3932, 3935, 3938, 3942, 3945, 3948, 3951, 3955, 3958, 3960, 3963, 3967, 3970, 3972, 3976, 3980, 3982, 3985, 3989, 3993, 3996, 3999, 4003, 4007, 4010, 4012, 4015, 4019, 4021, 4023, 4027, 4031, 4033, 4035, 4039, 4043, 4045, 4048, 4051, 4055, 4057, 4060, 4063, 4066, 4068, 4071, 4074, 4078, 4080, 4083, 4086, 4090, 4093, 4096, 4099, 4103, 4105, 4108, 4111, 4114, 4116, 4119, 4122, 4126, 4128, 4131, 4134, 4138, 4141, 4144, 4147, 4151, 4153, 4156, 4159, 4162, 4164, 4167, 4170, 4174, 4176, 4179, 4182, 4186, 4189, 4192, 4195, 4199, 4201, 4204, 4207, 4210, 4212, 4215, 4218, 4222, 4224, 4227, 4230, 4234, 4237, 4240, 4243, 4247, 4249, 4252, 4255, 4258, 4260, 4263, 4266, 4270, 4272, 4275, 4278, 4282, 4285, 4288, 4291, 4295, 4297, 4300, 4303, 4306, 4308, 4311, 4314, 4318, 4320, 4323, 4326, 4330, 4333, 4336, 4339, 4343, 4345, 4348, 4351, 4354, 4356, 4359, 4362, 4366, 4368, 4371, 4374, 4378, 4381, 4384, 4387, 4391, 4393, 4396, 4399, 4403, 4405, 4407, 4410, 4414, 4416, 4419, 4423, 4427, 4429, 4432, 4435, 4439, 4441, 4443, 4446, 4449, 4451, 4453, 4456, 4460, 4462, 4464, 4467, 4471, 4473, 4476, 4479, 4483, 4485, 4487, 4490, 4494, 4496, 4498, 4501, 4505, 4507, 4510, 4514, 4518, 4520, 4523, 4527, 4531, 4533, 4536, 4539, 4543, 4544, 4547, 4550, 4554, 4556, 4559, 4563, 4567, 4569, 4572, 4575, 4579, 4581, 4583, 4586, 4590, 4591, 4594, 4597, 4600, 4602, 4604, 4608, 4611, 4614, 4616, 4619, 4623, 4625, 4627, 4630, 4633, 4634, 4637, 4640, 4643, 4645, 4648, 4651, 4655, 4657, 4660, 4663, 4667, 4669, 4671, 4674, 4678, 4680, 4682, 4686, 4690, 4692, 4695, 4698, 4702, 4705, 4708, 4711, 4715, 4717, 4719, 4722, 4726, 4727, 4729, 4733, 4736, 4738, 4740, 4744, 4747, 4749, 4752, 4755, 4759, 4761, 4763, 4766, 4769, 4771, 4773, 4776, 4780, 4781, 4784, 4787, 4791, 4793, 4796, 4799, 4803, 4805, 4807, 4810, 4813, 4815, 4817, 4820, 4824, 4826, 4828, 4831, 4835, 4837, 4840, 4843, 4847, 4849, 4851, 4854, 4857, 4859, 4861, 4864, 4868, 4869, 4872, 4875, 4879, 4881, 4884, 4887, 4891, 4893, 4895, 4898, 4901, 4903, 4905, 4908, 4912, 4913, 4916, 4919, 4923, 4925, 4928, 4931, 4935, 4937, 4939, 4942, 4945, 4947, 4949, 4952, 4956, 4957, 4960, 4963, 4967, 4969, 4972, 4975, 4979, 4981, 4983, 4986, 4989, 4990, 4993, 4996, 5000, 5001, 5004, 5007, 5011, 5013, 5016, 5019, 5023, 5025, 5027, 5030, 5033, 5035, 5037, 5040, 5044, 5046, 5048, 5051, 5055, 5057, 5060, 5063, 5067, 5068, 5070, 5073, 5076, 5077, 5079, 5082, 5086, 5087, 5089, 5092, 5096, 5098, 5100, 5103, 5107, 5108, 5110, 5113, 5117, 5118, 5120, 5123, 5127, 5129, 5131, 5135, 5139, 5141, 5144, 5147, 5151, 5153, 5155, 5158, 5161, 5163, 5165, 5168, 5172, 5174, 5176, 5180, 5183, 5185, 5188, 5191, 5195, 5196, 5198, 5201, 5204, 5205, 5207, 5210, 5213, 5215, 5217, 5220, 5224, 5226, 5228, 5231, 5235, 5237, 5239, 5241, 5245, 5246, 5249, 5252, 5256, 5257, 5260, 5263, 5267, 5269, 5272, 5275, 5279, 5280, 5282, 5285, 5288, 5289, 5291, 5294, 5297, 5299, 5301, 5304, 5308, 5309, 5312, 5315, 5319, 5321, 5323, 5326, 5329, 5331, 5333, 5336, 5340, 5342, 5344, 5347, 5351, 5353, 5356, 5359, 5363, 5364, 5366, 5368, 5371, 5372, 5374, 5376, 5379, 5380, 5382, 5385, 5389, 5390, 5392, 5395, 5399, 5400, 5402, 5405, 5409, 5410, 5412, 5416, 5419, 5421, 5424, 5427, 5431, 5433, 5436, 5439, 5443, 5444, 5446, 5448, 5451, 5452, 5454, 5456, 5459, 5461, 5462, 5465, 5469, 5470, 5472, 5475, 5479, 5480, 5482, 5485, 5489, 5490, 5492, 5495, 5499, 5501, 5504, 5507, 5511, 5513, 5516, 5519, 5523, 5524, 5526, 5528, 5531, 5532, 5534, 5536, 5539, 5540, 5542, 5545, 5549, 5550, 5552, 5555, 5559, 5560, 5562, 5565, 5568, 5570, 5572, 5575, 5579, 5581, 5583, 5587, 5591, 5593, 5596, 5599, 5603, 5604, 5606, 5608, 5611, 5612, 5614, 5617, 5620, 5621, 5623, 5626, 5629, 5630, 5633, 5635, 5639, 5640, 5642, 5644, 5647, 5648, 5650, 5653, 5657, 5658, 5660, 5663, 5667, 5669, 5672, 5675, 5679, 5680, 5682, 5685, 5688, 5689, 5691, 5694, 5698, 5699, 5701, 5704, 5708, 5710, 5712, 5715, 5719, 5720, 5721, 5724, 5727, 5728, 5729, 5732, 5735, 5736, 5738, 5741, 5745, 5746, 5748, 5751, 5755, 5756, 5758, 5760, 5763, 5764, 5766, 5769, 5773, 5774, 5776, 5779, 5783, 5785, 5788, 5791, 5795, 5796, 5798, 5801, 5804, 5805, 5807, 5810, 5814, 5815, 5817, 5820, 5824, 5826, 5828, 5831, 5835, 5836, 5838, 5840, 5843, 5844, 5846, 5848, 5852, 5853, 5855, 5857, 5861, 5862, 5864, 5867, 5871, 5872, 5873, 5875, 5878, 5879, 5881, 5883, 5887, 5888, 5890, 5893, 5896, 5898, 5900, 5903, 5907, 5908, 5910, 5912, 5916, 5917, 5919, 5922, 5925, 5927, 5929, 5932, 5936, 5938, 5940, 5943, 5947, 5948, 5950, 5952, 5955, 5956, 5958, 5960, 5964, 5965, 5966, 5969, 5973, 5974, 5976, 5979, 5983, 5984, 5985, 5988, 5991, 5991, 5993, 5996, 5999, 6000, 6002, 6005, 6009, 6010, 6012, 6015, 6019, 6020, 6021, 6024, 6027, 6027, 6029, 6032, 6035, 6036, 6038, 6041, 6045, 6046, 6048, 6051, 6055, 6056, 6057, 6060, 6063, 6063, 6065, 6068, 6071, 6072, 6074, 6077, 6081, 6082, 6084, 6087, 6091, 6092, 6093, 6096, 6099, 6099, 6101, 6104, 6107, 6108, 6110, 6113, 6117, 6118, 6120, 6123, 6127, 6128, 6129, 6132, 6135, 6135, 6137, 6140, 6143, 6144, 6146, 6149, 6153, 6154, 6156, 6159, 6163, 6164, 6165, 6168, 6171, 6171, 6173, 6176, 6179, 6180, 6182, 6185, 6189, 6190, 6192, 6195, 6199, 6200, 6201, 6203, 6207, 6207, 6209, 6211, 6215, 6216, 6218, 6221, 6224, 6226, 6228, 6231, 6235, 6236, 6237, 6240, 6243, 6244, 6245, 6248, 6252, 6253, 6254, 6257, 6261, 6262, 6264, 6267, 6271, 6271, 6273, 6275, 6278, 6278, 6279, 6282, 6285, 6286, 6287, 6290, 6293, 6294, 6296, 6299, 6303, 6304, 6305, 6307, 6310, 6311, 6313, 6315, 6319, 6320, 6322, 6325, 6329, 6330, 6332, 6335, 6339, 6339, 6341, 6343, 6346, 6346, 6347, 6350, 6353, 6354, 6355, 6358, 6361, 6363, 6364, 6367, 6371, 6372, 6373, 6375, 6378, 6379, 6381, 6383, 6387, 6388, 6390, 6393, 6397, 6398, 6400, 6403, 6407, 6407, 6409, 6411, 6414, 6414, 6415, 6418, 6421, 6422, 6423, 6426, 6429, 6430, 6432, 6435, 6439, 6440, 6441, 6443, 6446, 6447, 6449, 6451, 6455, 6456, 6458, 6461, 6465, 6466, 6468, 6471, 6475, 6475, 6477, 6479, 6482, 6482, 6483, 6486, 6489, 6490, 6491, 6494, 6497, 6498, 6500, 6503, 6507, 6507, 6509, 6511, 6514, 6515, 6517, 6519, 6523, 6524, 6526, 6529, 6533, 6534, 6536, 6539, 6543, 6543, 6545, 6547, 6550, 6550, 6551, 6554, 6557, 6558, 6559, 6562, 6565, 6566, 6568, 6571, 6575, 6575, 6577, 6579, 6582, 6583, 6584, 6587, 6591, 6592, 6594, 6597, 6600, 6602, 6604, 6607, 6611, 6611, 6613, 6615, 6618, 6618, 6620, 6622, 6625, 6626, 6627, 6630, 6634, 6635, 6637, 6639, 6643, 6643, 6644, 6646, 6649, 6650, 6651, 6653, 6657, 6657, 6659, 6662, 6665, 6666, 6668, 6671, 6675, 6675, 6676, 6679, 6682, 6682, 6683, 6686, 6689, 6690, 6691, 6694, 6698, 6699, 6700, 6703, 6707, 6707, 6708, 6710, 6713, 6713, 6715, 6717, 6720, 6721, 6723, 6725, 6729, 6730, 6732, 6735, 6739, 6739, 6741, 6743, 6746, 6747, 6748, 6751, 6755, 6756, 6758, 6761, 6764, 6766, 6768, 6771, 6775, 6775, 6777, 6779, 6782, 6782, 6783, 6786, 6789, 6790, 6791, 6794, 6798, 6799, 6800, 6803, 6807, 6807, 6808, 6810, 6813, 6814, 6815, 6817, 6821, 6821, 6823, 6826, 6829, 6830, 6832, 6835, 6839, 6839, 6840, 6842, 6845, 6846, 6847, 6849, 6853, 6853, 6855, 6858, 6861, 6862, 6864, 6867, 6871, 6871, 6872, 6875, 6878, 6878, 6879, 6882, 6885, 6886, 6887, 6890, 6894, 6895, 6897, 6899, 6903, 6903, 6904, 6906, 6908, 6908, 6909, 6912, 6915, 6915, 6916, 6919, 6922, 6923, 6925, 6927, 6931, 6931, 6932, 6934, 6937, 6937, 6938, 6941, 6944, 6945, 6946, 6949, 6953, 6954, 6956, 6959, 6963, 6963, 6964, 6967, 6970, 6970, 6971, 6974, 6977, 6978, 6979, 6982, 6986, 6987, 6989, 6991, 6995, 6995, 6996, 6998, 7000, 7000, 7001, 7004, 7007, 7007, 7008, 7011, 7014, 7015, 7017, 7019, 7023, 7023, 7024, 7026, 7029, 7029, 7030, 7033, 7036, 7037, 7038, 7041, 7045, 7046, 7048, 7051, 7055, 7055, 7056, 7059, 7062, 7062, 7063, 7066, 7069, 7070, 7071, 7074, 7078, 7079, 7080, 7083, 7087, 7087, 7088, 7090, 7092, 7092, 7093, 7095, 7099, 7099, 7100, 7103, 7106, 7107, 7108, 7111, 7115, 7115, 7116, 7118, 7121, 7121, 7123, 7125, 7129, 7129, 7131, 7133, 7137, 7138, 7140, 7143, 7147, 7147, 7148, 7150, 7153, 7153, 7154, 7156, 7159, 7159, 7161, 7163, 7166, 7167, 7169, 7171, 7175, 7175, 7176, 7177, 7180, 7180, 7181, 7183, 7187, 7187, 7188, 7191, 7194, 7195, 7197, 7199, 7203, 7203, 7203, 7205, 7208, 7208, 7209, 7211, 7214, 7214, 7216, 7218, 7222, 7223, 7224, 7227, 7231, 7231, 7232, 7234, 7237, 7237, 7239, 7241, 7245, 7245, 7247, 7249, 7253, 7254, 7256, 7259, 7263, 7263, 7264, 7266, 7269, 7269, 7270, 7272, 7275, 7275, 7276, 7279, 7282, 7283, 7285, 7287, 7291, 7291, 7291, 7293, 7296, 7296, 7297, 7299, 7302, 7303, 7304, 7306, 7310, 7311, 7312, 7315, 7319, 7319, 7320, 7321, 7324, 7324, 7325, 7327, 7331, 7331, 7332, 7335, 7338, 7339, 7341, 7343, 7347, 7347, 7347, 7349, 7352, 7352, 7353, 7355, 7358, 7358, 7359, 7362, 7366, 7366, 7368, 7371, 7375, 7375, 7376, 7378, 7381, 7382, 7383, 7385, 7389, 7389, 7391, 7394, 7398, 7399, 7400, 7403, 7407, 7407, 7407, 7409, 7412, 7411, 7412, 7414, 7417, 7417, 7418, 7420, 7423, 7424, 7425, 7427, 7431, 7430, 7431, 7433, 7435, 7435, 7436, 7438, 7441, 7442, 7443, 7446, 7449, 7450, 7452, 7455, 7459, 7459, 7460, 7462, 7465, 7466, 7467, 7470, 7473, 7474, 7475, 7478, 7482, 7483, 7484, 7487, 7491, 7491, 7491, 7493, 7496, 7495, 7496, 7498, 7501, 7501, 7502, 7504, 7507, 7508, 7509, 7511, 7515, 7514, 7515, 7517, 7520, 7519, 7520, 7522, 7526, 7526, 7527, 7530, 7534, 7534, 7536, 7539, 7543, 7543, 7544, 7546, 7548, 7548, 7549, 7552, 7555, 7555, 7556, 7559, 7563, 7563, 7565, 7567, 7571, 7570, 7571, 7573, 7575, 7575, 7575, 7577, 7580, 7580, 7581, 7584, 7587, 7587, 7589, 7591, 7595, 7594, 7595, 7597, 7600, 7599, 7600, 7603, 7606, 7606, 7607, 7610, 7614, 7614, 7616, 7619, 7623, 7623, 7624, 7626, 7628, 7628, 7629, 7632, 7635, 7635, 7636, 7639, 7642, 7643, 7645, 7647, 7651, 7650, 7651, 7653, 7655, 7655, 7655, 7657, 7660, 7660, 7661, 7664, 7667, 7667, 7669, 7671, 7675, 7674, 7675, 7677, 7680, 7679, 7680, 7683, 7686, 7686, 7687, 7690, 7694, 7694, 7696, 7699, 7703, 7703, 7704, 7705, 7708, 7708, 7709, 7712, 7715, 7715, 7716, 7719, 7722, 7723, 7725, 7727, 7731, 7730, 7731, 7732, 7735, 7735, 7735, 7737, 7740, 7740, 7741, 7743, 7747, 7747, 7749, 7751, 7755, 7754, 7755, 7757, 7760, 7760, 7761, 7763, 7766, 7766, 7768, 7770, 7774, 7775, 7776, 7779, 7783, 7782, 7783, 7785, 7787, 7787, 7788, 7790, 7793, 7793, 7794, 7796, 7799, 7800, 7801, 7803, 7807, 7806, 7807, 7808, 7811, 7810, 7811, 7813, 7816, 7816, 7817, 7819, 7822, 7823, 7824, 7827, 7831, 7830, 7831, 7833, 7836, 7836, 7837, 7839, 7843, 7843, 7844, 7847, 7850, 7851, 7852, 7855, 7859, 7858, 7859, 7860, 7863, 7862, 7863, 7865, 7868, 7868, 7869, 7871, 7875, 7875, 7877, 7879, 7883, 7882, 7883, 7885, 7888, 7888, 7889, 7891, 7895, 7895, 7896, 7899, 7902, 7903, 7905, 7907, 7911, 7910, 7910, 7912, 7914, 7913, 7914, 7915, 7918, 7918, 7919, 7921, 7924, 7924, 7925, 7927, 7931, 7930, 7931, 7933, 7935, 7935, 7936, 7938, 7942, 7942, 7943, 7946, 7950, 7951, 7952, 7955, 7959, 7958, 7959, 7961, 7963, 7963, 7963, 7965, 7968, 7968, 7969, 7971, 7975, 7975, 7977, 7979, 7983, 7982, 7983, 7985, 7988, 7987, 7988, 7991, 7994, 7994, 7995, 7998, 8002, 8003, 8004, 8007, 8011, 8010, 8011, 8013, 8015, 8015, 8016, 8018, 8021, 8021, 8021, 8024, 8027, 8027, 8029, 8031, 8035, 8034, 8035, 8036, 8039, 8038, 8039, 8041, 8044, 8044, 8045, 8047, 8051, 8051, 8053, 8055, 8058, 8058, 8059, 8060, 8063, 8062, 8063, 8065, 8068, 8068, 8069, 8071, 8075, 8075, 8077, 8079, 8082, 8082, 8083, 8084, 8087, 8086, 8087, 8089, 8092, 8092, 8093, 8095, 8099, 8099, 8101, 8103, 8106, 8106, 8107, 8108, 8111, 8110, 8111, 8113, 8116, 8116, 8117, 8119, 8123, 8123, 8125, 8127, 8130, 8130, 8131, 8132, 8135, 8134, 8135, 8137, 8140, 8140, 8141, 8143, 8147, 8147, 8149, 8151, 8154, 8154, 8154, 8156, 8158, 8158, 8158, 8160, 8164, 8163, 8164, 8167, 8170, 8171, 8172, 8175, 8178, 8178, 8179, 8181, 8184, 8184, 8185, 8187, 8191, 8191, 8192, 8195, 8198, 8199, 8200, 8203, 8206, 8206, 8206, 8208, 8210, 8209, 8210, 8211, 8214, 8214, 8214, 8216, 8220, 8220, 8221, 8223, 8226, 8226, 8227, 8228, 8231, 8231, 8232, 8234, 8238, 8238, 8239, 8242, 8246, 8246, 8248, 8251, 8254, 8254, 8255, 8257, 8259, 8259, 8259, 8261, 8265, 8264, 8265, 8268, 8271, 8271, 8273, 8275, 8278, 8278, 8279, 8280, 8283, 8282, 8283, 8285, 8288, 8288, 8289, 8292, 8295, 8295, 8297, 8299, 8302, 8302, 8302, 8304, 8306, 8305, 8305, 8307, 8310, 8310, 8310, 8312, 8316, 8316, 8317, 8319, 8322, 8322, 8322, 8324, 8326, 8326, 8326, 8328, 8332, 8331, 8332, 8335, 8338, 8339, 8340, 8343, 8346, 8346, 8347, 8348, 8351, 8350, 8351, 8353, 8356, 8356, 8357, 8359, 8363, 8363, 8365, 8367, 8370, 8370, 8370, 8372, 8375, 8374, 8375, 8377, 8380, 8380, 8381, 8383, 8387, 8387, 8388, 8391, 8394, 8394, 8394, 8396, 8399, 8398, 8399, 8401, 8404, 8404, 8405, 8407, 8411, 8411, 8412, 8415, 8418, 8418, 8419, 8420, 8423, 8422, 8423, 8425, 8428, 8428, 8429, 8432, 8435, 8435, 8437, 8439, 8442, 8442, 8442, 8443, 8446, 8445, 8445, 8447, 8450, 8450, 8450, 8452, 8456, 8456, 8457, 8459, 8462, 8462, 8462, 8464, 8466, 8466, 8466, 8468, 8471, 8471, 8472, 8475, 8478, 8479, 8480, 8483, 8486, 8486, 8487, 8488, 8491, 8491, 8491, 8493, 8497, 8496, 8497, 8500, 8503, 8503, 8505, 8507, 8510, 8510, 8510, 8511, 8514, 8513, 8513, 8515, 8518, 8517, 8518, 8520, 8523, 8524, 8525, 8527, 8530, 8530, 8530, 8532, 8535, 8534, 8535, 8537, 8540, 8540, 8541, 8543, 8547, 8547, 8548, 8551, 8554, 8554, 8554, 8555, 8558, 8557, 8557, 8559, 8562, 8562, 8562, 8564, 8568, 8568, 8569, 8571, 8574, 8574, 8574, 8576, 8578, 8578, 8578, 8580, 8583, 8583, 8584, 8587, 8590, 8591, 8592, 8595, 8598, 8598, 8599, 8600, 8603, 8602, 8603, 8605, 8608, 8608, 8609, 8611, 8615, 8615, 8617, 8619, 8622, 8622, 8622, 8624, 8626, 8625, 8626, 8627, 8630, 8630, 8630, 8633, 8636, 8636, 8637, 8639, 8642, 8642, 8642, 8643, 8645, 8644, 8645, 8646, 8649, 8649, 8650, 8652, 8655, 8655, 8657, 8659, 8662, 8662, 8662, 8664, 8667, 8666, 8667, 8669, 8672, 8672, 8673, 8675, 8679, 8679, 8680, 8683, 8686, 8686, 8686, 8688, 8690, 8689, 8690, 8691, 8694, 8694, 8695, 8697, 8700, 8700, 8701, 8703, 8706, 8706, 8706, 8707, 8709, 8708, 8709, 8710, 8713, 8713, 8713, 8716, 8719, 8719, 8720, 8723, 8726, 8726, 8726, 8728, 8731, 8730, 8730, 8733, 8736, 8736, 8737, 8739, 8743, 8743, 8744, 8747, 8750, 8750, 8750, 8751, 8754, 8753, 8753, 8755, 8758, 8758, 8758, 8761, 8764, 8764, 8765, 8767, 8770, 8770, 8770, 8771, 8774, 8773, 8773, 8775, 8778, 8777, 8778, 8780, 8784, 8784, 8785, 8787, 8790, 8790, 8790, 8791, 8793, 8792, 8793, 8794, 8797, 8797, 8798, 8800, 8803, 8803, 8805, 8807, 8810, 8810, 8810, 8812, 8814, 8814, 8814, 8816, 8820, 8819, 8820, 8823, 8827, 8827, 8828, 8831, 8834, 8834, 8834, 8836, 8838, 8837, 8838, 8840, 8843, 8842, 8843, 8845, 8848, 8848, 8849, 8851, 8854, 8853, 8853, 8854, 8857, 8855, 8855, 8857, 8860, 8859, 8859, 8861, 8864, 8864, 8865, 8867, 8870, 8869, 8869, 8871, 8873, 8872, 8872, 8874, 8877, 8876, 8877, 8879, 8883, 8883, 8884, 8887, 8890, 8890, 8890, 8892, 8895, 8894, 8894, 8897, 8900, 8900, 8901, 8903, 8907, 8907, 8908, 8911, 8914, 8914, 8914, 8915, 8918, 8917, 8917, 8919, 8922, 8922, 8922, 8924, 8928, 8928, 8929, 8931, 8934, 8934, 8934, 8935, 8938, 8937, 8937, 8939, 8942, 8942, 8942, 8944, 8948, 8948, 8949, 8951, 8954, 8953, 8953, 8954, 8957, 8955, 8955, 8957, 8960, 8959, 8959, 8961, 8964, 8964, 8965, 8967, 8970, 8969, 8969, 8971, 8973, 8972, 8973, 8974, 8978, 8977, 8978, 8980, 8983, 8983, 8985, 8987, 8990, 8990, 8990, 8991, 8993, 8992, 8992, 8994, 8997, 8997, 8997, 9000, 9003, 9003, 9004, 9007, 9010, 9010, 9010, 9012, 9015, 9014, 9015, 9017, 9020, 9020, 9021, 9023, 9027, 9027, 9028, 9031, 9034, 9033, 9033, 9035, 9037, 9036, 9036, 9037, 9040, 9039, 9039, 9041, 9045, 9044, 9045, 9047, 9050, 9049, 9049, 9051, 9053, 9052, 9053, 9054, 9058, 9057, 9058, 9060, 9064, 9064, 9065, 9067, 9070, 9069, 9069, 9070, 9073, 9071, 9071, 9073, 9076, 9075, 9075, 9077, 9080, 9080, 9081, 9083, 9086, 9085, 9085, 9087, 9089, 9088, 9088, 9090, 9093, 9093, 9093, 9096, 9099, 9099, 9100, 9103, 9106, 9106, 9106, 9107, 9110, 9109, 9109, 9111, 9114, 9113, 9114, 9116, 9120, 9120, 9121, 9123, 9126, 9125, 9126, 9127, 9129, 9128, 9129, 9131, 9134, 9133, 9134, 9136, 9139, 9139, 9141, 9143, 9146, 9145, 9146, 9147, 9149, 9148, 9149, 9150, 9154, 9153, 9154, 9156, 9159, 9159, 9160, 9163, 9166, 9166, 9166, 9167, 9170, 9169, 9169, 9171, 9174, 9174, 9174, 9176, 9180, 9180, 9181, 9183, 9186, 9185, 9185, 9186, 9188, 9187, 9187, 9189, 9192, 9191, 9191, 9193, 9196, 9196, 9197, 9199, 9202, 9201, 9201, 9203, 9205, 9204, 9205, 9207, 9210, 9209, 9210, 9212, 9216, 9216, 9217, 9219, 9222, 9221, 9221, 9222, 9225, 9223, 9223, 9225, 9228, 9227, 9227, 9229, 9232, 9232, 9233, 9235, 9238, 9237, 9237, 9238, 9241, 9240, 9240, 9242, 9245, 9244, 9245, 9247, 9251, 9251, 9252, 9255, 9258, 9258, 9258, 9259, 9262, 9261, 9261, 9263, 9266, 9266, 9266, 9268, 9272, 9272, 9273, 9275, 9278, 9277, 9277, 9278, 9280, 9279, 9279, 9281, 9284, 9283, 9283, 9285, 9288, 9288, 9289, 9291, 9294, 9293, 9293, 9294, 9297, 9296, 9296, 9298, 9301, 9300, 9301, 9303, 9307, 9307, 9308, 9311, 9314, 9314, 9314, 9315, 9318, 9317, 9317, 9319, 9322, 9322, 9322, 9324, 9328, 9328, 9329, 9331, 9334, 9333, 9333, 9334, 9336, 9335, 9335, 9337, 9339, 9339, 9339, 9341, 9344, 9344, 9345, 9347, 9350, 9349, 9349, 9351, 9353, 9352, 9353, 9354, 9358, 9357, 9358, 9360, 9363, 9363, 9365, 9367, 9370, 9369, 9369, 9370, 9372, 9371, 9371, 9373, 9376, 9375, 9375, 9377, 9380, 9380, 9381, 9383, 9386, 9385, 9385, 9387, 9389, 9388, 9388, 9390, 9393, 9393, 9393, 9396, 9399, 9399, 9400, 9403, 9406, 9405, 9405, 9406, 9409, 9408, 9408, 9409, 9412, 9411, 9412, 9413, 9417, 9416, 9417, 9419, 9422, 9421, 9421, 9422, 9424, 9423, 9422, 9424, 9427, 9426, 9426, 9428, 9432, 9432, 9433, 9435, 9438, 9437, 9437, 9439, 9441, 9440, 9441, 9443, 9446, 9445, 9446, 9448, 9452, 9451, 9453, 9455, 9458, 9457, 9457, 9458, 9460, 9459, 9459, 9461, 9464, 9463, 9463, 9465, 9468, 9468, 9469, 9471, 9474, 9473, 9473, 9475, 9477, 9476, 9476, 9478, 9482, 9481, 9482, 9484, 9487, 9487, 9488, 9491, 9494, 9493, 9493, 9494, 9496, 9495, 9495, 9497, 9500, 9499, 9499, 9501, 9504, 9504, 9505, 9507, 9510, 9509, 9509, 9511, 9513, 9512, 9512, 9514, 9518, 9517, 9518, 9520, 9523, 9523, 9524, 9527, 9530, 9529, 9529, 9530, 9532, 9531, 9531, 9533, 9536, 9535, 9535, 9537, 9540, 9540, 9541, 9543, 9546, 9545, 9545, 9547, 9549, 9548, 9548, 9550, 9553, 9553, 9553, 9556, 9559, 9559, 9560, 9563, 9566, 9565, 9565, 9566, 9569, 9567, 9567, 9569, 9572, 9571, 9571, 9573, 9577, 9576, 9577, 9579, 9582, 9581, 9581, 9582, 9584, 9582, 9582, 9584, 9587, 9586, 9586, 9588, 9592, 9592, 9593, 9595, 9598, 9597, 9597, 9599, 9601, 9600, 9600, 9602, 9605, 9605, 9605, 9608, 9611, 9611, 9612, 9615, 9618, 9617, 9617, 9618, 9621, 9619, 9619, 9621, 9624, 9623, 9623, 9625, 9629, 9628, 9629, 9631, 9634, 9633, 9633, 9634, 9636, 9634, 9634, 9636, 9639, 9638, 9638, 9640, 9644, 9644, 9644, 9647, 9650, 9649, 9649, 9651, 9653, 9652, 9652, 9654, 9657, 9657, 9657, 9660, 9663, 9663, 9664, 9667, 9670, 9669, 9669, 9670, 9673, 9671, 9671, 9673, 9676, 9675, 9675, 9677, 9681, 9680, 9681, 9683, 9686, 9685, 9685, 9686, 9688, 9687, 9687, 9688, 9691, 9690, 9691, 9693, 9696, 9696, 9697, 9699, 9702, 9701, 9701, 9702, 9704, 9703, 9703, 9704, 9707, 9706, 9707, 9709, 9712, 9712, 9713, 9715, 9718, 9717, 9717, 9718, 9720, 9719, 9719, 9721, 9724, 9723, 9723, 9725, 9728, 9728, 9729, 9731, 9734, 9733, 9733, 9734, 9736, 9734, 9734, 9736, 9739, 9738, 9738, 9740, 9744, 9744, 9744, 9747, 9750, 9749, 9749, 9751, 9753, 9752, 9752, 9754, 9757, 9757, 9757, 9760, 9763, 9763, 9764, 9767, 9770, 9769, 9769, 9770, 9773, 9771, 9771, 9773, 9776, 9775, 9775, 9777, 9780, 9780, 9781, 9783, 9786, 9785, 9785, 9786, 9788, 9787, 9787, 9788, 9791, 9790, 9791, 9793, 9796, 9796, 9797, 9799, 9802, 9801, 9801, 9802, 9804, 9803, 9803, 9804, 9807, 9806, 9807, 9809, 9812, 9812, 9813, 9815, 9818, 9817, 9817, 9818, 9820, 9819, 9819, 9820, 9823, 9822, 9823, 9825, 9828, 9828, 9829, 9831, 9834, 9833, 9833, 9834, 9836, 9835, 9835, 9836, 9839, 9838, 9839, 9841, 9844, 9844, 9845, 9847, 9850, 9849, 9849, 9850, 9852, 9851, 9851, 9852, 9855, 9854, 9855, 9857, 9860, 9860, 9861, 9863, 9866, 9865, 9865, 9866, 9868, 9867, 9867, 9869, 9872, 9871, 9871, 9873, 9877, 9876, 9877, 9879, 9882, 9881, 9880, 9881, 9883, 9882, 9881, 9883, 9885, 9884, 9884, 9886, 9889, 9888, 9889, 9891, 9894, 9893, 9892, 9893, 9896, 9894, 9894, 9896, 9899, 9898, 9898, 9900, 9904, 9904, 9905, 9907, 9910, 9909, 9909, 9910, 9912, 9911, 9911, 9912, 9915, 9914, 9915, 9917, 9920, 9920, 9921, 9923, 9926, 9925, 9925, 9926, 9928, 9927, 9927, 9928, 9931, 9930, 9931, 9933, 9936, 9936, 9937, 9939, 9942, 9941, 9941, 9942, 9944, 9943, 9943, 9944, 9947, 9946, 9947, 9949, 9952, 9952, 9953, 9955, 9958, 9957, 9957, 9958, 9960, 9959, 9959, 9960, 9963, 9962, 9963, 9965, 9968, 9968, 9969, 9971, 9974, 9973, 9973, 9974, 9976, 9975, 9975, 9976, 9979, 9978, 9979, 9981, 9984, 9984, 9985, 9987, 9990, 9989, 9989, 9990, 9992, 9991, 9990, 9992, 9995, 9994, 9994, 9997, 10000, 10000, 10001, 10003, 10006, 10005, 10005, 10006, 10008, 10007, 10007, 10009, 10012, 10011, 10011, 10013, 10017, 10016, 10017, 10019, 10022, 10021, 10020, 10021, 10023, 10021, 10021, 10022, 10025, 10024, 10024, 10026, 10029, 10028, 10029, 10031, 10034, 10033, 10032, 10034, 10036, 10035, 10034, 10036, 10039, 10038, 10039, 10041, 10044, 10044, 10045, 10047, 10050, 10049, 10048, 10049, 10051, 10050, 10049, 10051, 10053, 10052, 10052, 10054, 10057, 10056, 10057, 10059, 10062, 10061, 10060, 10061, 10064, 10062, 10062, 10064, 10067, 10066, 10066, 10068, 10072, 10071, 10072, 10075, 10078, 10077, 10077, 10078, 10080, 10079, 10079, 10080, 10083, 10082, 10083, 10085, 10088, 10088, 10089, 10091, 10094, 10093, 10092, 10094, 10096, 10094, 10094, 10096, 10099, 10098, 10098, 10100, 10104, 10104, 10104, 10107, 10110, 10109, 10109, 10110, 10112, 10111, 10111, 10113, 10116, 10115, 10115, 10117, 10120, 10120, 10121, 10123, 10126, 10125, 10124, 10125, 10127, 10125, 10125, 10126, 10129, 10128, 10128, 10130, 10133, 10132, 10133, 10135, 10138, 10137, 10136, 10138, 10140, 10138, 10138, 10140, 10143, 10142, 10143, 10145, 10148, 10148, 10149, 10151, 10154, 10153, 10152, 10153, 10155, 10153, 10153, 10154, 10157, 10156, 10156, 10158, 10161, 10160, 10161, 10163, 10166, 10165, 10164, 10165, 10168, 10166, 10166, 10168, 10171, 10170, 10170, 10173, 10176, 10176, 10177, 10179, 10182, 10181, 10180, 10181, 10183, 10182, 10181, 10183, 10185, 10184, 10184, 10186, 10189, 10188, 10189, 10191, 10194, 10193, 10192, 10193, 10196, 10194, 10194, 10196, 10199, 10198, 10198, 10200, 10204, 10203, 10204, 10207, 10210, 10209, 10209, 10210, 10212, 10211, 10211, 10213, 10216, 10215, 10215, 10217, 10221, 10220, 10221, 10223, 10226, 10225, 10224, 10225, 10227, 10225, 10225, 10226, 10229, 10228, 10228, 10230, 10233, 10232, 10233, 10235, 10238, 10237, 10236, 10237, 10240, 10238, 10238, 10240, 10243, 10242, 10242, 10245, 10248, 10248, 10249, 10251, 10254, 10253, 10252, 10253, 10255, 10253, 10253, 10255, 10257, 10256, 10256, 10258, 10261, 10260, 10261, 10263, 10266, 10265, 10264, 10265, 10268, 10266, 10266, 10267, 10271, 10270, 10270, 10272, 10276, 10275, 10276, 10279, 10282, 10281, 10281, 10282, 10284, 10283, 10283, 10285, 10288, 10287, 10287, 10289, 10292, 10292, 10293, 10295, 10298, 10297, 10296, 10297, 10299, 10297, 10297, 10298, 10301, 10300, 10300, 10302, 10305, 10304, 10305, 10307, 10310, 10309, 10308, 10309, 10312, 10310, 10310, 10312, 10315, 10314, 10314, 10316, 10320, 10320, 10320, 10323, 10326, 10325, 10324, 10325, 10327, 10326, 10325, 10327, 10330, 10328, 10328, 10330, 10333, 10333, 10333, 10335, 10338, 10336, 10336, 10337, 10339, 10337, 10336, 10338, 10341, 10339, 10339, 10341, 10345, 10344, 10345, 10347, 10350, 10349, 10348, 10349, 10352, 10350, 10350, 10352, 10355, 10354, 10354, 10356, 10360, 10359, 10360, 10363, 10366, 10365, 10365, 10366, 10368, 10367, 10367, 10368, 10372, 10370, 10371, 10373, 10376, 10376, 10377, 10379, 10382, 10381, 10380, 10381, 10383, 10382, 10381, 10383, 10386, 10384, 10384, 10386, 10389, 10389, 10389, 10391, 10394, 10392, 10392, 10393, 10395, 10393, 10392, 10394, 10397, 10395, 10395, 10397, 10400, 10400, 10401, 10403, 10406, 10405, 10404, 10405, 10408, 10406, 10406, 10408, 10411, 10410, 10410, 10413, 10416, 10416, 10417, 10419, 10422, 10421, 10420, 10421, 10423, 10421, 10421, 10422, 10425, 10424, 10424, 10426, 10429, 10428, 10429, 10431, 10434, 10433, 10432, 10433, 10435, 10434, 10434, 10435, 10439, 10437, 10438, 10440, 10444, 10443, 10444, 10447, 10450, 10449, 10449, 10450, 10452, 10451, 10451, 10452, 10456, 10454, 10455, 10457, 10460, 10460, 10461, 10463, 10466, 10465, 10464, 10465, 10467, 10465, 10465, 10467, 10469, 10468, 10468, 10470, 10473, 10472, 10473, 10475, 10478, 10476, 10476, 10477, 10479, 10477, 10477, 10478, 10481, 10480, 10480, 10482, 10485, 10484, 10485, 10487, 10490, 10488, 10488, 10489, 10491, 10489, 10488, 10490, 10493, 10491, 10491, 10493, 10497, 10496, 10497, 10499, 10502, 10501, 10500, 10501, 10504, 10502, 10502, 10503, 10507, 10506, 10506, 10508, 10512, 10511, 10512, 10515, 10518, 10517, 10516, 10518, 10520, 10519, 10519, 10520, 10523, 10522, 10523, 10525, 10528, 10528, 10529, 10531, 10534, 10533, 10532, 10533, 10535, 10533, 10533, 10534, 10537, 10536, 10536, 10538, 10541, 10540, 10541, 10543, 10546, 10544, 10544, 10545, 10547, 10545, 10545, 10546, 10549, 10548, 10548, 10550, 10553, 10552, 10553, 10555, 10558, 10556, 10556, 10557, 10559, 10557, 10556, 10558, 10561, 10559, 10559, 10561, 10565, 10564, 10565, 10567, 10570, 10569, 10568, 10569, 10572, 10570, 10570, 10572, 10575, 10574, 10574, 10576, 10580, 10580, 10580, 10583, 10586, 10584, 10584, 10585, 10587, 10585, 10585, 10586, 10589, 10588, 10588, 10589, 10593, 10592, 10593, 10595, 10598, 10597, 10596, 10597, 10600, 10598, 10598, 10600, 10603, 10602, 10602, 10604, 10608, 10607, 10608, 10611, 10614, 10613, 10612, 10613, 10615, 10613, 10613, 10615, 10617, 10616, 10616, 10618, 10621, 10620, 10621, 10623, 10626, 10624, 10624, 10625, 10627, 10625, 10625, 10626, 10629, 10628, 10628, 10630, 10633, 10632, 10633, 10635, 10638, 10636, 10636, 10636, 10639, 10637, 10636, 10638, 10641, 10639, 10639, 10641, 10644, 10644, 10644, 10647, 10650, 10649, 10648, 10649, 10652, 10650, 10650, 10652, 10655, 10654, 10654, 10656, 10660, 10660, 10660, 10663, 10666, 10665, 10664, 10665, 10667, 10665, 10665, 10666, 10669, 10668, 10668, 10670, 10673, 10672, 10673, 10675, 10678, 10676, 10676, 10677, 10679, 10677, 10677, 10678, 10681, 10680, 10680, 10681, 10685, 10684, 10685, 10687, 10690, 10688, 10688, 10688, 10691, 10689, 10688, 10690, 10693, 10691, 10691, 10693, 10696, 10696, 10696, 10699, 10702, 10701, 10700, 10701, 10704, 10702, 10702, 10704, 10707, 10706, 10706, 10708, 10712, 10711, 10712, 10715, 10718, 10716, 10716, 10717, 10719, 10717, 10717, 10718, 10721, 10720, 10720, 10722, 10725, 10724, 10725, 10727, 10730, 10728, 10728, 10729, 10731, 10729, 10728, 10730, 10733, 10731, 10731, 10733, 10737, 10736, 10737, 10739, 10742, 10740, 10740, 10741, 10743, 10741, 10741, 10742, 10745, 10744, 10744, 10746, 10749, 10748, 10749, 10751, 10754, 10752, 10752, 10752, 10755, 10753, 10752, 10754, 10757, 10755, 10755, 10757, 10760, 10760, 10760, 10763, 10766, 10765, 10764, 10765, 10768, 10766, 10766, 10768, 10771, 10770, 10770, 10772, 10776, 10775, 10776, 10779, 10782, 10780, 10780, 10781, 10783, 10781, 10781, 10782, 10785, 10784, 10784, 10786, 10789, 10788, 10789, 10791, 10794, 10792, 10792, 10792, 10795, 10793, 10792, 10794, 10797, 10795, 10795, 10797, 10801, 10800, 10801, 10803, 10806, 10804, 10804, 10805, 10807, 10805, 10805, 10806, 10809, 10808, 10808, 10810, 10813, 10812, 10813, 10815, 10818, 10816, 10816, 10816, 10819, 10817, 10816, 10818, 10821, 10819, 10819, 10821, 10824, 10824, 10824, 10827, 10830, 10828, 10828, 10829, 10832, 10830, 10830, 10832, 10835, 10834, 10834, 10836, 10840, 10839, 10840, 10843, 10846, 10845, 10844, 10845, 10848, 10846, 10845, 10847, 10850, 10848, 10848, 10850, 10854, 10853, 10853, 10855, 10858, 10856, 10855, 10856, 10858, 10855, 10855, 10856, 10858, 10857, 10856, 10858, 10861, 10860, 10861, 10863, 10866, 10864, 10864, 10865, 10867, 10866, 10865, 10867, 10870, 10869, 10870, 10872, 10876, 10875, 10876, 10879, 10882, 10880, 10880, 10881, 10883, 10881, 10881, 10883, 10885, 10884, 10884, 10886, 10889, 10888, 10889, 10891, 10894, 10892, 10892, 10892, 10895, 10893, 10892, 10894, 10897, 10895, 10895, 10897, 10901, 10900, 10901, 10903, 10906, 10904, 10904, 10905, 10907, 10905, 10904, 10906, 10909, 10907, 10907, 10909, 10913, 10912, 10913, 10915, 10918, 10916, 10916, 10917, 10919, 10917, 10916, 10918, 10921, 10919, 10919, 10921, 10925, 10924, 10925, 10927, 10930, 10928, 10928, 10929, 10931, 10929, 10928, 10930, 10933, 10931, 10931, 10933, 10937, 10936, 10937, 10939, 10942, 10940, 10940, 10940, 10943, 10941, 10940, 10942, 10945, 10943, 10943, 10945, 10949, 10948, 10949, 10951, 10954, 10952, 10952, 10952, 10955, 10953, 10952, 10954, 10957, 10955, 10955, 10957, 10961, 10960, 10961, 10963, 10966, 10964, 10964, 10964, 10967, 10965, 10964, 10966, 10969, 10967, 10967, 10969, 10973, 10972, 10973, 10975, 10978, 10976, 10976, 10976, 10979, 10977, 10976, 10978, 10981, 10979, 10979, 10981, 10985, 10984, 10985, 10987, 10990, 10988, 10988, 10988, 10991, 10989, 10988, 10990, 10993, 10991, 10991, 10993, 10997, 10996, 10997, 10999, 11002, 11000, 11000, 11000, 11003, 11001, 11000, 11002, 11005, 11003, 11003, 11005, 11009, 11008, 11009, 11011, 11014, 11012, 11012, 11012, 11015, 11013, 11012, 11014, 11017, 11015, 11015, 11017, 11021, 11020, 11021, 11023, 11026, 11024, 11024, 11024, 11027, 11025, 11024, 11026, 11029, 11027, 11027, 11029, 11033, 11032, 11033, 11035, 11038, 11036, 11036, 11036, 11039, 11037, 11036, 11038, 11041, 11039, 11039, 11041, 11045, 11044, 11045, 11047, 11050, 11048, 11048, 11048, 11051, 11049, 11048, 11050, 11053, 11051, 11051, 11053, 11057, 11056, 11057, 11059, 11062, 11060, 11060, 11060, 11063, 11061, 11060, 11062, 11065, 11063, 11063, 11065, 11069, 11068, 11069, 11071, 11074, 11072, 11072, 11072, 11075, 11073, 11072, 11074, 11077, 11075, 11075, 11077, 11081, 11080, 11080, 11083, 11086, 11084, 11084, 11084, 11087, 11085, 11084, 11086, 11089, 11087, 11087, 11089, 11093, 11092, 11093, 11095, 11098, 11096, 11095, 11096, 11099, 11097, 11096, 11098, 11101, 11099, 11099, 11101, 11105, 11104, 11104, 11107, 11110, 11108, 11108, 11109, 11111, 11109, 11109, 11110, 11113, 11112, 11112, 11114, 11117, 11116, 11117, 11119, 11122, 11120, 11119, 11120, 11122, 11120, 11119, 11120, 11123, 11121, 11121, 11123, 11126, 11125, 11125, 11127, 11130, 11128, 11127, 11128, 11130, 11128, 11127, 11129, 11132, 11130, 11130, 11132, 11136, 11135, 11136, 11138, 11142, 11140, 11140, 11141, 11144, 11142, 11142, 11144, 11147, 11146, 11146, 11149, 11152, 11152, 11152, 11155, 11158, 11156, 11155, 11156, 11158, 11156, 11155, 11156, 11159, 11157, 11157, 11159, 11162, 11161, 11161, 11163, 11166, 11164, 11163, 11164, 11166, 11164, 11164, 11165, 11168, 11167, 11167, 11169, 11172, 11172, 11172, 11175, 11178, 11176, 11176, 11176, 11179, 11177, 11176, 11178, 11181, 11179, 11179, 11181, 11185, 11184, 11184, 11187, 11190, 11188, 11187, 11188, 11191, 11189, 11188, 11190, 11193, 11191, 11191, 11193, 11197, 11196, 11196, 11199, 11202, 11200, 11199, 11200, 11203, 11201, 11200, 11202, 11205, 11203, 11203, 11205, 11209, 11208, 11208, 11211, 11214, 11212, 11211, 11212, 11215, 11213, 11212, 11214, 11217, 11215, 11215, 11217, 11221, 11220, 11220, 11223, 11226, 11224, 11223, 11224, 11227, 11225, 11224, 11226, 11229, 11227, 11227, 11229, 11233, 11232, 11232, 11235, 11238, 11236, 11236, 11237, 11239, 11237, 11237, 11238, 11241, 11240, 11240, 11242, 11245, 11244, 11245, 11247, 11250, 11248, 11247, 11248, 11250, 11248, 11247, 11248, 11251, 11249, 11249, 11250, 11254, 11253, 11253, 11255, 11258, 11256, 11255, 11256, 11258, 11256, 11255, 11257, 11260, 11258, 11258, 11260, 11264, 11263, 11264, 11266, 11270, 11268, 11268, 11269, 11272, 11270, 11270, 11272, 11275, 11274, 11274, 11276, 11280, 11280, 11280, 11283, 11286, 11284, 11283, 11284, 11286, 11284, 11283, 11284, 11287, 11285, 11285, 11287, 11290, 11289, 11289, 11291, 11294, 11292, 11291, 11292, 11294, 11292, 11292, 11293, 11296, 11295, 11295, 11297, 11300, 11300, 11300, 11303, 11306, 11304, 11303, 11304, 11307, 11305, 11304, 11306, 11309, 11307, 11307, 11309, 11313, 11312, 11312, 11315, 11318, 11316, 11315, 11316, 11318, 11316, 11316, 11317, 11321, 11319, 11319, 11321, 11324, 11324, 11324, 11327, 11330, 11328, 11328, 11329, 11331, 11329, 11329, 11330, 11333, 11332, 11332, 11334, 11337, 11336, 11337, 11339, 11342, 11340, 11339, 11339, 11341, 11339, 11338, 11339, 11342, 11340, 11340, 11342, 11345, 11344, 11344, 11347, 11350, 11348, 11348, 11349, 11351, 11350, 11349, 11351, 11355, 11353, 11354, 11356, 11360, 11359, 11360, 11362, 11366, 11364, 11363, 11364, 11366, 11364, 11363, 11364, 11367, 11365, 11365, 11367, 11370, 11369, 11369, 11371, 11374, 11372, 11371, 11372, 11374, 11372, 11371, 11373, 11376, 11375, 11375, 11377, 11380, 11379, 11380, 11382, 11386, 11384, 11383, 11384, 11387, 11385, 11384, 11386, 11389, 11387, 11387, 11389, 11393, 11392, 11392, 11395, 11398, 11396, 11395, 11396, 11398, 11396, 11396, 11397, 11400, 11399, 11399, 11401, 11404, 11404, 11404, 11407, 11410, 11408, 11407, 11408, 11411, 11409, 11408, 11410, 11413, 11412, 11411, 11413, 11417, 11416, 11417, 11419, 11422, 11420, 11419, 11420, 11422, 11419, 11419, 11420, 11423, 11421, 11420, 11422, 11425, 11424, 11425, 11427, 11430, 11428, 11427, 11428, 11430, 11428, 11428, 11429, 11432, 11431, 11431, 11433, 11436, 11436, 11436, 11438, 11442, 11440, 11439, 11440, 11443, 11441, 11440, 11442, 11445, 11443, 11443, 11445, 11449, 11448, 11448, 11451, 11454, 11452, 11451, 11452, 11455, 11453, 11452, 11454, 11457, 11455, 11455, 11457, 11461, 11460, 11461, 11463, 11466, 11464, 11463, 11464, 11466, 11463, 11463, 11464, 11467, 11465, 11464, 11466, 11469, 11468, 11469, 11471, 11474, 11472, 11471, 11472, 11474, 11472, 11472, 11473, 11476, 11475, 11475, 11477, 11480, 11480, 11480, 11482, 11486, 11484, 11483, 11484, 11487, 11484, 11484, 11485, 11489, 11487, 11487, 11489, 11492, 11492, 11492, 11494, 11498, 11496, 11495, 11496, 11499, 11497, 11496, 11498, 11501, 11500, 11500, 11501, 11505, 11504, 11505, 11507, 11510, 11508, 11507, 11507, 11509, 11507, 11506, 11507, 11510, 11508, 11508, 11510, 11513, 11512, 11512, 11515, 11518, 11516, 11516, 11517, 11519, 11518, 11517, 11519, 11523, 11521, 11522, 11524, 11528, 11527, 11528, 11530, 11534, 11532, 11531, 11532, 11534, 11532, 11531, 11532, 11535, 11533, 11533, 11535, 11538, 11537, 11537, 11539, 11542, 11540, 11539, 11540, 11542, 11540, 11539, 11541, 11544, 11542, 11542, 11544, 11548, 11547, 11548, 11550, 11554, 11552, 11551, 11552, 11555, 11552, 11552, 11554, 11557, 11555, 11555, 11557, 11561, 11560, 11560, 11562, 11566, 11564, 11563, 11564, 11567, 11565, 11564, 11566, 11569, 11567, 11567, 11569, 11573, 11572, 11572, 11575, 11578, 11576, 11575, 11576, 11578, 11575, 11574, 11576, 11579, 11577, 11576, 11578, 11581, 11580, 11581, 11583, 11586, 11584, 11583, 11584, 11586, 11584, 11583, 11585, 11588, 11587, 11587, 11589, 11592, 11591, 11592, 11594, 11598, 11596, 11595, 11596, 11599, 11596, 11596, 11597, 11601, 11599, 11599, 11601, 11604, 11604, 11604, 11606, 11610, 11608, 11607, 11608, 11611, 11609, 11608, 11610, 11613, 11611, 11611, 11613, 11617, 11616, 11616, 11619, 11622, 11620, 11619, 11620, 11622, 11619, 11618, 11620, 11623, 11621, 11620, 11622, 11625, 11624, 11625, 11627, 11630, 11628, 11627, 11628, 11630, 11628, 11627, 11629, 11632, 11630, 11630, 11632, 11636, 11635, 11636, 11638, 11642, 11640, 11639, 11640, 11643, 11641, 11640, 11642, 11645, 11643, 11643, 11645, 11649, 11648, 11648, 11651, 11654, 11652, 11651, 11651, 11654, 11651, 11650, 11652, 11655, 11653, 11652, 11654, 11657, 11656, 11657, 11659, 11662, 11660, 11659, 11660, 11662, 11660, 11659, 11661, 11664, 11663, 11662, 11665, 11668, 11667, 11668, 11670, 11674, 11672, 11671, 11672, 11674, 11672, 11672, 11673, 11677, 11675, 11675, 11677, 11680, 11680, 11680, 11682, 11686, 11684, 11683, 11684, 11687, 11685, 11684, 11686, 11689, 11687, 11687, 11689, 11693, 11692, 11692, 11695, 11698, 11696, 11695, 11696, 11698, 11696, 11695, 11696, 11699, 11697, 11697, 11699, 11702, 11701, 11701, 11703, 11706, 11704, 11702, 11703, 11705, 11702, 11701, 11703, 11706, 11704, 11703, 11705, 11709, 11708, 11708, 11710, 11714, 11712, 11711, 11713, 11715, 11713, 11713, 11715, 11718, 11717, 11717, 11720, 11724, 11723, 11724, 11726, 11730, 11728, 11727, 11728, 11730, 11728, 11727, 11729, 11731, 11730, 11729, 11731, 11734, 11733, 11733, 11735, 11738, 11736, 11734, 11735, 11737, 11735, 11734, 11735, 11738, 11736, 11736, 11738, 11741, 11740, 11740, 11743, 11746, 11744, 11743, 11744, 11746, 11744, 11744, 11745, 11748, 11747, 11747, 11749, 11752, 11751, 11752, 11754, 11758, 11756, 11755, 11756, 11758, 11756, 11756, 11757, 11760, 11759, 11759, 11761, 11764, 11764, 11764, 11766, 11770, 11768, 11767, 11768, 11771, 11769, 11768, 11770, 11773, 11771, 11771, 11773, 11777, 11776, 11776, 11779, 11782, 11780, 11779, 11779, 11782, 11779, 11778, 11780, 11782, 11781, 11780, 11782, 11785, 11784, 11785, 11787, 11790, 11788, 11787, 11788, 11790, 11788, 11787, 11789, 11792, 11790, 11790, 11792, 11796, 11795, 11796, 11798, 11802, 11800, 11799, 11800, 11803, 11801, 11800, 11802, 11805, 11803, 11803, 11805, 11809, 11808, 11808, 11811, 11814, 11812, 11811, 11811, 11813, 11811, 11810, 11811, 11814, 11812, 11812, 11814, 11817, 11816, 11816, 11819, 11822, 11820, 11819, 11820, 11822, 11820, 11820, 11821, 11824, 11823, 11823, 11825, 11829, 11828, 11828, 11830, 11834, 11832, 11831, 11831, 11834, 11831, 11830, 11832, 11834, 11833, 11832, 11834, 11837, 11836, 11836, 11839, 11842, 11840, 11839, 11840, 11842, 11840, 11840, 11841, 11844, 11843, 11843, 11845, 11848, 11848, 11848, 11850, 11854, 11852, 11851, 11851, 11854, 11851, 11850, 11852, 11855, 11853, 11852, 11854, 11857, 11856, 11857, 11859, 11862, 11860, 11859, 11860, 11862, 11860, 11859, 11861, 11864, 11862, 11862, 11864, 11868, 11867, 11868, 11870, 11874, 11872, 11871, 11872, 11875, 11873, 11872, 11874, 11877, 11875, 11875, 11877, 11881, 11880, 11880, 11883, 11886, 11884, 11883, 11883, 11885, 11883, 11882, 11884, 11886, 11884, 11884, 11886, 11889, 11888, 11888, 11891, 11894, 11892, 11891, 11892, 11894, 11892, 11891, 11893, 11896, 11894, 11894, 11896, 11900, 11899, 11900, 11902, 11906, 11904, 11903, 11904, 11907, 11905, 11904, 11906, 11909, 11907, 11907, 11909, 11913, 11912, 11912, 11914, 11918, 11916, 11915, 11916, 11918, 11915, 11915, 11916, 11919, 11917, 11917, 11918, 11922, 11920, 11921, 11923, 11926, 11924, 11922, 11923, 11925, 11923, 11922, 11923, 11926, 11924, 11924, 11926, 11929, 11928, 11928, 11930, 11934, 11932, 11931, 11932, 11934, 11932, 11931, 11933, 11936, 11934, 11934, 11936, 11940, 11939, 11940, 11942, 11946, 11944, 11943, 11944, 11947, 11945, 11944, 11946, 11949, 11947, 11947, 11949, 11953, 11952, 11952, 11955, 11958, 11956, 11955, 11955, 11957, 11955, 11954, 11955, 11958, 11956, 11956, 11958, 11961, 11960, 11960, 11962, 11966, 11964, 11963, 11964, 11966, 11964, 11964, 11965, 11968, 11967, 11967, 11969, 11972, 11972, 11972, 11974, 11978, 11976, 11975, 11975, 11977, 11975, 11974, 11975, 11978, 11976, 11976, 11978, 11981, 11980, 11980, 11982, 11986, 11984, 11983, 11984, 11986, 11984, 11984, 11985, 11988, 11987, 11987, 11989, 11992, 11992, 11992, 11994, 11998, 11996, 11995, 11995, 11997, 11995, 11994, 11995, 11998, 11996, 11996, 11998, 12001, 12000, 12000, 12002, 12006, 12004, 12003, 12004, 12006, 12004, 12004, 12005, 12008, 12007, 12007, 12009, 12012, 12012, 12012, 12014, 12018, 12016, 12015, 12015, 12018, 12015, 12014, 12016, 12019, 12017, 12016, 12018, 12021, 12020, 12020, 12023, 12026, 12024, 12023, 12024, 12026, 12024, 12023, 12025, 12028, 12026, 12026, 12028, 12032, 12031, 12032, 12034, 12038, 12036, 12035, 12036, 12039, 12036, 12036, 12038, 12041, 12039, 12039, 12041, 12045, 12044, 12044, 12046, 12050, 12048, 12047, 12047, 12050, 12047, 12047, 12048, 12051, 12049, 12048, 12050, 12054, 12052, 12053, 12055, 12058, 12055, 12054, 12055, 12057, 12054, 12054, 12055, 12058, 12056, 12055, 12057, 12061, 12060, 12060, 12062, 12066, 12064, 12063, 12064, 12066, 12064, 12064, 12065, 12068, 12067, 12067, 12069, 12073, 12072, 12072, 12074, 12078, 12076, 12075, 12075, 12077, 12075, 12074, 12075, 12078, 12076, 12076, 12078, 12081, 12080, 12080, 12082, 12086, 12084, 12083, 12084, 12086, 12084, 12083, 12085, 12088, 12087, 12087, 12089, 12092, 12092, 12092, 12094, 12098, 12096, 12095, 12095, 12097, 12095, 12094, 12095, 12098, 12096, 12096, 12098, 12101, 12100, 12100, 12102, 12106, 12104, 12103, 12104, 12106, 12104, 12103, 12105, 12108, 12107, 12107, 12109, 12112, 12112, 12112, 12114, 12118, 12116, 12115, 12115, 12117, 12115, 12114, 12115, 12118, 12116, 12116, 12118, 12121, 12120, 12120, 12122, 12126, 12124, 12123, 12124, 12126, 12124, 12123, 12125, 12128, 12126, 12126, 12129, 12132, 12131, 12132, 12134, 12138, 12136, 12135, 12136, 12138, 12135, 12135, 12136, 12139, 12137, 12137, 12138, 12142, 12140, 12141, 12143, 12146, 12143, 12142, 12143, 12145, 12142, 12142, 12143, 12146, 12144, 12144, 12145, 12149, 12148, 12148, 12150, 12154, 12152, 12151, 12152, 12154, 12152, 12151, 12153, 12156, 12154, 12154, 12156, 12160, 12159, 12160, 12162, 12166, 12164, 12163, 12164, 12167, 12164, 12164, 12165, 12169, 12167, 12167, 12169, 12173, 12172, 12172, 12174, 12178, 12176, 12175, 12175, 12178, 12175, 12174, 12176, 12179, 12177, 12176, 12178, 12182, 12180, 12181, 12183, 12186, 12183, 12182, 12183, 12185, 12182, 12181, 12183, 12186, 12184, 12183, 12185, 12189, 12188, 12188, 12190, 12194, 12192, 12191, 12192, 12194, 12192, 12191, 12193, 12196, 12195, 12195, 12197, 12200, 12199, 12200, 12202, 12206, 12204, 12203, 12203, 12206, 12203, 12203, 12204, 12207, 12205, 12204, 12206, 12210, 12208, 12209, 12211, 12214, 12211, 12210, 12211, 12213, 12210, 12209, 12211, 12214, 12212, 12211, 12213, 12217, 12216, 12216, 12218, 12222, 12220, 12219, 12220, 12222, 12220, 12219, 12221, 12224, 12223, 12222, 12225, 12228, 12227, 12228, 12230, 12234, 12232, 12231, 12231, 12234, 12231, 12230, 12232, 12235, 12233, 12232, 12234, 12238, 12236, 12237, 12239, 12242, 12239, 12238, 12239, 12241, 12238, 12237, 12239, 12242, 12240, 12239, 12241, 12245, 12244, 12244, 12246, 12250, 12248, 12247, 12248, 12250, 12248, 12247, 12249, 12252, 12251, 12250, 12253, 12256, 12255, 12256, 12258, 12262, 12260, 12259, 12259, 12262, 12259, 12258, 12260, 12263, 12261, 12260, 12262, 12266, 12264, 12265, 12267, 12270, 12267, 12266, 12267, 12269, 12266, 12265, 12267, 12270, 12268, 12267, 12269, 12273, 12272, 12272, 12274, 12278, 12276, 12275, 12276, 12278, 12276, 12275, 12277, 12280, 12279, 12279, 12281, 12284, 12284, 12284, 12286, 12290, 12288, 12286, 12287, 12289, 12287, 12286, 12287, 12290, 12288, 12288, 12290, 12293, 12292, 12292, 12294, 12298, 12296, 12295, 12296, 12298, 12296, 12295, 12297, 12300, 12299, 12298, 12301, 12304, 12303, 12304, 12306, 12310, 12308, 12306, 12307, 12309, 12307, 12306, 12307, 12310, 12308, 12308, 12310, 12313, 12312, 12312, 12314, 12318, 12316, 12315, 12316, 12318, 12316, 12315, 12317, 12320, 12318, 12318, 12320, 12324, 12323, 12324, 12326, 12330, 12328, 12327, 12327, 12330, 12327, 12326, 12328, 12331, 12329, 12328, 12330, 12334, 12332, 12333, 12335, 12338, 12335, 12334, 12335, 12337, 12334, 12333, 12335, 12338, 12336, 12335, 12337, 12341, 12340, 12340, 12342, 12346, 12344, 12343, 12344, 12346, 12344, 12343, 12345, 12348, 12346, 12346, 12349, 12352, 12351, 12352, 12354, 12358, 12356, 12355, 12355, 12358, 12355, 12354, 12356, 12359, 12357, 12356, 12358, 12362, 12360, 12361, 12363, 12366, 12363, 12362, 12363, 12365, 12362, 12361, 12363, 12366, 12364, 12363, 12365, 12369, 12368, 12368, 12370, 12374, 12372, 12371, 12372, 12374, 12372, 12371, 12373, 12376, 12374, 12374, 12376, 12380, 12379, 12380, 12382, 12386, 12384, 12383, 12383, 12386, 12383, 12382, 12384, 12387, 12385, 12384, 12386, 12390, 12388, 12388, 12391, 12394, 12391, 12390, 12391, 12393, 12390, 12389, 12391, 12394, 12392, 12391, 12393, 12397, 12396, 12396, 12398, 12402, 12400, 12399, 12400, 12402, 12400, 12399, 12401, 12404, 12402, 12402, 12404, 12408, 12407, 12408, 12410, 12414, 12412, 12411, 12411, 12414, 12411, 12410, 12412, 12415, 12413, 12412, 12414, 12417, 12416, 12416, 12418, 12422, 12419, 12418, 12419, 12421, 12418, 12418, 12419, 12422, 12420, 12420, 12421, 12425, 12424, 12424, 12426, 12430, 12427, 12426, 12427, 12429, 12427, 12426, 12427, 12430, 12428, 12428, 12430, 12433, 12432, 12432, 12434, 12438, 12435, 12434, 12435, 12437, 12434, 12433, 12435, 12438, 12436, 12435, 12437, 12441, 12440, 12440, 12442, 12446, 12444, 12443, 12444, 12446, 12444, 12443, 12445, 12448, 12446, 12446, 12448, 12452, 12451, 12452, 12454, 12458, 12456, 12455, 12455, 12458, 12455, 12454, 12456, 12459, 12457, 12456, 12458, 12462, 12460, 12460, 12462, 12466, 12463, 12462, 12463, 12465, 12462, 12461, 12463, 12466, 12464, 12463, 12465, 12469, 12468, 12468, 12470, 12474, 12472, 12471, 12472, 12474, 12472, 12471, 12473, 12476, 12474, 12474, 12476, 12480, 12479, 12480, 12482, 12486, 12484, 12483, 12483, 12486, 12483, 12482, 12484, 12487, 12485, 12484, 12486, 12490, 12488, 12488, 12490, 12494, 12491, 12490, 12491, 12493, 12490, 12489, 12491, 12494, 12492, 12491, 12493, 12497, 12496, 12496, 12498, 12502, 12500, 12499, 12500, 12502, 12500, 12499, 12501, 12504, 12502, 12502, 12504, 12508, 12507, 12508, 12510, 12514, 12511, 12510, 12511, 12513, 12511, 12510, 12512, 12515, 12512, 12512, 12514, 12517, 12516, 12516, 12518, 12522, 12519, 12518, 12519, 12521, 12519, 12518, 12519, 12522, 12520, 12520, 12522, 12525, 12524, 12524, 12526, 12530, 12527, 12526, 12527, 12529, 12526, 12525, 12527, 12530, 12528, 12527, 12529, 12533, 12532, 12532, 12534, 12538, 12536, 12535, 12536, 12538, 12536, 12535, 12537, 12540, 12538, 12538, 12540, 12544, 12543, 12544, 12546, 12550, 12547, 12546, 12547, 12550, 12547, 12546, 12548, 12551, 12548, 12548, 12550, 12553, 12552, 12552, 12554, 12558, 12555, 12554, 12555, 12557, 12554, 12554, 12555, 12558, 12556, 12556, 12557, 12561, 12560, 12560, 12562, 12566, 12563, 12562, 12563, 12565, 12563, 12562, 12563, 12566, 12564, 12564, 12566, 12569, 12568, 12568, 12570, 12574, 12571, 12570, 12571, 12573, 12570, 12569, 12571, 12574, 12572, 12571, 12573, 12577, 12576, 12576, 12578, 12582, 12580, 12579, 12580, 12582, 12580, 12579, 12581, 12584, 12582, 12582, 12584, 12588, 12587, 12588, 12590, 12594, 12591, 12590, 12591, 12594, 12591, 12590, 12592, 12595, 12593, 12592, 12594, 12597, 12596, 12596, 12598, 12602, 12599, 12598, 12599, 12601, 12598, 12597, 12598, 12602, 12599, 12599, 12601, 12605, 12603, 12604, 12606, 12610, 12608, 12607, 12608, 12610, 12608, 12607, 12609, 12612, 12610, 12610, 12612, 12616, 12615, 12616, 12618, 12622, 12619, 12618, 12619, 12621, 12619, 12618, 12619, 12622, 12620, 12620, 12622, 12625, 12624, 12624, 12626, 12630, 12627, 12626, 12627, 12629, 12627, 12626, 12627, 12630, 12628, 12628, 12630, 12633, 12632, 12632, 12634, 12638, 12635, 12634, 12635, 12637, 12634, 12633, 12634, 12637, 12635, 12635, 12637, 12641, 12639, 12640, 12642, 12646, 12644, 12643, 12644, 12646, 12644, 12644, 12645, 12649, 12647, 12647, 12649, 12653, 12652, 12652, 12654, 12658, 12655, 12654, 12654, 12656, 12653, 12652, 12653, 12656, 12654, 12653, 12655, 12658, 12656, 12656, 12658, 12662, 12659, 12658, 12659, 12661, 12659, 12658, 12660, 12663, 12662, 12662, 12664, 12668, 12667, 12668, 12670, 12674, 12672, 12671, 12671, 12674, 12671, 12670, 12672, 12675, 12673, 12672, 12674, 12678, 12676, 12676, 12678, 12682, 12679, 12678, 12679, 12681, 12678, 12677, 12678, 12681, 12679, 12679, 12681, 12685, 12683, 12684, 12686, 12690, 12687, 12687, 12687, 12690, 12688, 12687, 12689, 12692, 12690, 12690, 12692, 12696, 12695, 12696, 12698, 12702, 12699, 12698, 12699, 12701, 12699, 12698, 12699, 12702, 12700, 12700, 12702, 12705, 12704, 12704, 12706, 12710, 12707, 12706, 12707, 12709, 12706, 12705, 12707, 12710, 12708, 12707, 12709, 12713, 12712, 12712, 12714, 12718, 12715, 12714, 12715, 12717, 12714, 12714, 12715, 12718, 12716, 12716, 12717, 12721, 12720, 12720, 12722, 12726, 12723, 12722, 12723, 12725, 12723, 12722, 12723, 12726, 12724, 12724, 12726, 12729, 12728, 12728, 12730, 12734, 12731, 12730, 12731, 12733, 12730, 12729, 12731, 12734, 12732, 12731, 12733, 12737, 12735, 12736, 12738, 12742, 12739, 12738, 12739, 12742, 12739, 12739, 12740, 12744, 12742, 12742, 12744, 12748, 12747, 12748, 12750, 12754, 12751, 12751, 12751, 12754, 12751, 12750, 12752, 12755, 12753, 12752, 12754, 12758, 12756, 12757, 12758, 12762, 12759, 12757, 12758, 12760, 12757, 12756, 12757, 12759, 12757, 12756, 12758, 12761, 12760, 12760, 12762, 12766, 12763, 12762, 12763, 12766, 12763, 12763, 12764, 12768, 12766, 12766, 12768, 12772, 12771, 12772, 12774, 12778, 12775, 12774, 12775, 12778, 12775, 12774, 12776, 12779, 12777, 12776, 12778, 12782, 12780, 12780, 12782, 12786, 12783, 12782, 12782, 12785, 12782, 12781, 12782, 12785, 12783, 12783, 12785, 12788, 12787, 12788, 12790, 12794, 12791, 12791, 12792, 12794, 12792, 12791, 12793, 12796, 12795, 12795, 12797, 12801, 12799, 12800, 12802, 12806, 12803, 12802, 12803, 12805, 12802, 12801, 12802, 12805, 12802, 12801, 12803, 12806, 12805, 12805, 12807, 12810, 12807, 12806, 12806, 12808, 12806, 12805, 12806, 12809, 12807, 12807, 12809, 12812, 12811, 12812, 12814, 12818, 12815, 12815, 12816, 12818, 12816, 12815, 12817, 12820, 12818, 12818, 12820, 12824, 12823, 12824, 12826, 12830, 12827, 12826, 12827, 12829, 12827, 12826, 12827, 12830, 12828, 12828, 12830, 12833, 12832, 12832, 12834, 12838, 12835, 12834, 12835, 12837, 12834, 12833, 12835, 12838, 12836, 12835, 12837, 12841, 12840, 12840, 12842, 12846, 12843, 12842, 12843, 12845, 12842, 12841, 12843, 12846, 12844, 12843, 12845, 12849, 12848, 12848, 12850, 12854, 12851, 12850, 12851, 12853, 12850, 12850, 12851, 12854, 12852, 12852, 12853, 12857, 12856, 12856, 12858, 12862, 12859, 12858, 12858, 12861, 12858, 12857, 12858, 12861, 12859, 12859, 12861, 12864, 12863, 12864, 12866, 12870, 12867, 12867, 12868, 12870, 12868, 12867, 12869, 12873, 12871, 12871, 12873, 12877, 12876, 12876, 12878, 12882, 12879, 12878, 12878, 12880, 12877, 12876, 12877, 12880, 12878, 12877, 12878, 12882, 12880, 12880, 12882, 12886, 12883, 12882, 12883, 12885, 12883, 12882, 12884, 12887, 12885, 12885, 12888, 12892, 12891, 12891, 12894, 12898, 12895, 12895, 12895, 12898, 12895, 12895, 12896, 12899, 12897, 12897, 12898, 12902, 12900, 12901, 12902, 12906, 12903, 12901, 12902, 12904, 12901, 12899, 12901, 12903, 12901, 12900, 12902, 12905, 12904, 12904, 12906, 12910, 12907, 12906, 12907, 12910, 12907, 12906, 12908, 12912, 12910, 12910, 12912, 12916, 12915, 12915, 12918, 12922, 12919, 12918, 12919, 12921, 12919, 12918, 12919, 12923, 12920, 12920, 12922, 12925, 12924, 12924, 12926, 12930, 12927, 12926, 12927, 12929, 12926, 12925, 12927, 12930, 12928, 12927, 12929, 12933, 12932, 12932, 12934, 12938, 12935, 12934, 12935, 12937, 12934, 12933, 12935, 12938, 12936, 12935, 12937, 12941, 12940, 12940, 12942, 12946, 12943, 12942, 12943, 12945, 12942, 12942, 12943, 12946, 12944, 12944, 12945, 12949, 12948, 12948, 12950, 12954, 12951, 12950, 12950, 12953, 12950, 12949, 12950, 12953, 12951, 12951, 12953, 12956, 12955, 12956, 12958, 12962, 12959, 12958, 12960, 12962, 12960, 12959, 12961, 12964, 12962, 12962, 12965, 12968, 12967, 12968, 12970, 12974, 12971, 12970, 12970, 12973, 12970, 12969, 12970, 12973, 12970, 12969, 12971, 12974, 12973, 12973, 12974, 12978, 12975, 12973, 12974, 12976, 12973, 12972, 12974, 12977, 12975, 12974, 12976, 12980, 12979, 12979, 12982, 12986, 12983, 12983, 12984, 12986, 12984, 12983, 12985, 12989, 12987, 12987, 12989, 12993, 12992, 12992, 12994, 12998, 12995, 12994, 12994, 12996, 12993, 12992, 12993, 12996, 12993, 12993, 12994, 12998, 12996, 12996, 12998, 13002, 12999, 12998, 12999, 13001, 12999, 12998, 13000, 13003, 13001, 13001, 13004, 13008, 13007, 13007, 13010, 13014, 13011, 13010, 13011, 13013, 13011, 13010, 13011, 13014, 13012, 13012, 13014, 13017, 13016, 13016, 13018, 13022, 13019, 13018, 13019, 13021, 13018, 13017, 13019, 13022, 13020, 13019, 13021, 13025, 13024, 13024, 13026, 13030, 13027, 13026, 13027, 13029, 13026, 13025, 13027, 13030, 13028, 13027, 13029, 13033, 13032, 13032, 13034, 13038, 13035, 13034, 13035, 13037, 13034, 13033, 13035, 13038, 13036, 13035, 13037, 13041, 13040, 13040, 13042, 13046, 13043, 13042, 13043, 13045, 13042, 13041, 13043, 13046, 13044, 13043, 13045, 13049, 13048, 13048, 13050, 13054, 13051, 13050, 13051, 13053, 13050, 13049, 13051, 13054, 13052, 13051, 13053, 13057, 13056, 13056, 13058, 13062, 13059, 13058, 13059, 13061, 13058, 13057, 13059, 13062, 13060, 13059, 13061, 13065, 13064, 13064, 13066, 13070, 13067, 13066, 13067, 13069, 13066, 13065, 13067, 13070, 13068, 13067, 13069, 13073, 13072, 13072, 13074, 13078, 13075, 13074, 13075, 13077, 13074, 13073, 13075, 13078, 13076, 13075, 13077, 13081, 13080, 13080, 13082, 13086, 13083, 13082, 13083, 13085, 13082, 13081, 13083, 13086, 13084, 13083, 13085, 13089, 13088, 13088, 13090, 13094, 13091, 13090, 13090, 13093, 13090, 13089, 13090, 13093, 13091, 13091, 13093, 13096, 13095, 13096, 13098, 13102, 13099, 13098, 13099, 13102, 13100, 13099, 13101, 13104, 13102, 13102, 13104, 13108, 13107, 13108, 13110, 13114, 13111, 13110, 13110, 13112, 13110, 13108, 13110, 13112, 13110, 13109, 13111, 13114, 13113, 13112, 13114, 13118, 13115, 13113, 13114, 13116, 13113, 13112, 13114, 13117, 13115, 13114, 13116, 13120, 13119, 13119, 13122, 13126, 13123, 13122, 13123, 13126, 13123, 13123, 13124, 13128, 13126, 13126, 13128, 13132, 13131, 13131, 13134, 13138, 13135, 13134, 13135, 13138, 13135, 13134, 13136, 13139, 13137, 13136, 13138, 13142, 13140, 13140, 13142, 13146, 13143, 13141, 13142, 13144, 13141, 13139, 13140, 13143, 13141, 13140, 13142, 13145, 13144, 13144, 13146, 13150, 13147, 13146, 13147, 13149, 13147, 13146, 13148, 13151, 13149, 13149, 13152, 13156, 13155, 13155, 13158, 13162, 13159, 13158, 13159, 13162, 13159, 13158, 13160, 13163, 13161, 13160, 13162, 13166, 13164, 13164, 13166, 13170, 13167, 13165, 13166, 13168, 13165, 13163, 13164, 13167, 13165, 13164, 13166, 13169, 13168, 13168, 13170, 13174, 13171, 13170, 13171, 13173, 13171, 13170, 13172, 13175, 13174, 13173, 13176, 13180, 13179, 13179, 13182, 13186, 13183, 13182, 13183, 13185, 13183, 13182, 13183, 13186, 13184, 13184, 13186, 13189, 13188, 13188, 13190, 13194, 13191, 13190, 13190, 13193, 13190, 13189, 13190, 13194, 13191, 13191, 13193, 13197, 13195, 13196, 13198, 13202, 13199, 13198, 13199, 13201, 13198, 13197, 13199, 13202, 13200, 13199, 13201, 13205, 13204, 13204, 13206, 13210, 13207, 13206, 13207, 13209, 13206, 13205, 13207, 13210, 13208, 13207, 13209, 13213, 13212, 13212, 13214, 13218, 13215, 13214, 13215, 13217, 13214, 13213, 13215, 13218, 13216, 13215, 13217, 13221, 13220, 13220, 13222, 13226, 13223, 13222, 13223, 13225, 13222, 13221, 13223, 13226, 13224, 13223, 13225, 13229, 13228, 13228, 13230, 13234, 13231, 13230, 13231, 13233, 13230, 13229, 13231, 13234, 13232, 13231, 13233, 13237, 13236, 13236, 13238, 13242, 13239, 13238, 13239, 13241, 13238, 13237, 13239, 13242, 13240, 13239, 13241, 13245, 13244, 13244, 13246, 13250, 13247, 13246, 13247, 13249, 13246, 13245, 13247, 13250, 13248, 13247, 13249, 13253, 13252, 13252, 13254, 13258, 13255, 13254, 13255, 13257, 13254, 13253, 13255, 13258, 13256, 13255, 13257, 13261, 13260, 13260, 13262, 13266, 13263, 13262, 13263, 13265, 13262, 13261, 13263, 13266, 13264, 13263, 13265, 13269, 13268, 13268, 13270, 13274, 13271, 13270, 13271, 13273, 13270, 13269, 13271, 13274, 13272, 13271, 13273, 13277, 13276, 13276, 13278, 13282, 13279, 13278, 13279, 13281, 13278, 13277, 13279, 13282, 13280, 13279, 13281, 13285, 13284, 13284, 13286, 13290, 13287, 13286, 13287, 13289, 13286, 13285, 13287, 13290, 13288, 13287, 13289, 13293, 13292, 13292, 13294, 13298, 13295, 13294, 13295, 13297, 13294, 13293, 13295, 13298, 13296, 13295, 13297, 13301, 13300, 13300, 13302, 13306, 13303, 13302, 13303, 13305, 13302, 13301, 13303, 13306, 13304, 13303, 13305, 13309, 13308, 13308, 13310, 13314, 13311, 13310, 13310, 13313, 13310, 13309, 13311, 13314, 13312, 13311, 13313, 13317, 13315, 13316, 13318, 13322, 13319, 13318, 13318, 13321, 13318, 13317, 13319, 13322, 13320, 13319, 13321, 13325, 13323, 13324, 13326, 13330, 13327, 13326, 13326, 13329, 13326, 13325, 13327, 13330, 13328, 13327, 13329, 13333, 13331, 13332, 13334, 13338, 13335, 13334, 13334, 13337, 13334, 13333, 13335, 13338, 13336, 13335, 13337, 13341, 13339, 13340, 13342, 13346, 13343, 13342, 13342, 13345, 13342, 13341, 13343, 13346, 13344, 13343, 13345, 13349, 13347, 13348, 13350, 13354, 13351, 13350, 13350, 13353, 13350, 13349, 13351, 13354, 13352, 13351, 13353, 13357, 13355, 13356, 13358, 13362, 13359, 13358, 13358, 13361, 13358, 13357, 13359, 13362, 13360, 13359, 13361, 13365, 13363, 13364, 13366, 13370, 13367, 13366, 13366, 13369, 13366, 13365, 13367, 13370, 13368, 13367, 13369, 13373, 13371, 13372, 13374, 13378, 13375, 13374, 13374, 13377, 13374, 13373, 13375, 13378, 13376, 13375, 13377, 13381, 13379, 13380, 13382, 13386, 13383, 13382, 13382, 13385, 13382, 13381, 13382, 13386, 13383, 13383, 13385, 13389, 13387, 13388, 13390, 13394, 13391, 13390, 13390, 13393, 13390, 13389, 13390, 13394, 13391, 13391, 13393, 13397, 13395, 13396, 13398, 13402, 13399, 13398, 13398, 13401, 13398, 13397, 13398, 13402, 13399, 13399, 13401, 13405, 13403, 13404, 13406, 13410, 13407, 13406, 13406, 13409, 13406, 13405, 13407, 13410, 13408, 13407, 13409, 13413, 13411, 13412, 13414, 13417, 13415, 13414, 13414, 13417, 13414, 13413, 13414, 13418, 13415, 13415, 13417, 13421, 13419, 13420, 13422, 13425, 13423, 13422, 13423, 13425, 13422, 13422, 13423, 13426, 13424, 13424, 13426, 13429, 13428, 13428, 13430, 13433, 13431, 13429, 13430, 13432, 13429, 13427, 13428, 13431, 13429, 13428, 13430, 13433, 13432, 13432, 13434, 13437, 13435, 13434, 13435, 13437, 13435, 13434, 13436, 13439, 13437, 13437, 13439, 13443, 13442, 13443, 13446, 13449, 13447, 13446, 13447, 13450, 13447, 13446, 13448, 13451, 13449, 13448, 13450, 13454, 13452, 13452, 13454, 13457, 13455, 13453, 13453, 13455, 13452, 13451, 13452, 13455, 13453, 13452, 13454, 13457, 13456, 13456, 13458, 13461, 13459, 13458, 13459, 13461, 13459, 13458, 13460, 13463, 13461, 13461, 13463, 13467, 13466, 13467, 13470, 13473, 13471, 13470, 13471, 13474, 13471, 13470, 13472, 13475, 13473, 13472, 13474, 13478, 13476, 13476, 13478, 13481, 13479, 13477, 13477, 13479, 13476, 13475, 13476, 13479, 13476, 13476, 13477, 13481, 13480, 13480, 13482, 13485, 13483, 13482, 13483, 13486, 13483, 13482, 13484, 13488, 13486, 13486, 13488, 13492, 13491, 13491, 13494, 13497, 13495, 13494, 13494, 13496, 13493, 13492, 13493, 13496, 13494, 13493, 13495, 13498, 13496, 13496, 13498, 13501, 13499, 13497, 13498, 13500, 13497, 13496, 13497, 13500, 13498, 13498, 13500, 13504, 13503, 13503, 13506, 13509, 13507, 13506, 13507, 13510, 13508, 13507, 13509, 13512, 13510, 13510, 13512, 13516, 13515, 13516, 13518, 13521, 13519, 13518, 13518, 13520, 13517, 13516, 13517, 13520, 13518, 13517, 13518, 13522, 13520, 13520, 13522, 13525, 13523, 13521, 13522, 13524, 13521, 13520, 13522, 13525, 13523, 13522, 13524, 13528, 13527, 13528, 13530, 13533, 13531, 13530, 13530, 13533, 13530, 13529, 13531, 13534, 13532, 13531, 13533, 13537, 13535, 13536, 13538, 13541, 13539, 13538, 13538, 13541, 13538, 13537, 13538, 13542, 13539, 13539, 13541, 13545, 13543, 13544, 13546, 13549, 13547, 13546, 13546, 13549, 13546, 13545, 13546, 13550, 13547, 13547, 13549, 13553, 13551, 13552, 13554, 13557, 13555, 13554, 13554, 13557, 13554, 13553, 13554, 13558, 13555, 13555, 13557, 13561, 13559, 13560, 13562, 13565, 13563, 13562, 13562, 13565, 13562, 13561, 13562, 13566, 13563, 13563, 13565, 13569, 13567, 13568, 13570, 13573, 13571, 13570, 13570, 13573, 13570, 13569, 13570, 13574, 13571, 13571, 13573, 13577, 13575, 13576, 13578, 13581, 13579, 13578, 13578, 13581, 13578, 13577, 13578, 13582, 13579, 13579, 13581, 13585, 13583, 13584, 13586, 13589, 13587, 13586, 13586, 13589, 13586, 13585, 13586, 13590, 13587, 13587, 13589, 13593, 13591, 13592, 13594, 13597, 13595, 13594, 13594, 13597, 13594, 13593, 13594, 13598, 13595, 13595, 13597, 13601, 13599, 13600, 13602, 13605, 13603, 13602, 13602, 13605, 13602, 13601, 13602, 13606, 13603, 13603, 13605, 13609, 13607, 13608, 13610, 13613, 13611, 13610, 13610, 13613, 13610, 13609, 13610, 13613, 13611, 13611, 13613, 13617, 13615, 13616, 13618, 13621, 13619, 13618, 13619, 13621, 13618, 13617, 13619, 13622, 13620, 13619, 13621, 13625, 13624, 13624, 13626, 13629, 13627, 13625, 13626, 13628, 13624, 13623, 13624, 13627, 13625, 13624, 13626, 13629, 13628, 13628, 13630, 13633, 13631, 13630, 13631, 13633, 13630, 13630, 13631, 13635, 13633, 13633, 13635, 13639, 13638, 13639, 13642, 13645, 13643, 13642, 13643, 13646, 13643, 13642, 13643, 13647, 13644, 13644, 13646, 13650, 13648, 13648, 13650, 13653, 13651, 13649, 13649, 13651, 13648, 13647, 13648, 13651, 13648, 13648, 13649, 13653, 13652, 13652, 13654, 13657, 13655, 13654, 13655, 13657, 13655, 13654, 13655, 13659, 13657, 13657, 13659, 13663, 13662, 13663, 13666, 13669, 13667, 13666, 13667, 13669, 13667, 13666, 13667, 13671, 13668, 13668, 13670, 13673, 13672, 13672, 13674, 13677, 13675, 13673, 13674, 13676, 13673, 13671, 13673, 13676, 13673, 13672, 13674, 13678, 13676, 13676, 13678, 13681, 13679, 13677, 13678, 13680, 13677, 13676, 13677, 13681, 13678, 13678, 13680, 13684, 13683, 13683, 13686, 13689, 13687, 13686, 13687, 13690, 13687, 13687, 13689, 13692, 13690, 13690, 13692, 13696, 13695, 13695, 13698, 13701, 13699, 13697, 13698, 13700, 13697, 13696, 13697, 13700, 13698, 13697, 13698, 13702, 13700, 13700, 13702, 13705, 13703, 13701, 13702, 13704, 13701, 13700, 13701, 13704, 13702, 13702, 13704, 13708, 13707, 13707, 13710, 13713, 13711, 13710, 13711, 13714, 13711, 13711, 13713, 13716, 13714, 13714, 13716, 13720, 13719, 13719, 13722, 13725, 13723, 13721, 13722, 13724, 13721, 13720, 13721, 13724, 13721, 13721, 13722, 13726, 13724, 13724, 13726, 13729, 13727, 13725, 13726, 13728, 13725, 13724, 13726, 13729, 13727, 13726, 13728, 13732, 13731, 13731, 13734, 13737, 13735, 13734, 13734, 13737, 13734, 13733, 13734, 13738, 13735, 13735, 13737, 13741, 13739, 13740, 13742, 13745, 13743, 13742, 13742, 13745, 13742, 13741, 13742, 13746, 13743, 13743, 13745, 13749, 13747, 13748, 13750, 13753, 13751, 13750, 13750, 13753, 13750, 13749, 13750, 13754, 13751, 13751, 13753, 13757, 13755, 13756, 13758, 13761, 13759, 13758, 13758, 13761, 13758, 13757, 13758, 13762, 13759, 13759, 13761, 13765, 13763, 13764, 13766, 13769, 13767, 13766, 13766, 13769, 13766, 13765, 13766, 13770, 13767, 13767, 13769, 13773, 13771, 13772, 13774, 13777, 13775, 13774, 13774, 13777, 13774, 13773, 13774, 13778, 13775, 13775, 13777, 13781, 13779, 13780, 13782, 13785, 13783, 13782, 13782, 13785, 13782, 13781, 13782, 13786, 13783, 13783, 13785, 13789, 13787, 13788, 13790, 13793, 13791, 13790, 13790, 13793, 13790, 13789, 13790, 13794, 13791, 13791, 13793, 13797, 13795, 13796, 13798, 13801, 13799, 13798, 13798, 13801, 13798, 13797, 13798, 13802, 13799, 13799, 13801, 13805, 13803, 13804, 13806, 13809, 13807, 13806, 13806, 13809, 13806, 13805, 13806, 13810, 13807, 13807, 13809, 13813, 13811, 13812, 13814, 13817, 13815, 13814, 13814, 13817, 13814, 13813, 13814, 13818, 13815, 13815, 13817, 13821, 13819, 13820, 13822, 13825, 13823, 13822, 13822, 13825, 13822, 13821, 13822, 13826, 13823, 13823, 13825, 13829, 13827, 13828, 13830, 13833, 13831, 13830, 13830, 13833, 13830, 13829, 13830, 13834, 13831, 13831, 13833, 13837, 13835, 13836, 13838, 13841, 13839, 13838, 13838, 13841, 13838, 13837, 13838, 13842, 13839, 13839, 13841, 13845, 13843, 13844, 13846, 13849, 13847, 13846, 13846, 13849, 13846, 13845, 13846, 13850, 13847, 13847, 13849, 13853, 13851, 13852, 13854, 13857, 13855, 13853, 13854, 13857, 13854, 13853, 13854, 13857, 13855, 13855, 13857, 13860, 13859, 13859, 13862, 13865, 13863, 13862, 13862, 13865, 13862, 13861, 13863, 13866, 13864, 13863, 13865, 13869, 13868, 13868, 13870, 13873, 13871, 13869, 13869, 13871, 13868, 13867, 13868, 13871, 13868, 13868, 13869, 13873, 13872, 13872, 13874, 13877, 13875, 13874, 13874, 13877, 13874, 13874, 13875, 13879, 13877, 13877, 13879, 13883, 13882, 13883, 13886, 13889, 13887, 13886, 13887, 13889, 13887, 13886, 13887, 13890, 13888, 13888, 13890, 13893, 13892, 13892, 13894, 13897, 13895, 13893, 13894, 13896, 13893, 13891, 13892, 13895, 13893, 13892, 13894, 13898, 13896, 13896, 13898, 13901, 13899, 13897, 13898, 13900, 13897, 13896, 13897, 13900, 13898, 13898, 13900, 13904, 13903, 13903, 13906, 13909, 13907, 13906, 13907, 13910, 13907, 13907, 13908, 13912, 13910, 13910, 13912, 13916, 13915, 13915, 13918, 13921, 13919, 13917, 13918, 13920, 13917, 13916, 13917, 13920, 13917, 13916, 13918, 13922, 13920, 13920, 13922, 13925, 13923, 13921, 13922, 13924, 13921, 13920, 13922, 13925, 13923, 13922, 13924, 13928, 13927, 13927, 13930, 13933, 13931, 13930, 13930, 13933, 13930, 13929, 13930, 13934, 13931, 13931, 13933, 13937, 13935, 13936, 13938, 13941, 13939, 13937, 13938, 13941, 13938, 13937, 13938, 13941, 13939, 13939, 13941, 13945, 13943, 13943, 13946, 13949, 13947, 13945, 13946, 13949, 13946, 13945, 13946, 13949, 13947, 13947, 13949, 13953, 13951, 13951, 13954, 13957, 13955, 13953, 13954, 13957, 13954, 13953, 13954, 13957, 13955, 13955, 13957, 13961, 13959, 13959, 13962, 13965, 13963, 13961, 13962, 13965, 13962, 13961, 13962, 13965, 13963, 13963, 13965, 13969, 13967, 13967, 13970, 13973, 13971, 13969, 13970, 13972, 13970, 13968, 13970, 13973, 13971, 13970, 13973, 13976, 13975, 13975, 13978, 13981, 13979, 13978, 13978, 13981, 13978, 13977, 13979, 13982, 13980, 13979, 13981, 13985, 13984, 13984, 13986, 13989, 13987, 13985, 13985, 13987, 13984, 13983, 13984, 13987, 13984, 13984, 13985, 13989, 13987, 13988, 13990, 13993, 13991, 13990, 13990, 13993, 13990, 13990, 13991, 13995, 13993, 13993, 13995, 13999, 13998, 13999, 14001, 14005, 14003, 14002, 14003, 14005, 14002, 14002, 14003, 14006, 14004, 14004, 14005, 14009, 14008, 14008, 14010, 14013, 14011, 14009, 14009, 14012, 14008, 14007, 14008, 14011, 14009, 14008, 14010, 14013, 14012, 14012, 14014, 14017, 14015, 14013, 14014, 14016, 14013, 14012, 14013, 14016, 14014, 14014, 14016, 14020, 14019, 14019, 14021, 14025, 14023, 14022, 14023, 14026, 14023, 14023, 14024, 14028, 14026, 14026, 14028, 14032, 14031, 14031, 14034, 14037, 14035, 14033, 14034, 14036, 14033, 14032, 14033, 14036, 14033, 14032, 14034, 14038, 14036, 14036, 14038, 14041, 14039, 14037, 14038, 14040, 14037, 14036, 14037, 14041, 14039, 14038, 14040, 14044, 14043, 14043, 14046, 14049, 14047, 14045, 14046, 14049, 14046, 14045, 14046, 14050, 14047, 14047, 14049, 14053, 14051, 14051, 14054, 14057, 14055, 14053, 14054, 14057, 14054, 14053, 14054, 14057, 14055, 14055, 14057, 14061, 14059, 14059, 14062, 14065, 14063, 14061, 14062, 14065, 14062, 14061, 14062, 14065, 14063, 14063, 14065, 14069, 14067, 14067, 14070, 14073, 14071, 14069, 14070, 14073, 14070, 14069, 14070, 14073, 14071, 14071, 14073, 14077, 14075, 14075, 14078, 14081, 14079, 14077, 14078, 14080, 14077, 14076, 14078, 14081, 14079, 14078, 14080, 14084, 14083, 14083, 14086, 14089, 14087, 14085, 14086, 14089, 14086, 14085, 14086, 14090, 14087, 14087, 14089, 14093, 14091, 14092, 14094, 14097, 14095, 14093, 14094, 14096, 14093, 14091, 14092, 14096, 14093, 14092, 14094, 14098, 14096, 14096, 14098, 14101, 14098, 14097, 14097, 14100, 14097, 14096, 14097, 14100, 14098, 14098, 14100, 14104, 14102, 14103, 14105, 14109, 14107, 14106, 14107, 14110, 14107, 14106, 14108, 14112, 14110, 14110, 14112, 14116, 14115, 14115, 14118, 14121, 14119, 14117, 14118, 14120, 14117, 14116, 14117, 14120, 14117, 14116, 14118, 14122, 14120, 14120, 14122, 14125, 14123, 14121, 14122, 14124, 14121, 14120, 14121, 14125, 14122, 14122, 14124, 14128, 14127, 14127, 14130, 14133, 14131, 14129, 14130, 14133, 14130, 14129, 14130, 14133, 14131, 14131, 14133, 14137, 14135, 14135, 14138, 14141, 14139, 14137, 14138, 14141, 14138, 14137, 14138, 14142, 14139, 14139, 14141, 14145, 14143, 14144, 14146, 14149, 14147, 14145, 14145, 14148, 14144, 14143, 14144, 14148, 14145, 14144, 14146, 14150, 14148, 14148, 14150, 14153, 14150, 14149, 14149, 14152, 14149, 14148, 14149, 14152, 14150, 14150, 14152, 14156, 14154, 14155, 14157, 14161, 14159, 14158, 14159, 14162, 14159, 14158, 14160, 14164, 14162, 14162, 14164, 14168, 14167, 14167, 14170, 14173, 14171, 14169, 14170, 14172, 14169, 14167, 14169, 14172, 14169, 14168, 14170, 14174, 14172, 14172, 14174, 14177, 14174, 14173, 14174, 14176, 14173, 14172, 14173, 14177, 14174, 14174, 14176, 14180, 14179, 14179, 14182, 14185, 14183, 14181, 14182, 14185, 14182, 14181, 14182, 14185, 14183, 14183, 14185, 14188, 14187, 14187, 14190, 14193, 14191, 14189, 14190, 14193, 14190, 14189, 14190, 14194, 14191, 14191, 14193, 14197, 14195, 14196, 14198, 14201, 14198, 14197, 14197, 14200, 14196, 14195, 14196, 14199, 14197, 14196, 14198, 14201, 14200, 14200, 14202, 14205, 14203, 14201, 14202, 14204, 14201, 14200, 14201, 14205, 14203, 14202, 14204, 14208, 14207, 14207, 14210, 14213, 14211, 14209, 14210, 14213, 14210, 14209, 14210, 14213, 14211, 14211, 14213, 14217, 14215, 14215, 14218, 14221, 14219, 14217, 14218, 14220, 14217, 14216, 14218, 14221, 14219, 14218, 14220, 14224, 14223, 14223, 14226, 14229, 14227, 14225, 14226, 14228, 14225, 14224, 14226, 14229, 14227, 14226, 14228, 14232, 14231, 14231, 14234, 14237, 14235, 14233, 14234, 14237, 14234, 14233, 14234, 14238, 14235, 14235, 14237, 14241, 14239, 14240, 14242, 14245, 14242, 14241, 14241, 14244, 14240, 14239, 14240, 14243, 14241, 14240, 14242, 14245, 14244, 14244, 14246, 14249, 14246, 14245, 14246, 14248, 14245, 14244, 14245, 14249, 14247, 14246, 14248, 14252, 14251, 14251, 14254, 14257, 14255, 14253, 14254, 14256, 14253, 14252, 14254, 14257, 14255, 14254, 14256, 14260, 14259, 14259, 14262, 14265, 14263, 14261, 14262, 14265, 14262, 14261, 14262, 14266, 14263, 14263, 14265, 14269, 14267, 14268, 14270, 14273, 14270, 14269, 14269, 14272, 14268, 14267, 14268, 14271, 14269, 14268, 14270, 14273, 14272, 14272, 14274, 14277, 14274, 14273, 14274, 14276, 14273, 14272, 14273, 14277, 14274, 14274, 14276, 14280, 14279, 14279, 14282, 14285, 14283, 14281, 14282, 14285, 14282, 14281, 14282, 14285, 14283, 14283, 14285, 14289, 14287, 14287, 14290, 14293, 14291, 14289, 14290, 14292, 14289, 14288, 14290, 14293, 14291, 14290, 14292, 14296, 14295, 14295, 14298, 14301, 14299, 14297, 14298, 14300, 14297, 14296, 14298, 14301, 14299, 14298, 14300, 14304, 14303, 14303, 14306, 14309, 14307, 14305, 14306, 14309, 14306, 14305, 14306, 14310, 14307, 14307, 14309, 14313, 14311, 14312, 14314, 14317, 14314, 14313, 14313, 14316, 14312, 14311, 14312, 14315, 14313, 14312, 14314, 14317, 14316, 14316, 14318, 14321, 14318, 14317, 14318, 14320, 14317, 14316, 14317, 14321, 14318, 14318, 14320, 14324, 14323, 14323, 14326, 14329, 14327, 14325, 14326, 14328, 14325, 14324, 14326, 14329, 14327, 14326, 14328, 14332, 14331, 14331, 14334, 14337, 14335, 14333, 14334, 14337, 14334, 14333, 14334, 14338, 14335, 14335, 14337, 14341, 14339, 14339, 14342, 14345, 14342, 14341, 14341, 14344, 14340, 14339, 14340, 14343, 14341, 14340, 14342, 14345, 14344, 14344, 14346, 14349, 14346, 14345, 14346, 14348, 14345, 14344, 14345, 14349, 14346, 14346, 14348, 14352, 14351, 14351, 14354, 14357, 14355, 14353, 14354, 14357, 14354, 14353, 14354, 14357, 14355, 14354, 14357, 14361, 14359, 14359, 14362, 14365, 14363, 14361, 14362, 14364, 14361, 14360, 14362, 14365, 14363, 14362, 14364, 14368, 14367, 14367, 14370, 14373, 14371, 14369, 14370, 14373, 14370, 14369, 14370, 14374, 14371, 14371, 14373, 14377, 14375, 14375, 14378, 14381, 14378, 14377, 14377, 14380, 14376, 14375, 14376, 14379, 14377, 14376, 14378, 14381, 14380, 14380, 14382, 14385, 14382, 14381, 14382, 14384, 14381, 14380, 14381, 14385, 14382, 14382, 14384, 14388, 14387, 14387, 14390, 14393, 14391, 14389, 14390, 14392, 14389, 14388, 14390, 14393, 14391, 14390, 14392, 14396, 14395, 14395, 14398, 14401, 14399, 14397, 14398, 14401, 14398, 14397, 14398, 14402, 14399, 14399, 14401, 14405, 14403, 14403, 14406, 14409, 14406, 14405, 14405, 14407, 14404, 14403, 14404, 14407, 14405, 14404, 14406, 14409, 14408, 14408, 14410, 14413, 14410, 14409, 14410, 14412, 14409, 14408, 14409, 14413, 14410, 14410, 14412, 14416, 14415, 14415, 14418, 14421, 14419, 14417, 14418, 14420, 14417, 14416, 14418, 14421, 14419, 14418, 14420, 14424, 14423, 14423, 14426, 14429, 14427, 14425, 14426, 14429, 14426, 14425, 14426, 14430, 14427, 14427, 14429, 14433, 14431, 14431, 14434, 14437, 14434, 14433, 14433, 14436, 14432, 14431, 14432, 14435, 14433, 14432, 14434, 14437, 14436, 14436, 14438, 14441, 14438, 14437, 14438, 14440, 14437, 14436, 14437, 14441, 14438, 14438, 14440, 14444, 14443, 14443, 14445, 14449, 14447, 14445, 14446, 14449, 14446, 14445, 14446, 14450, 14447, 14447, 14449, 14453, 14451, 14451, 14454, 14457, 14454, 14453, 14453, 14455, 14452, 14451, 14452, 14455, 14452, 14452, 14453, 14457, 14456, 14456, 14458, 14461, 14458, 14457, 14458, 14460, 14457, 14456, 14457, 14461, 14458, 14458, 14460, 14464, 14463, 14463, 14466, 14469, 14467, 14465, 14466, 14468, 14465, 14464, 14466, 14469, 14467, 14466, 14468, 14472, 14471, 14471, 14474, 14477, 14475, 14473, 14474, 14477, 14474, 14473, 14474, 14478, 14475, 14475, 14477, 14481, 14479, 14479, 14482, 14485, 14482, 14481, 14481, 14483, 14480, 14478, 14480, 14483, 14480, 14479, 14481, 14485, 14483, 14483, 14486, 14489, 14487, 14485, 14486, 14489, 14486, 14485, 14487, 14491, 14489, 14489, 14491, 14495, 14494, 14495, 14497, 14501, 14499, 14497, 14498, 14500, 14497, 14496, 14497, 14500, 14498, 14497, 14498, 14502, 14500, 14500, 14502, 14505, 14502, 14500, 14501, 14503, 14499, 14498, 14499, 14502, 14499, 14499, 14500, 14504, 14503, 14503, 14505, 14509, 14507, 14506, 14506, 14509, 14507, 14506, 14508, 14511, 14509, 14509, 14511, 14516, 14514, 14515, 14517, 14521, 14519, 14517, 14518, 14520, 14517, 14515, 14517, 14520, 14517, 14516, 14518, 14522, 14520, 14520, 14522, 14525, 14522, 14521, 14521, 14524, 14521, 14520, 14521, 14525, 14522, 14522, 14524, 14528, 14527, 14527, 14529, 14533, 14531, 14529, 14530, 14532, 14529, 14528, 14530, 14533, 14531, 14530, 14532, 14536, 14535, 14535, 14537, 14541, 14539, 14537, 14538, 14541, 14538, 14537, 14538, 14542, 14539, 14539, 14541, 14545, 14543, 14543, 14546, 14549, 14546, 14545, 14545, 14547, 14544, 14543, 14544, 14547, 14544, 14544, 14545, 14549, 14548, 14548, 14550, 14553, 14550, 14549, 14549, 14552, 14549, 14548, 14549, 14553, 14550, 14550, 14552, 14556, 14555, 14555, 14557, 14561, 14559, 14557, 14558, 14561, 14558, 14557, 14558, 14562, 14559, 14559, 14561, 14565, 14563, 14563, 14566, 14569, 14566, 14565, 14565, 14567, 14564, 14563, 14564, 14567, 14564, 14564, 14565, 14569, 14567, 14567, 14570, 14573, 14570, 14569, 14570, 14572, 14569, 14568, 14569, 14573, 14570, 14570, 14572, 14576, 14575, 14575, 14577, 14581, 14579, 14577, 14578, 14580, 14577, 14576, 14578, 14581, 14579, 14578, 14580, 14584, 14583, 14583, 14585, 14589, 14587, 14585, 14586, 14589, 14586, 14585, 14586, 14590, 14587, 14587, 14589, 14593, 14591, 14591, 14594, 14597, 14594, 14593, 14593, 14595, 14592, 14591, 14592, 14595, 14592, 14592, 14593, 14597, 14595, 14596, 14598, 14601, 14598, 14597, 14597, 14600, 14597, 14596, 14597, 14601, 14598, 14598, 14600, 14604, 14603, 14603, 14605, 14609, 14607, 14605, 14606, 14609, 14606, 14605, 14606, 14610, 14607, 14607, 14609, 14613, 14611, 14611, 14614, 14617, 14614, 14613, 14613, 14615, 14612, 14611, 14612, 14615, 14612, 14612, 14613, 14617, 14615, 14615, 14618, 14621, 14618, 14617, 14617, 14620, 14617, 14616, 14617, 14621, 14618, 14618, 14620, 14624, 14623, 14623, 14625, 14629, 14627, 14625, 14626, 14628, 14625, 14624, 14626, 14629, 14627, 14626, 14628, 14632, 14631, 14631, 14633, 14637, 14635, 14633, 14634, 14637, 14634, 14633, 14634, 14638, 14635, 14635, 14637, 14641, 14639, 14639, 14642, 14645, 14642, 14641, 14641, 14643, 14640, 14639, 14640, 14643, 14640, 14640, 14641, 14645, 14643, 14643, 14646, 14649, 14646, 14645, 14645, 14648, 14645, 14644, 14645, 14649, 14646, 14646, 14648, 14652, 14651, 14651, 14653, 14657, 14655, 14653, 14654, 14657, 14654, 14653, 14654, 14658, 14655, 14655, 14657, 14661, 14659, 14659, 14662, 14665, 14662, 14661, 14661, 14663, 14660, 14659, 14660, 14663, 14660, 14660, 14661, 14665, 14663, 14663, 14666, 14669, 14666, 14665, 14665, 14668, 14665, 14664, 14665, 14669, 14666, 14666, 14668, 14672, 14671, 14671, 14673, 14677, 14674, 14673, 14674, 14676, 14673, 14672, 14674, 14677, 14675, 14674, 14676, 14680, 14679, 14679, 14681, 14685, 14683, 14681, 14682, 14685, 14681, 14680, 14682, 14686, 14683, 14683, 14685, 14689, 14687, 14687, 14690, 14693, 14690, 14689, 14689, 14691, 14688, 14687, 14688, 14691, 14688, 14688, 14689, 14693, 14691, 14691, 14694, 14697, 14694, 14693, 14693, 14696, 14693, 14692, 14693, 14697, 14694, 14694, 14696, 14700, 14698, 14699, 14701, 14705, 14703, 14701, 14702, 14705, 14702, 14701, 14702, 14706, 14703, 14703, 14705, 14709, 14707, 14707, 14710, 14713, 14710, 14709, 14709, 14711, 14708, 14707, 14708, 14711, 14708, 14708, 14709, 14713, 14711, 14711, 14714, 14717, 14714, 14713, 14713, 14716, 14713, 14712, 14713, 14717, 14714, 14714, 14716, 14720, 14718, 14719, 14721, 14725, 14723, 14721, 14722, 14725, 14722, 14721, 14722, 14726, 14723, 14723, 14725, 14729, 14727, 14727, 14730, 14733, 14730, 14729, 14729, 14731, 14728, 14727, 14728, 14731, 14728, 14727, 14729, 14733, 14731, 14731, 14734, 14737, 14734, 14733, 14733, 14736, 14733, 14732, 14733, 14737, 14734, 14734, 14736, 14740, 14739, 14739, 14741, 14745, 14742, 14741, 14742, 14744, 14741, 14740, 14742, 14745, 14743, 14742, 14744, 14748, 14747, 14747, 14749, 14753, 14750, 14749, 14750, 14753, 14749, 14748, 14750, 14753, 14751, 14750, 14753, 14757, 14755, 14755, 14758, 14761, 14758, 14757, 14757, 14759, 14756, 14755, 14756, 14759, 14756, 14756, 14757, 14761, 14759, 14759, 14762, 14765, 14762, 14761, 14761, 14764, 14761, 14759, 14761, 14764, 14762, 14762, 14764, 14768, 14766, 14767, 14769, 14773, 14771, 14769, 14770, 14773, 14770, 14769, 14770, 14774, 14771, 14771, 14773, 14777, 14775, 14775, 14778, 14781, 14778, 14777, 14777, 14779, 14776, 14775, 14776, 14779, 14776, 14775, 14777, 14781, 14779, 14779, 14782, 14785, 14782, 14781, 14781, 14784, 14781, 14779, 14781, 14784, 14782, 14782, 14784, 14788, 14786, 14787, 14789, 14793, 14791, 14789, 14790, 14793, 14790, 14789, 14790, 14794, 14791, 14791, 14793, 14797, 14795, 14795, 14798, 14801, 14798, 14797, 14797, 14799, 14796, 14795, 14796, 14799, 14796, 14795, 14797, 14801, 14799, 14799, 14802, 14805, 14802, 14801, 14801, 14804, 14801, 14800, 14801, 14805, 14802, 14802, 14804, 14808, 14807, 14807, 14809, 14813, 14810, 14809, 14810, 14812, 14809, 14808, 14810, 14813, 14811, 14810, 14812, 14816, 14815, 14815, 14817, 14821, 14818, 14817, 14818, 14820, 14817, 14816, 14818, 14821, 14819, 14818, 14821, 14825, 14823, 14823, 14826, 14829, 14826, 14825, 14825, 14827, 14824, 14823, 14824, 14827, 14824, 14823, 14825, 14829, 14827, 14827, 14830, 14833, 14830, 14829, 14829, 14832, 14829, 14827, 14829, 14832, 14830, 14829, 14832, 14836, 14834, 14835, 14837, 14841, 14838, 14837, 14838, 14841, 14838, 14836, 14838, 14842, 14839, 14839, 14841, 14845, 14843, 14843, 14846, 14849, 14846, 14845, 14845, 14847, 14844, 14843, 14844, 14847, 14844, 14843, 14845, 14849, 14847, 14847, 14850, 14853, 14850, 14849, 14849, 14852, 14849, 14847, 14849, 14852, 14850, 14849, 14852, 14856, 14854, 14855, 14857, 14861, 14858, 14857, 14858, 14861, 14858, 14856, 14858, 14862, 14859, 14859, 14861, 14865, 14863, 14863, 14866, 14869, 14866, 14865, 14865, 14867, 14864, 14863, 14864, 14867, 14864, 14863, 14865, 14869, 14867, 14867, 14870, 14873, 14870, 14869, 14869, 14872, 14869, 14868, 14869, 14873, 14870, 14870, 14872, 14876, 14875, 14875, 14877, 14881, 14878, 14877, 14878, 14880, 14877, 14876, 14878, 14881, 14879, 14878, 14880, 14884, 14883, 14883, 14885, 14889, 14886, 14885, 14886, 14888, 14885, 14884, 14886, 14889, 14887, 14886, 14888, 14892, 14891, 14891, 14893, 14897, 14894, 14893, 14893, 14896, 14892, 14891, 14892, 14896, 14893, 14892, 14894, 14898, 14896, 14896, 14898, 14901, 14898, 14896, 14896, 14899, 14895, 14894, 14895, 14898, 14895, 14894, 14896, 14900, 14899, 14899, 14901, 14905, 14903, 14901, 14902, 14905, 14902, 14901, 14903, 14907, 14905, 14905, 14907, 14912, 14910, 14911, 14913, 14917, 14914, 14913, 14913, 14916, 14912, 14911, 14912, 14915, 14913, 14912, 14913, 14917, 14915, 14915, 14918, 14921, 14918, 14917, 14917, 14920, 14917, 14916, 14917, 14921, 14918, 14918, 14920, 14924, 14923, 14923, 14925, 14929, 14926, 14924, 14925, 14927, 14924, 14922, 14923, 14927, 14924, 14923, 14925, 14929, 14927, 14927, 14929, 14933, 14930, 14929, 14930, 14933, 14930, 14929, 14931, 14935, 14933, 14932, 14935, 14939, 14938, 14939, 14941, 14945, 14942, 14941, 14942, 14944, 14941, 14939, 14941, 14944, 14941, 14940, 14942, 14946, 14944, 14944, 14946, 14949, 14946, 14944, 14945, 14947, 14943, 14942, 14943, 14946, 14944, 14943, 14945, 14949, 14947, 14947, 14949, 14953, 14950, 14949, 14949, 14952, 14949, 14948, 14949, 14953, 14950, 14950, 14952, 14956, 14955, 14955, 14957, 14961, 14958, 14957, 14958, 14960, 14957, 14956, 14957, 14961, 14958, 14958, 14960, 14964, 14963, 14963, 14965, 14969, 14966, 14965, 14966, 14968, 14965, 14964, 14966, 14969, 14967, 14966, 14968, 14973, 14971, 14971, 14973, 14977, 14974, 14972, 14973, 14975, 14972, 14970, 14972, 14975, 14972, 14971, 14973, 14977, 14975, 14975, 14978, 14981, 14978, 14977, 14977, 14980, 14977, 14975, 14977, 14981, 14978, 14978, 14980, 14984, 14982, 14983, 14985, 14989, 14986, 14985, 14986, 14988, 14985, 14984, 14985, 14989, 14986, 14986, 14988, 14992, 14991, 14991, 14993, 14997, 14994, 14993, 14994, 14996, 14993, 14992, 14994, 14997, 14995, 14994, 14996, 15001, 14999, 14999, 15001, 15005, 15002, 15000, 15001, 15003, 15000, 14998, 15000, 15003, 15000, 14999, 15001, 15005, 15003, 15003, 15006, 15009, 15006, 15005, 15005, 15008, 15005, 15003, 15005, 15009, 15006, 15006, 15008, 15012, 15010, 15011, 15013, 15017, 15014, 15013, 15014, 15016, 15013, 15012, 15013, 15017, 15014, 15014, 15016, 15020, 15019, 15019, 15021, 15025, 15022, 15021, 15022, 15024, 15021, 15020, 15022, 15025, 15023, 15022, 15024, 15029, 15027, 15027, 15029, 15033, 15030, 15028, 15029, 15031, 15028, 15026, 15028, 15031, 15028, 15027, 15029, 15033, 15031, 15031, 15033, 15037, 15034, 15033, 15033, 15036, 15033, 15031, 15033, 15037, 15034, 15033, 15036, 15040, 15038, 15039, 15041, 15045, 15042, 15041, 15042, 15044, 15041, 15040, 15041, 15045, 15042, 15042, 15044, 15048, 15047, 15047, 15049, 15053, 15050, 15049, 15050, 15052, 15049, 15048, 15050, 15053, 15051, 15050, 15052, 15057, 15055, 15055, 15057, 15061, 15058, 15056, 15057, 15059, 15056, 15054, 15056, 15059, 15056, 15055, 15057, 15061, 15059, 15059, 15061, 15065, 15062, 15061, 15061, 15064, 15061, 15059, 15061, 15065, 15062, 15061, 15064, 15068, 15066, 15067, 15069, 15073, 15070, 15069, 15070, 15072, 15069, 15068, 15069, 15073, 15070, 15070, 15072, 15076, 15075, 15075, 15077, 15081, 15078, 15077, 15078, 15080, 15077, 15076, 15078, 15081, 15079, 15078, 15080, 15084, 15083, 15083, 15085, 15089, 15086, 15084, 15085, 15087, 15084, 15082, 15084, 15087, 15084, 15083, 15085, 15089, 15087, 15087, 15089, 15093, 15090, 15089, 15089, 15092, 15089, 15087, 15089, 15093, 15090, 15089, 15092, 15096, 15094, 15095, 15097, 15101, 15098, 15097, 15098, 15100, 15097, 15096, 15097, 15101, 15098, 15098, 15100, 15104, 15103, 15103, 15105, 15109, 15106, 15105, 15106, 15108, 15105, 15104, 15106, 15109, 15107, 15106, 15108, 15112, 15111, 15111, 15113, 15117, 15114, 15112, 15113, 15115, 15112, 15110, 15112, 15115, 15112, 15111, 15113, 15117, 15115, 15115, 15117, 15121, 15118, 15117, 15117, 15120, 15116, 15115, 15117, 15120, 15118, 15117, 15120, 15124, 15122, 15123, 15125, 15129, 15126, 15125, 15126, 15128, 15125, 15124, 15125, 15129, 15126, 15126, 15128, 15132, 15131, 15131, 15133, 15137, 15134, 15133, 15133, 15136, 15133, 15132, 15133, 15137, 15134, 15134, 15136, 15140, 15138, 15139, 15141, 15145, 15142, 15141, 15142, 15144, 15141, 15140, 15142, 15145, 15143, 15142, 15144, 15148, 15147, 15147, 15149, 15153, 15150, 15148, 15149, 15151, 15148, 15146, 15148, 15151, 15148, 15147, 15149, 15153, 15151, 15151, 15153, 15157, 15154, 15153, 15153, 15156, 15152, 15151, 15153, 15156, 15154, 15153, 15156, 15160, 15158, 15159, 15161, 15165, 15162, 15161, 15162, 15164, 15161, 15160, 15161, 15165, 15162, 15162, 15164, 15168, 15167, 15167, 15169, 15173, 15170, 15169, 15169, 15172, 15169, 15168, 15169, 15173, 15170, 15170, 15172, 15176, 15174, 15175, 15177, 15181, 15178, 15177, 15178, 15180, 15177, 15176, 15178, 15181, 15179, 15178, 15180, 15184, 15183, 15183, 15185, 15189, 15186, 15184, 15185, 15187, 15184, 15182, 15184, 15187, 15184, 15183, 15185, 15189, 15187, 15187, 15189, 15193, 15190, 15189, 15189, 15192, 15188, 15187, 15189, 15192, 15190, 15189, 15192, 15196, 15194, 15195, 15197, 15201, 15198, 15197, 15198, 15200, 15197, 15196, 15197, 15201, 15198, 15198, 15200, 15204, 15203, 15203, 15205, 15209, 15206, 15205, 15205, 15208, 15205, 15204, 15205, 15209, 15206, 15206, 15208, 15212, 15210, 15211, 15213, 15217, 15214, 15213, 15214, 15216, 15213, 15212, 15214, 15217, 15215, 15214, 15216, 15220, 15219, 15219, 15221, 15225, 15222, 15220, 15221, 15223, 15220, 15218, 15220, 15223, 15220, 15219, 15221, 15225, 15223, 15223, 15225, 15229, 15226, 15225, 15225, 15228, 15224, 15223, 15225, 15228, 15226, 15225, 15228, 15232, 15230, 15231, 15233, 15237, 15234, 15233, 15234, 15236, 15233, 15232, 15233, 15237, 15234, 15234, 15236, 15240, 15239, 15239, 15241, 15245, 15242, 15241, 15241, 15244, 15241, 15240, 15241, 15245, 15242, 15242, 15244, 15248, 15246, 15247, 15249, 15253, 15250, 15249, 15250, 15252, 15249, 15248, 15250, 15253, 15251, 15250, 15252, 15256, 15255, 15255, 15257, 15261, 15258, 15256, 15257, 15259, 15256, 15254, 15256, 15259, 15256, 15255, 15257, 15261, 15259, 15259, 15261, 15265, 15262, 15260, 15261, 15264, 15260, 15259, 15261, 15264, 15262, 15261, 15263, 15268, 15266, 15267, 15269, 15273, 15270, 15269, 15270, 15272, 15269, 15268, 15269, 15273, 15270, 15270, 15272, 15276, 15275, 15275, 15277, 15281, 15278, 15277, 15277, 15280, 15277, 15276, 15277, 15281, 15278, 15278, 15280, 15284, 15282, 15283, 15285, 15289, 15286, 15285, 15285, 15288, 15285, 15284, 15285, 15289, 15286, 15286, 15288, 15292, 15290, 15291, 15293, 15297, 15294, 15293, 15294, 15296, 15293, 15292, 15294, 15297, 15295, 15294, 15296, 15300, 15299, 15299, 15301, 15305, 15302, 15300, 15301, 15303, 15300, 15298, 15299, 15303, 15300, 15299, 15301, 15305, 15303, 15303, 15305, 15309, 15306, 15304, 15305, 15308, 15304, 15303, 15305, 15308, 15306, 15305, 15307, 15312, 15310, 15311, 15313, 15317, 15314, 15313, 15314, 15316, 15313, 15312, 15313, 15317, 15314, 15314, 15316, 15320, 15319, 15319, 15321, 15325, 15322, 15321, 15321, 15324, 15321, 15319, 15321, 15325, 15322, 15321, 15324, 15328, 15326, 15327, 15329, 15333, 15330, 15329, 15330, 15332, 15329, 15328, 15330, 15333, 15331, 15330, 15332, 15336, 15335, 15335, 15337, 15341, 15338, 15336, 15337, 15339, 15336, 15334, 15335, 15339, 15336, 15335, 15337, 15341, 15339, 15339, 15341, 15345, 15342, 15340, 15341, 15344, 15340, 15339, 15341, 15344, 15342, 15341, 15343, 15348, 15346, 15347, 15349, 15353, 15350, 15349, 15350, 15352, 15349, 15348, 15349, 15353, 15350, 15350, 15352, 15356, 15355, 15355, 15357, 15361, 15358, 15357, 15357, 15360, 15357, 15355, 15357, 15361, 15358, 15357, 15360, 15364, 15362, 15363, 15365, 15369, 15366, 15365, 15366, 15368, 15365, 15364, 15366, 15369, 15367, 15366, 15368, 15372, 15371, 15371, 15373, 15377, 15374, 15372, 15373, 15375, 15372, 15370, 15371, 15375, 15372, 15371, 15373, 15377, 15375, 15375, 15377, 15381, 15378, 15376, 15377, 15380, 15376, 15375, 15377, 15380, 15378, 15377, 15379, 15384, 15382, 15382, 15385, 15389, 15386, 15385, 15386, 15388, 15385, 15384, 15386, 15389, 15387, 15386, 15388, 15392, 15391, 15391, 15393, 15397, 15394, 15392, 15393, 15395, 15392, 15390, 15391, 15395, 15392, 15391, 15393, 15397, 15395, 15395, 15397, 15401, 15398, 15396, 15397, 15400, 15396, 15395, 15397, 15400, 15398, 15397, 15399, 15404, 15402, 15403, 15405, 15409, 15406, 15405, 15406, 15408, 15405, 15404, 15405, 15409, 15406, 15406, 15408, 15412, 15410, 15411, 15413, 15417, 15414, 15413, 15413, 15416, 15413, 15411, 15413, 15417, 15414, 15413, 15416, 15420, 15418, 15419, 15421, 15425, 15422, 15421, 15422, 15424, 15421, 15420, 15422, 15425, 15423, 15422, 15424, 15428, 15427, 15427, 15429, 15433, 15430, 15428, 15429, 15431, 15428, 15426, 15427, 15431, 15428, 15427, 15429, 15433, 15431, 15431, 15433, 15437, 15434, 15432, 15433, 15436, 15432, 15431, 15433, 15436, 15434, 15433, 15435, 15440, 15438, 15439, 15441, 15445, 15442, 15441, 15441, 15444, 15441, 15440, 15441, 15445, 15442, 15442, 15444, 15448, 15446, 15447, 15449, 15453, 15450, 15449, 15449, 15452, 15449, 15447, 15449, 15453, 15450, 15449, 15452, 15456, 15454, 15455, 15457, 15461, 15458, 15457, 15458, 15460, 15457, 15456, 15458, 15461, 15459, 15458, 15460, 15464, 15463, 15463, 15465, 15469, 15466, 15464, 15465, 15467, 15464, 15462, 15463, 15467, 15464, 15463, 15465, 15469, 15467, 15467, 15469, 15473, 15470, 15468, 15469, 15472, 15468, 15467, 15469, 15472, 15470, 15469, 15471, 15476, 15474, 15475, 15477, 15481, 15478, 15477, 15477, 15480, 15477, 15476, 15477, 15481, 15478, 15478, 15480, 15484, 15482, 15483, 15485, 15489, 15486, 15485, 15486, 15488, 15485, 15484, 15485, 15489, 15487, 15486, 15488, 15492, 15491, 15491, 15493, 15497, 15494, 15492, 15493, 15495, 15492, 15490, 15491, 15495, 15492, 15491, 15493, 15497, 15495, 15495, 15497, 15501, 15498, 15496, 15497, 15500, 15496, 15495, 15497, 15500, 15498, 15497, 15499, 15504, 15502, 15502, 15505, 15509, 15506, 15505, 15505, 15508, 15505, 15504, 15505, 15509, 15506, 15506, 15508, 15512, 15510, 15511, 15513, 15517, 15514, 15513, 15513, 15516, 15513, 15511, 15513, 15517, 15514, 15513, 15516, 15520, 15518, 15519, 15521, 15525, 15522, 15521, 15522, 15524, 15521, 15520, 15521, 15525, 15523, 15522, 15524, 15528, 15527, 15527, 15529, 15533, 15530, 15528, 15529, 15531, 15527, 15526, 15527, 15531, 15528, 15527, 15529, 15533, 15531, 15531, 15533, 15537, 15534, 15532, 15533, 15536, 15533, 15531, 15533, 15537, 15534, 15534, 15536, 15540, 15538, 15539, 15541, 15545, 15542, 15540, 15541, 15543, 15540, 15538, 15539, 15543, 15540, 15539, 15541, 15545, 15543, 15543, 15545, 15549, 15546, 15544, 15545, 15548, 15544, 15543, 15545, 15548, 15546, 15545, 15547, 15552, 15550, 15550, 15553, 15557, 15554, 15553, 15553, 15556, 15553, 15551, 15553, 15557, 15554, 15553, 15556, 15560, 15558, 15559, 15561, 15565, 15562, 15561, 15561, 15564, 15561, 15560, 15561, 15565, 15562, 15562, 15564, 15568, 15567, 15567, 15569, 15573, 15570, 15568, 15569, 15571, 15567, 15566, 15567, 15571, 15568, 15567, 15569, 15573, 15571, 15571, 15573, 15577, 15574, 15572, 15573, 15576, 15572, 15571, 15573, 15576, 15574, 15573, 15575, 15580, 15578, 15578, 15581, 15585, 15582, 15581, 15581, 15584, 15581, 15579, 15581, 15585, 15582, 15581, 15584, 15588, 15586, 15587, 15589, 15593, 15590, 15589, 15589, 15592, 15589, 15588, 15589, 15593, 15590, 15590, 15592, 15596, 15595, 15595, 15597, 15601, 15598, 15596, 15597, 15599, 15595, 15594, 15595, 15599, 15596, 15595, 15597, 15601, 15599, 15599, 15601, 15605, 15602, 15600, 15601, 15604, 15601, 15599, 15601, 15605, 15602, 15601, 15604, 15608, 15606, 15607, 15609, 15613, 15610, 15608, 15609, 15611, 15608, 15606, 15607, 15611, 15608, 15607, 15609, 15613, 15611, 15611, 15613, 15617, 15614, 15612, 15613, 15616, 15612, 15611, 15613, 15616, 15614, 15613, 15615, 15620, 15618, 15618, 15621, 15625, 15622, 15621, 15621, 15624, 15621, 15619, 15621, 15625, 15622, 15621, 15624, 15628, 15626, 15627, 15629, 15633, 15630, 15629, 15629, 15632, 15629, 15628, 15629, 15633, 15630, 15630, 15632, 15636, 15635, 15635, 15637, 15641, 15638, 15636, 15637, 15639, 15635, 15634, 15635, 15639, 15636, 15635, 15637, 15641, 15639, 15639, 15641, 15645, 15642, 15640, 15641, 15644, 15640, 15639, 15641, 15644, 15642, 15641, 15643, 15648, 15646, 15646, 15649, 15653, 15650, 15649, 15649, 15652, 15649, 15647, 15649, 15653, 15650, 15649, 15652, 15656, 15654, 15654, 15657, 15661, 15658, 15657, 15657, 15660, 15657, 15656, 15657, 15661, 15658, 15658, 15660, 15664, 15663, 15663, 15665, 15669, 15666, 15664, 15665, 15667, 15663, 15662, 15663, 15667, 15664, 15663, 15665, 15669, 15667, 15667, 15669, 15673, 15670, 15668, 15669, 15672, 15668, 15667, 15669, 15673, 15670, 15669, 15672, 15676, 15674, 15675, 15677, 15681, 15678, 15676, 15677, 15679, 15676, 15674, 15675, 15679, 15676, 15675, 15677, 15681, 15679, 15679, 15681, 15685, 15682, 15680, 15681, 15684, 15680, 15679, 15681, 15684, 15682, 15681, 15683, 15688, 15686, 15686, 15689, 15693, 15690, 15689, 15689, 15692, 15689, 15687, 15689, 15693, 15690, 15689, 15692, 15696, 15694, 15694, 15697, 15701, 15698, 15697, 15697, 15700, 15697, 15696, 15697, 15701, 15698, 15698, 15700, 15704, 15703, 15703, 15705, 15709, 15706, 15704, 15705, 15707, 15703, 15702, 15703, 15707, 15704, 15703, 15705, 15709, 15707, 15707, 15709, 15713, 15710, 15708, 15709, 15712, 15708, 15707, 15709, 15712, 15710, 15709, 15711, 15716, 15714, 15714, 15717, 15721, 15718, 15717, 15717, 15720, 15717, 15715, 15717, 15721, 15718, 15717, 15720, 15724, 15722, 15722, 15725, 15729, 15726, 15725, 15725, 15728, 15725, 15724, 15725, 15729, 15726, 15726, 15728, 15732, 15731, 15731, 15733, 15737, 15734, 15732, 15733, 15735, 15731, 15730, 15731, 15734, 15732, 15731, 15733, 15737, 15735, 15735, 15737, 15741, 15738, 15736, 15737, 15740, 15736, 15735, 15737, 15741, 15738, 15737, 15740, 15744, 15742, 15743, 15745, 15749, 15746, 15744, 15745, 15747, 15743, 15742, 15743, 15747, 15744, 15743, 15745, 15749, 15747, 15747, 15749, 15753, 15750, 15748, 15749, 15751, 15748, 15747, 15748, 15752, 15749, 15749, 15751, 15756, 15754, 15754, 15757, 15761, 15758, 15757, 15757, 15760, 15757, 15755, 15757, 15761, 15758, 15757, 15759, 15764, 15762, 15762, 15765, 15769, 15766, 15765, 15765, 15768, 15765, 15764, 15765, 15769, 15766, 15766, 15768, 15772, 15771, 15771, 15773, 15777, 15774, 15772, 15773, 15775, 15771, 15770, 15771, 15775, 15772, 15771, 15773, 15777, 15775, 15775, 15777, 15781, 15778, 15776, 15777, 15779, 15776, 15775, 15776, 15780, 15777, 15777, 15779, 15784, 15782, 15782, 15785, 15789, 15786, 15784, 15785, 15788, 15785, 15783, 15785, 15789, 15786, 15785, 15787, 15792, 15790, 15790, 15793, 15797, 15794, 15793, 15793, 15796, 15793, 15792, 15793, 15797, 15794, 15794, 15796, 15800, 15799, 15799, 15801, 15805, 15802, 15800, 15800, 15803, 15799, 15798, 15799, 15802, 15799, 15799, 15801, 15805, 15803, 15803, 15805, 15809, 15806, 15804, 15805, 15808, 15804, 15803, 15805, 15809, 15806, 15805, 15808, 15812, 15810, 15811, 15813, 15817, 15814, 15812, 15813, 15815, 15811, 15810, 15811, 15815, 15812, 15811, 15813, 15817, 15815, 15815, 15817, 15821, 15818, 15816, 15817, 15819, 15816, 15815, 15816, 15820, 15817, 15817, 15819, 15823, 15822, 15822, 15825, 15829, 15826, 15825, 15825, 15828, 15825, 15824, 15825, 15829, 15826, 15826, 15828, 15832, 15831, 15831, 15833, 15837, 15834, 15832, 15832, 15835, 15831, 15830, 15831, 15834, 15831, 15831, 15832, 15837, 15835, 15835, 15837, 15841, 15838, 15836, 15837, 15840, 15836, 15835, 15837, 15841, 15838, 15837, 15840, 15844, 15842, 15843, 15845, 15849, 15846, 15844, 15845, 15847, 15843, 15842, 15843, 15847, 15844, 15843, 15845, 15849, 15847, 15847, 15849, 15853, 15850, 15848, 15849, 15851, 15848, 15847, 15848, 15852, 15849, 15849, 15851, 15856, 15854, 15854, 15857, 15861, 15858, 15856, 15857, 15860, 15856, 15855, 15857, 15861, 15858, 15857, 15859, 15864, 15862, 15862, 15865, 15869, 15866, 15865, 15865, 15868, 15865, 15864, 15865, 15869, 15866, 15866, 15868, 15872, 15870, 15871, 15873, 15877, 15874, 15872, 15873, 15875, 15871, 15870, 15871, 15875, 15872, 15871, 15873, 15877, 15875, 15875, 15877, 15881, 15878, 15876, 15877, 15879, 15876, 15875, 15876, 15880, 15877, 15877, 15879, 15884, 15882, 15882, 15885, 15889, 15886, 15884, 15885, 15888, 15884, 15883, 15885, 15889, 15886, 15885, 15887, 15892, 15890, 15890, 15893, 15897, 15894, 15893, 15893, 15896, 15893, 15892, 15893, 15897, 15894, 15894, 15896, 15900, 15898, 15899, 15901, 15905, 15902, 15900, 15900, 15903, 15899, 15898, 15899, 15902, 15899, 15899, 15900, 15905, 15903, 15903, 15905, 15909, 15906, 15904, 15905, 15908, 15904, 15903, 15905, 15909, 15906, 15905, 15908, 15912, 15910, 15911, 15913, 15917, 15914, 15912, 15913, 15915, 15911, 15910, 15911, 15915, 15912, 15911, 15913, 15917, 15915, 15915, 15917, 15921, 15918, 15916, 15917, 15919, 15916, 15915, 15916, 15920, 15917, 15917, 15919, 15924, 15922, 15922, 15925, 15929, 15926, 15924, 15925, 15928, 15925, 15923, 15925, 15929, 15926, 15925, 15928, 15932, 15930, 15930, 15933, 15937, 15934, 15932, 15933, 15936, 15932, 15931, 15933, 15936, 15934, 15933, 15935, 15940, 15938, 15938, 15941, 15945, 15942, 15941, 15941, 15944, 15941, 15940, 15941, 15945, 15942, 15942, 15944, 15948, 15946, 15947, 15949, 15953, 15950, 15948, 15948, 15951, 15947, 15946, 15947, 15950, 15947, 15946, 15948, 15953, 15951, 15951, 15953, 15957, 15954, 15952, 15953, 15956, 15952, 15951, 15953, 15957, 15954, 15953, 15955, 15960, 15958, 15958, 15961, 15965, 15962, 15960, 15961, 15963, 15959, 15958, 15959, 15963, 15960, 15959, 15961, 15965, 15963, 15963, 15965, 15969, 15966, 15964, 15965, 15967, 15964, 15963, 15964, 15968, 15965, 15965, 15967, 15972, 15970, 15970, 15973, 15977, 15974, 15972, 15973, 15976, 15972, 15971, 15973, 15976, 15974, 15973, 15975, 15980, 15978, 15978, 15981, 15985, 15982, 15980, 15981, 15984, 15981, 15980, 15981, 15985, 15982, 15982, 15984, 15988, 15986, 15987, 15989, 15993, 15990, 15988, 15988, 15991, 15987, 15986, 15987, 15990, 15987, 15987, 15989, 15993, 15991, 15991, 15993, 15997, 15994, 15992, 15993, 15995, 15992, 15991, 15992, 15996, 15993, 15993, 15995, 16000, 15998, 15998, 16001, 16005, 16002, 16000, 16001, 16004, 16000, 15999, 16001, 16004, 16002, 16001, 16003, 16008, 16006, 16006, 16009, 16013, 16010, 16008, 16009, 16012, 16009, 16008, 16009, 16013, 16010, 16010, 16012, 16016, 16014, 16015, 16017, 16021, 16018, 16016, 16016, 16019, 16015, 16014, 16015, 16018, 16015, 16014, 16016, 16021, 16019, 16019, 16021, 16025, 16022, 16020, 16021, 16024, 16020, 16019, 16021, 16024, 16022, 16021, 16023, 16028, 16026, 16026, 16029, 16033, 16030, 16028, 16029, 16031, 16027, 16026, 16027, 16031, 16028, 16027, 16029, 16033, 16031, 16031, 16033, 16037, 16034, 16032, 16033, 16035, 16032, 16031, 16032, 16036, 16033, 16033, 16035, 16039, 16038, 16038, 16041, 16045, 16042, 16040, 16041, 16044, 16040, 16039, 16041, 16044, 16042, 16041, 16043, 16048, 16046, 16046, 16049, 16053, 16050, 16048, 16049, 16052, 16049, 16047, 16049, 16053, 16050, 16050, 16052, 16056, 16054, 16055, 16057, 16061, 16058, 16056, 16056, 16059, 16055, 16054, 16055, 16058, 16055, 16054, 16056, 16061, 16059, 16059, 16061, 16065, 16062, 16060, 16061, 16064, 16060, 16059, 16061, 16064, 16062, 16061, 16063, 16068, 16066, 16066, 16069, 16073, 16070, 16068, 16069, 16071, 16067, 16066, 16067, 16071, 16068, 16067, 16069, 16073, 16071, 16071, 16073, 16077, 16074, 16072, 16073, 16075, 16072, 16071, 16072, 16076, 16073, 16073, 16075, 16079, 16078, 16078, 16081, 16085, 16082, 16080, 16081, 16084, 16080, 16079, 16081, 16085, 16082, 16081, 16083, 16088, 16086, 16086, 16089, 16093, 16090, 16088, 16089, 16092, 16088, 16087, 16089, 16092, 16090, 16089, 16091, 16096, 16094, 16094, 16097, 16101, 16098, 16096, 16097, 16100, 16097, 16095, 16097, 16101, 16098, 16098, 16100, 16104, 16102, 16103, 16105, 16109, 16106, 16104, 16104, 16107, 16103, 16101, 16103, 16106, 16103, 16102, 16104, 16109, 16107, 16107, 16109, 16113, 16110, 16108, 16109, 16112, 16108, 16107, 16109, 16112, 16110, 16109, 16111, 16116, 16114, 16114, 16117, 16121, 16118, 16116, 16116, 16119, 16115, 16114, 16115, 16119, 16116, 16115, 16117, 16121, 16119, 16119, 16121, 16125, 16122, 16120, 16121, 16123, 16120, 16119, 16120, 16124, 16121, 16121, 16123, 16127, 16126, 16126, 16129, 16133, 16130, 16128, 16129, 16132, 16128, 16127, 16129, 16132, 16130, 16129, 16131, 16136, 16134, 16134, 16137, 16141, 16138, 16136, 16137, 16140, 16137, 16135, 16137, 16141, 16138, 16137, 16140, 16144, 16142, 16143, 16145, 16149, 16146, 16144, 16144, 16147, 16143, 16141, 16143, 16146, 16143, 16142, 16144, 16149, 16147, 16147, 16149, 16153, 16150, 16148, 16149, 16152, 16148, 16147, 16149, 16152, 16150, 16149, 16151, 16156, 16154, 16154, 16157, 16161, 16158, 16156, 16156, 16159, 16155, 16154, 16155, 16159, 16155, 16155, 16157, 16161, 16159, 16159, 16161, 16165, 16162, 16160, 16161, 16163, 16160, 16159, 16160, 16164, 16161, 16161, 16163, 16167, 16166, 16166, 16169, 16173, 16170, 16168, 16169, 16172, 16168, 16167, 16169, 16173, 16170, 16169, 16171, 16176, 16174, 16174, 16177, 16181, 16178, 16176, 16177, 16180, 16176, 16175, 16176, 16180, 16177, 16177, 16179, 16184, 16182, 16182, 16185, 16189, 16186, 16184, 16185, 16188, 16185, 16183, 16185, 16189, 16186, 16185, 16188, 16192, 16190, 16191, 16193, 16197, 16194, 16192, 16192, 16195, 16191, 16189, 16191, 16194, 16191, 16190, 16192, 16196, 16195, 16195, 16197, 16201, 16198, 16196, 16197, 16200, 16196, 16195, 16197, 16200, 16198, 16197, 16199, 16204, 16202, 16202, 16205, 16209, 16206, 16204, 16204, 16207, 16203, 16202, 16203, 16207, 16203, 16203, 16204, 16209, 16207, 16207, 16209, 16213, 16210, 16208, 16209, 16211, 16208, 16207, 16208, 16212, 16209, 16209, 16211, 16215, 16214, 16214, 16217, 16221, 16218, 16216, 16217, 16220, 16216, 16215, 16217, 16220, 16218, 16217, 16219, 16224, 16222, 16222, 16225, 16229, 16226, 16224, 16225, 16228, 16225, 16223, 16225, 16229, 16226, 16225, 16228, 16232, 16230, 16230, 16233, 16237, 16234, 16232, 16232, 16235, 16231, 16229, 16231, 16234, 16231, 16230, 16232, 16236, 16235, 16235, 16237, 16241, 16238, 16236, 16237, 16240, 16236, 16235, 16237, 16240, 16238, 16237, 16239, 16244, 16242, 16242, 16245, 16249, 16246, 16244, 16244, 16247, 16243, 16242, 16243, 16247, 16243, 16243, 16244, 16249, 16247, 16247, 16249, 16253, 16250, 16248, 16249, 16251, 16248, 16246, 16248, 16252, 16249, 16249, 16251, 16255, 16254, 16254, 16257, 16261, 16258, 16256, 16257, 16260, 16256, 16255, 16257, 16261, 16258, 16257, 16259, 16264, 16262, 16262, 16265, 16269, 16266, 16264, 16265, 16268, 16264, 16263, 16264, 16268, 16265, 16265, 16267, 16272, 16270, 16270, 16273, 16277, 16274, 16272, 16273, 16276, 16273, 16271, 16273, 16277, 16274, 16273, 16276, 16280, 16278, 16278, 16281, 16285, 16282, 16280, 16280, 16283, 16279, 16277, 16279, 16282, 16279, 16278, 16280, 16284, 16282, 16283, 16285, 16289, 16286, 16284, 16285, 16288, 16284, 16283, 16285, 16288, 16286, 16285, 16287, 16292, 16290, 16290, 16293, 16297, 16294, 16292, 16292, 16295, 16291, 16290, 16291, 16294, 16291, 16290, 16292, 16297, 16295, 16295, 16297, 16301, 16298, 16296, 16297, 16299, 16296, 16294, 16296, 16300, 16297, 16297, 16299, 16303, 16302, 16302, 16305, 16309, 16306, 16304, 16305, 16308, 16304, 16303, 16305, 16308, 16306, 16305, 16307, 16312, 16310, 16310, 16313, 16317, 16314, 16312, 16313, 16316, 16312, 16311, 16313, 16317, 16314, 16313, 16316, 16320, 16318, 16318, 16321, 16325, 16322, 16320, 16320, 16323, 16319, 16317, 16319, 16322, 16319, 16318, 16320, 16324, 16322, 16322, 16325, 16329, 16326, 16324, 16325, 16328, 16324, 16323, 16324, 16328, 16326, 16325, 16327, 16332, 16330, 16330, 16333, 16337, 16334, 16332, 16332, 16335, 16331, 16330, 16331, 16334, 16331, 16330, 16332, 16337, 16335, 16335, 16337, 16341, 16338, 16336, 16337, 16339, 16336, 16334, 16336, 16340, 16337, 16336, 16339, 16343, 16342, 16342, 16345, 16349, 16346, 16344, 16345, 16348, 16344, 16343, 16345, 16349, 16346, 16345, 16347, 16352, 16350, 16350, 16353, 16357, 16354, 16352, 16353, 16355, 16352, 16351, 16352, 16356, 16353, 16353, 16355, 16359, 16358, 16358, 16361, 16365, 16362, 16360, 16361, 16364, 16361, 16360, 16362, 16366, 16363, 16363, 16366, 16370, 16369, 16369, 16372, 16377, 16374, 16373, 16374, 16377, 16374, 16373, 16375, 16379, 16376, 16376, 16379, 16383, 16381, 16381, 16383] + is_save: false + +auto_exposure: + is_enable: true + is_debug: true + center_illuminance: 90 + histogram_skewness: 0.9 + + +color_space_conversion: + conv_standard: 2 + # Bt.709 HD = 1 + # Bt.601/4407 = 2 + is_save: false + + +ldci: + is_enable: false + clip_limit: 1 + wind: 16 + is_save: false + +sharpen: + is_enable: true + sharpen_sigma: 5 + sharpen_strength: 1 + is_save: false + +2d_noise_reduction: + is_enable: false + # nlm + window_size: 21 + patch_size: 9 + wts: 10 + is_save: false + +rgb_conversion: + is_enable: true + is_save: false + +scale: + is_enable: false + is_debug: true + new_width: 1920 + new_height: 1080 + isHardware: true + # Nearest_Neighbor # Bilinear + Algo: "Nearest_Neighbor" + upscale_method: "Nearest_Neighbor" + downscale_method: "Bilinear" + is_save: false + +yuv_conversion_format: + # The conversion wont run if csc is false + is_enable: false + conv_type: '444' + is_save: false + +pre_gamma: + is_enable: false + is_save: false + +tone_mapping: + is_enable: false + is_save: false + +jpeg_conversion: + is_enable: false + is_save: false diff --git a/in_frames/normal/Outdoor3_2592x1536_12bit_RGGB.raw b/in_frames/normal/data/Outdoor3_2592x1536_12bit_RGGB.raw similarity index 100% rename from in_frames/normal/Outdoor3_2592x1536_12bit_RGGB.raw rename to in_frames/normal/data/Outdoor3_2592x1536_12bit_RGGB.raw diff --git a/in_frames/normal/data/Outdoor4_2592x1536_12bit_RGGB-configs.yml b/in_frames/normal/data/Outdoor4_2592x1536_12bit_RGGB-configs.yml new file mode 100644 index 0000000..05fee65 --- /dev/null +++ b/in_frames/normal/data/Outdoor4_2592x1536_12bit_RGGB-configs.yml @@ -0,0 +1,184 @@ +platform: + filename: "Outdoor4_2592x1536_12bit_RGGB.raw" + disable_progress_bar: false + leave_pbar_string: false + render_3a: false + # npy, png or both + save_format: both + +sensor_info: + bayer_pattern: "rggb" + range: 1023 + bit_depth: 12 + width: 2592 + height: 1536 + +crop: + is_enable: false + is_debug: false + new_width: 1280 + new_height: 720 + is_save: false + +dead_pixel_correction: + is_enable: false + dp_threshold: 80 + is_debug: true + is_save: false + +hdr_stitching: + is_enable: false + +black_level_correction: + is_enable: true + r_offset: 200 + gr_offset: 200 + gb_offset: 200 + b_offset: 200 + is_linear: false + r_sat: 4095 + gr_sat: 4095 + gb_sat: 4095 + b_sat: 4095 + is_save: false + +OECF: + is_enable: false + # Make sure the LUT has the right bit range i.e. if image is of 10 bit LUT should be from [0 - (2^10)-1] + # LUT here does nothing to the sensor response i.e. a value of 800 maps to 800 and 2000 maps to 2000 + r_lut: [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2094,2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,2480,2481,2482,2483,2484,2485,2486,2487,2488,2489,2490,2491,2492,2493,2494,2495,2496,2497,2498,2499,2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559,2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574,2575,2576,2577,2578,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2601,2602,2603,2604,2605,2606,2607,2608,2609,2610,2611,2612,2613,2614,2615,2616,2617,2618,2619,2620,2621,2622,2623,2624,2625,2626,2627,2628,2629,2630,2631,2632,2633,2634,2635,2636,2637,2638,2639,2640,2641,2642,2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658,2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,2691,2692,2693,2694,2695,2696,2697,2698,2699,2700,2701,2702,2703,2704,2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2729,2730,2731,2732,2733,2734,2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,2751,2752,2753,2754,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,2766,2767,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2780,2781,2782,2783,2784,2785,2786,2787,2788,2789,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,2810,2811,2812,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2857,2858,2859,2860,2861,2862,2863,2864,2865,2866,2867,2868,2869,2870,2871,2872,2873,2874,2875,2876,2877,2878,2879,2880,2881,2882,2883,2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,2962,2963,2964,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020,3021,3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069,3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3113,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174,3175,3176,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,3188,3189,3190,3191,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,3278,3279,3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295,3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327,3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343,3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,3388,3389,3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405,3406,3407,3408,3409,3410,3411,3412,3413,3414,3415,3416,3417,3418,3419,3420,3421,3422,3423,3424,3425,3426,3427,3428,3429,3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443,3444,3445,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3456,3457,3458,3459,3460,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,3512,3513,3514,3515,3516,3517,3518,3519,3520,3521,3522,3523,3524,3525,3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541,3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557,3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573,3574,3575,3576,3577,3578,3579,3580,3581,3582,3583,3584,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695,3696,3697,3698,3699,3700,3701,3702,3703,3704,3705,3706,3707,3708,3709,3710,3711,3712,3713,3714,3715,3716,3717,3718,3719,3720,3721,3722,3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744,3745,3746,3747,3748,3749,3750,3751,3752,3753,3754,3755,3756,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,3767,3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,3779,3780,3781,3782,3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3802,3803,3804,3805,3806,3807,3808,3809,3810,3811,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,3822,3823,3824,3825,3826,3827,3828,3829,3830,3831,3832,3833,3834,3835,3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847,3848,3849,3850,3851,3852,3853,3854,3855,3856,3857,3858,3859,3860,3861,3862,3863,3864,3865,3866,3867,3868,3869,3870,3871,3872,3873,3874,3875,3876,3877,3878,3879,3880,3881,3882,3883,3884,3885,3886,3887,3888,3889,3890,3891,3892,3893,3894,3895,3896,3897,3898,3899,3900,3901,3902,3903,3904,3905,3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,3940,3941,3942,3943,3944,3945,3946,3947,3948,3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,3978,3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,3992,3993,3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,4056,4057,4058,4059,4060,4061,4062,4063,4064,4065,4066,4067,4068,4069,4070,4071,4072,4073,4074,4075,4076,4077,4078,4079,4080,4081,4082,4083,4084,4085,4086,4087,4088,4089,4090,4091,4092,4093,4094,4095] + is_save: false + +digital_gain: + is_debug: true + is_auto: true + # Array of pre-define Gains + gain_array: [1, 2, 4, 6, 8, 10, 12, 16, 32, 64] + # Index of default gain + current_gain: 0 + ae_feedback: 0 + is_save: false + +lens_shading_correction: + is_enable: false + is_save: false + +bayer_noise_reduction: + is_enable: true + filter_window: 9 + r_std_dev_s: 1 + r_std_dev_r: 0.1 + g_std_dev_s: 1 + g_std_dev_r: 0.08 + b_std_dev_s: 1 + b_std_dev_r: 0.1 + is_save: false + +auto_white_balance: + is_enable: true + is_debug: true + underexposed_percentage: 5 + overexposed_percentage: 5 + algorithm: "norm_2" + # grey_world, norm_2, pca + percentage: 3.5 # pca + +white_balance: + is_enable: true + # is_auto refers to auto white balance module + is_debug: true + is_auto: true + r_gain: 1.768566 + b_gain: 1.641026 + is_save: false + +demosaic: + is_save: false + +color_correction_matrix: + #Row sum to 1 convention + is_enable: true + corrected_red: [ 1.87578, -0.59375, -0.08203125 ] + corrected_green: [ -0.2421875, 1.5078125, -0.265625 ] + corrected_blue: [ -0.0078125, -0.44921875, 1.35703125 ] + is_save: false + +gamma_correction: + is_enable: true + # 8-bit + gamma_lut_8: [0, 5, 9, 13, 17, 22, 25, 29, 33, 37, 40, 44, 47, 50, 54, 57, 60, 63, 66, 69, 72, 75, 78, 80, 83, 85, 88, 90, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113, 115, 117, 118, 120, 122, 123, 125, 126, 128, 129, 131, 132, 134, 135, 136, 138, 139, 140, 141, 142, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 162, 163, 164, 165, 166, 167, 167, 168, 169, 170, 171, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 179, 179, 180, 181, 181, 182, 183, 183, 184, 185, 185, 186, 187, 187, 188, 188, 189, 190, 190, 191, 191, 192, 193, 193, 194, 194, 195, 195, 196, 197, 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 205, 205, 206, 206, 207, 207, 208, 208, 209, 209, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 216, 217, 217, 218, 218, 219, 219, 220, 220, 221, 221, 221, 222, 222, 223, 223, 224, 224, 225, 225, 225, 226, 226, 227, 227, 228, 228, 228, 229, 229, 230, 230, 231, 231, 231, 232, 232, 233, 233, 234, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240, 241, 241, 241, 242, 242, 243, 243, 244, 244, 244, 245, 245, 246, 246, 247, 247, 247, 248, 248, 249, 249, 250, 250, 250, 251, 251, 252, 252, 252, 253, 253, 254, 254, 255] + # 10-bit + gamma_lut_10: [0, 9, 13, 17, 21, 25, 29, 34, 38, 42, 46, 50, 54, 58, 62, 66, 70, 74, 78, 82, 86, 90, 94, 98, 102, 106, 110, 114, 117, 121, 125, 129, 132, 136, 140, 143, 147, 150, 154, 157, 161, 165, 168, 172, 175, 179, 182, 185, 189, 192, 196, 199, 202, 205, 209, 212, 215, 219, 222, 225, 228, 231, 235, 238, 241, 244, 247, 250, 253, 256, 259, 262, 265, 268, 271, 274, 277, 280, 283, 286, 289, 292, 295, 297, 300, 303, 306, 308, 311, 314, 317, 319, 322, 325, 327, 330, 332, 335, 337, 340, 342, 345, 347, 350, 352, 355, 357, 359, 362, 364, 367, 369, 371, 374, 376, 378, 380, 383, 385, 387, 389, 392, 394, 396, 398, 400, 402, 404, 406, 409, 411, 413, 415, 417, 419, 421, 423, 425, 427, 429, 431, 433, 435, 437, 439, 441, 443, 444, 446, 448, 450, 452, 454, 455, 457, 459, 461, 463, 464, 466, 468, 469, 471, 473, 474, 476, 478, 479, 481, 483, 484, 486, 488, 489, 491, 492, 494, 495, 497, 499, 500, 502, 503, 505, 506, 508, 509, 511, 513, 514, 516, 517, 519, 520, 521, 523, 524, 526, 527, 529, 530, 532, 533, 534, 536, 537, 539, 540, 541, 543, 544, 545, 547, 548, 549, 550, 552, 553, 554, 555, 557, 558, 559, 560, 562, 563, 564, 565, 567, 568, 569, 570, 571, 573, 574, 575, 576, 577, 578, 580, 581, 582, 583, 584, 585, 586, 588, 589, 590, 591, 592, 593, 594, 595, 596, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 633, 634, 635, 636, 637, 638, 639, 640, 641, 641, 642, 643, 644, 645, 646, 647, 648, 649, 649, 650, 651, 652, 653, 654, 655, 655, 656, 657, 658, 659, 660, 660, 661, 662, 663, 664, 665, 665, 666, 667, 668, 669, 670, 670, 671, 672, 673, 674, 674, 675, 676, 677, 678, 678, 679, 680, 681, 681, 682, 683, 683, 684, 685, 686, 686, 687, 688, 689, 689, 690, 691, 692, 692, 693, 694, 695, 695, 696, 697, 697, 698, 699, 700, 700, 701, 702, 703, 703, 704, 705, 705, 706, 707, 708, 708, 709, 710, 710, 711, 712, 713, 713, 714, 715, 715, 716, 717, 717, 718, 719, 719, 720, 721, 722, 722, 723, 724, 724, 725, 726, 726, 727, 728, 728, 729, 730, 731, 731, 732, 733, 733, 734, 734, 735, 736, 736, 737, 738, 738, 739, 740, 740, 741, 742, 742, 743, 744, 744, 745, 745, 746, 747, 747, 748, 749, 749, 750, 751, 751, 752, 753, 753, 754, 754, 755, 756, 756, 757, 757, 758, 759, 759, 760, 761, 761, 762, 762, 763, 763, 764, 765, 765, 766, 766, 767, 768, 768, 769, 769, 770, 771, 771, 772, 772, 773, 774, 774, 775, 775, 776, 776, 777, 777, 778, 779, 779, 780, 780, 781, 782, 782, 783, 783, 784, 784, 785, 785, 786, 787, 787, 788, 788, 789, 789, 790, 791, 791, 792, 792, 793, 793, 794, 794, 795, 795, 796, 797, 797, 797, 798, 799, 799, 800, 800, 801, 801, 802, 802, 803, 803, 804, 805, 805, 806, 806, 806, 807, 808, 808, 809, 809, 810, 810, 811, 811, 812, 812, 813, 813, 814, 814, 815, 815, 816, 816, 817, 817, 818, 818, 819, 819, 820, 821, 821, 821, 822, 823, 823, 824, 824, 825, 825, 826, 826, 827, 827, 828, 828, 829, 829, 830, 830, 831, 831, 832, 832, 833, 833, 834, 834, 835, 835, 836, 836, 837, 837, 838, 838, 839, 839, 839, 840, 841, 841, 842, 842, 842, 843, 843, 844, 845, 845, 845, 846, 846, 847, 847, 848, 848, 849, 849, 850, 850, 851, 851, 852, 852, 853, 853, 854, 854, 855, 855, 856, 856, 857, 857, 858, 858, 859, 859, 860, 860, 861, 861, 862, 862, 863, 863, 864, 864, 865, 865, 866, 866, 867, 867, 868, 868, 868, 869, 870, 870, 870, 871, 871, 872, 872, 873, 873, 874, 874, 875, 875, 876, 876, 877, 877, 878, 878, 879, 879, 880, 880, 881, 881, 881, 882, 882, 883, 883, 884, 884, 885, 885, 886, 886, 887, 887, 887, 888, 888, 889, 889, 890, 890, 891, 891, 892, 892, 892, 893, 893, 894, 894, 895, 895, 896, 896, 896, 897, 897, 898, 898, 899, 899, 900, 900, 900, 901, 901, 902, 902, 903, 903, 903, 904, 904, 905, 905, 906, 906, 906, 907, 907, 908, 908, 909, 909, 910, 910, 910, 911, 911, 912, 912, 913, 913, 913, 914, 914, 915, 915, 916, 916, 916, 917, 917, 918, 918, 919, 919, 919, 920, 920, 921, 921, 922, 922, 922, 923, 923, 924, 924, 925, 925, 925, 926, 926, 927, 927, 928, 928, 928, 929, 929, 930, 930, 931, 931, 931, 932, 932, 933, 933, 934, 934, 934, 935, 935, 936, 936, 936, 937, 937, 938, 938, 939, 939, 939, 940, 940, 941, 941, 942, 942, 943, 943, 943, 944, 944, 945, 945, 946, 946, 947, 947, 947, 948, 948, 949, 949, 950, 950, 951, 951, 951, 952, 952, 953, 953, 954, 954, 955, 955, 956, 956, 956, 957, 957, 958, 958, 959, 959, 960, 960, 961, 961, 961, 962, 962, 963, 963, 964, 964, 964, 965, 965, 966, 966, 967, 967, 968, 968, 968, 969, 969, 970, 970, 971, 971, 971, 972, 972, 973, 973, 974, 974, 975, 975, 975, 976, 976, 977, 977, 977, 978, 978, 979, 979, 980, 980, 980, 981, 981, 982, 982, 983, 983, 983, 984, 984, 985, 985, 986, 986, 986, 987, 987, 988, 988, 988, 989, 989, 990, 990, 990, 991, 991, 992, 992, 993, 993, 994, 994, 994, 995, 995, 996, 996, 997, 997, 997, 998, 998, 999, 999, 999, 1000, 1000, 1001, 1001, 1002, 1002, 1002, 1003, 1003, 1004, 1004, 1004, 1005, 1005, 1006, 1006, 1007, 1007, 1007, 1008, 1008, 1009, 1009, 1010, 1010, 1010, 1011, 1011, 1012, 1012, 1013, 1013, 1013, 1014, 1014, 1015, 1015, 1015, 1016, 1016, 1017, 1017, 1018, 1018, 1018, 1019, 1019, 1020, 1020, 1021, 1021, 1021, 1022, 1022, 1023, 1023] + # 12-bit + gamma_lut_12: [0, 11, 21, 30, 37, 42, 46, 50, 53, 57, 61, 65, 70, 74, 78, 82, 86, 90, 94, 98, 102, 106, 110, 114, 118, 122, 126, 131, 135, 139, 143, 147, 151, 155, 159, 163, 167, 171, 175, 179, 183, 187, 191, 195, 199, 203, 207, 212, 216, 220, 224, 228, 232, 236, 240, 245, 249, 253, 257, 261, 265, 269, 273, 277, 281, 285, 289, 293, 297, 301, 305, 309, 313, 317, 321, 326, 330, 334, 338, 342, 346, 350, 354, 358, 362, 365, 369, 373, 377, 381, 385, 390, 394, 398, 401, 405, 409, 413, 417, 421, 425, 429, 432, 436, 440, 443, 447, 451, 455, 458, 462, 466, 470, 473, 477, 481, 485, 488, 492, 496, 500, 503, 507, 511, 515, 519, 522, 526, 530, 533, 537, 540, 544, 547, 551, 555, 559, 562, 566, 569, 573, 576, 580, 584, 588, 591, 595, 598, 602, 605, 609, 612, 616, 619, 622, 626, 630, 633, 637, 641, 645, 648, 652, 655, 659, 662, 665, 669, 673, 676, 680, 683, 687, 690, 693, 696, 700, 703, 707, 711, 715, 718, 721, 724, 728, 731, 734, 738, 742, 745, 749, 752, 756, 759, 762, 765, 769, 772, 775, 779, 783, 786, 789, 792, 796, 799, 802, 805, 809, 812, 815, 818, 822, 825, 828, 832, 836, 839, 842, 845, 849, 852, 855, 858, 862, 865, 868, 871, 875, 878, 881, 884, 888, 890, 893, 896, 900, 903, 906, 910, 914, 917, 920, 923, 926, 929, 932, 935, 939, 942, 945, 948, 952, 954, 957, 960, 964, 967, 970, 973, 977, 979, 982, 985, 989, 992, 995, 998, 1002, 1005, 1007, 1010, 1014, 1016, 1019, 1022, 1026, 1028, 1031, 1034, 1038, 1040, 1043, 1046, 1050, 1052, 1055, 1058, 1062, 1064, 1067, 1070, 1074, 1076, 1079, 1082, 1086, 1088, 1091, 1094, 1098, 1100, 1103, 1106, 1110, 1112, 1115, 1118, 1121, 1123, 1126, 1129, 1133, 1135, 1138, 1141, 1145, 1147, 1150, 1153, 1156, 1158, 1161, 1163, 1167, 1169, 1172, 1175, 1179, 1181, 1184, 1187, 1190, 1192, 1195, 1198, 1201, 1203, 1206, 1209, 1212, 1214, 1217, 1220, 1223, 1225, 1228, 1231, 1234, 1236, 1239, 1242, 1245, 1247, 1250, 1253, 1256, 1258, 1261, 1264, 1267, 1269, 1271, 1274, 1277, 1279, 1282, 1284, 1288, 1290, 1293, 1296, 1299, 1301, 1303, 1306, 1309, 1311, 1314, 1317, 1320, 1322, 1324, 1327, 1330, 1332, 1335, 1338, 1341, 1343, 1345, 1347, 1350, 1352, 1355, 1358, 1360, 1363, 1365, 1367, 1369, 1372, 1375, 1378, 1380, 1383, 1385, 1387, 1389, 1392, 1395, 1397, 1400, 1403, 1405, 1407, 1409, 1412, 1414, 1417, 1419, 1422, 1424, 1427, 1429, 1431, 1434, 1436, 1438, 1441, 1443, 1446, 1448, 1451, 1453, 1456, 1458, 1461, 1463, 1465, 1467, 1469, 1471, 1474, 1476, 1479, 1481, 1484, 1486, 1488, 1491, 1493, 1495, 1497, 1499, 1502, 1504, 1506, 1509, 1511, 1513, 1515, 1518, 1520, 1522, 1524, 1527, 1529, 1531, 1533, 1535, 1538, 1540, 1542, 1544, 1547, 1549, 1551, 1553, 1556, 1558, 1560, 1563, 1565, 1567, 1569, 1571, 1573, 1575, 1577, 1579, 1582, 1584, 1586, 1588, 1590, 1592, 1594, 1596, 1599, 1601, 1603, 1605, 1607, 1609, 1611, 1613, 1616, 1618, 1620, 1622, 1624, 1626, 1628, 1630, 1633, 1635, 1637, 1639, 1641, 1643, 1645, 1647, 1650, 1652, 1654, 1656, 1658, 1660, 1662, 1664, 1666, 1668, 1670, 1672, 1674, 1676, 1678, 1680, 1682, 1684, 1686, 1688, 1691, 1693, 1695, 1697, 1699, 1701, 1703, 1705, 1707, 1709, 1711, 1713, 1715, 1717, 1719, 1721, 1723, 1725, 1727, 1728, 1730, 1732, 1734, 1736, 1738, 1740, 1742, 1744, 1746, 1748, 1750, 1751, 1753, 1755, 1757, 1759, 1761, 1763, 1765, 1767, 1769, 1771, 1773, 1774, 1776, 1778, 1780, 1782, 1784, 1786, 1788, 1789, 1791, 1793, 1795, 1796, 1798, 1800, 1802, 1803, 1805, 1807, 1809, 1811, 1813, 1815, 1817, 1818, 1820, 1822, 1824, 1825, 1827, 1829, 1831, 1832, 1834, 1836, 1838, 1839, 1841, 1843, 1845, 1847, 1849, 1851, 1853, 1854, 1856, 1857, 1858, 1860, 1862, 1864, 1866, 1868, 1870, 1872, 1874, 1875, 1876, 1878, 1880, 1881, 1883, 1885, 1887, 1888, 1890, 1892, 1893, 1895, 1896, 1898, 1900, 1901, 1903, 1905, 1907, 1908, 1910, 1912, 1913, 1915, 1916, 1918, 1920, 1921, 1923, 1925, 1927, 1928, 1930, 1932, 1933, 1935, 1936, 1938, 1940, 1941, 1943, 1945, 1947, 1948, 1949, 1951, 1952, 1954, 1955, 1957, 1959, 1960, 1962, 1964, 1965, 1967, 1968, 1970, 1972, 1973, 1975, 1977, 1978, 1979, 1981, 1982, 1983, 1985, 1987, 1989, 1990, 1992, 1993, 1995, 1997, 1998, 2000, 2002, 2003, 2005, 2006, 2008, 2009, 2011, 2012, 2014, 2015, 2017, 2018, 2020, 2021, 2023, 2024, 2026, 2027, 2029, 2030, 2032, 2033, 2035, 2036, 2038, 2039, 2041, 2042, 2044, 2046, 2047, 2049, 2051, 2052, 2053, 2055, 2056, 2057, 2059, 2061, 2063, 2064, 2066, 2067, 2069, 2070, 2072, 2073, 2075, 2076, 2077, 2079, 2080, 2081, 2083, 2084, 2086, 2087, 2089, 2090, 2092, 2093, 2095, 2096, 2098, 2099, 2101, 2102, 2104, 2105, 2107, 2108, 2110, 2111, 2112, 2114, 2115, 2116, 2117, 2119, 2121, 2122, 2124, 2125, 2127, 2128, 2129, 2130, 2132, 2133, 2135, 2136, 2138, 2139, 2140, 2142, 2143, 2144, 2145, 2147, 2149, 2150, 2152, 2153, 2155, 2156, 2157, 2159, 2160, 2161, 2162, 2163, 2165, 2166, 2168, 2169, 2171, 2172, 2173, 2175, 2176, 2177, 2178, 2179, 2181, 2182, 2184, 2185, 2187, 2188, 2189, 2191, 2192, 2193, 2194, 2195, 2197, 2198, 2199, 2200, 2202, 2203, 2205, 2206, 2208, 2209, 2210, 2212, 2213, 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2222, 2223, 2225, 2226, 2228, 2229, 2230, 2232, 2233, 2234, 2235, 2237, 2238, 2239, 2240, 2241, 2242, 2243, 2244, 2245, 2247, 2248, 2249, 2250, 2252, 2253, 2255, 2256, 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274, 2276, 2277, 2278, 2279, 2281, 2282, 2283, 2284, 2286, 2287, 2288, 2289, 2291, 2292, 2293, 2295, 2296, 2297, 2297, 2299, 2300, 2301, 2302, 2303, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2314, 2315, 2316, 2318, 2319, 2320, 2320, 2322, 2323, 2324, 2325, 2326, 2328, 2329, 2330, 2332, 2333, 2334, 2334, 2336, 2337, 2338, 2339, 2340, 2342, 2343, 2343, 2345, 2346, 2347, 2348, 2349, 2351, 2352, 2353, 2354, 2355, 2356, 2356, 2358, 2359, 2360, 2361, 2362, 2364, 2365, 2365, 2367, 2368, 2369, 2370, 2371, 2373, 2374, 2374, 2376, 2377, 2378, 2379, 2380, 2382, 2383, 2383, 2385, 2386, 2387, 2388, 2389, 2391, 2392, 2393, 2394, 2395, 2396, 2396, 2398, 2399, 2400, 2401, 2402, 2404, 2405, 2406, 2407, 2408, 2409, 2409, 2411, 2412, 2413, 2414, 2415, 2417, 2418, 2419, 2420, 2421, 2422, 2422, 2424, 2425, 2426, 2426, 2428, 2429, 2430, 2430, 2432, 2433, 2434, 2434, 2436, 2437, 2438, 2439, 2440, 2442, 2443, 2444, 2445, 2446, 2447, 2447, 2449, 2450, 2451, 2451, 2453, 2454, 2455, 2455, 2457, 2458, 2459, 2459, 2461, 2462, 2463, 2463, 2465, 2466, 2467, 2468, 2469, 2470, 2470, 2471, 2472, 2473, 2473, 2474, 2476, 2477, 2478, 2478, 2480, 2481, 2482, 2482, 2484, 2485, 2486, 2486, 2488, 2489, 2490, 2490, 2492, 2493, 2494, 2494, 2496, 2497, 2498, 2498, 2500, 2501, 2502, 2502, 2504, 2505, 2505, 2506, 2507, 2508, 2509, 2509, 2511, 2512, 2512, 2513, 2514, 2515, 2515, 2516, 2517, 2519, 2520, 2520, 2522, 2523, 2524, 2524, 2526, 2527, 2528, 2528, 2530, 2531, 2531, 2532, 2533, 2534, 2535, 2535, 2537, 2538, 2538, 2539, 2540, 2541, 2542, 2542, 2544, 2545, 2545, 2546, 2547, 2548, 2548, 2549, 2550, 2552, 2553, 2553, 2555, 2556, 2556, 2557, 2558, 2559, 2560, 2560, 2562, 2563, 2563, 2564, 2565, 2566, 2566, 2567, 2568, 2570, 2571, 2571, 2573, 2574, 2574, 2575, 2576, 2577, 2577, 2578, 2580, 2581, 2581, 2582, 2583, 2584, 2584, 2585, 2586, 2587, 2587, 2588, 2589, 2591, 2592, 2592, 2594, 2595, 2595, 2596, 2597, 2598, 2598, 2599, 2600, 2601, 2602, 2602, 2604, 2605, 2605, 2606, 2607, 2608, 2608, 2609, 2610, 2612, 2613, 2613, 2615, 2616, 2616, 2617, 2618, 2619, 2619, 2620, 2621, 2622, 2622, 2623, 2624, 2625, 2625, 2626, 2627, 2629, 2630, 2630, 2632, 2633, 2633, 2634, 2635, 2636, 2636, 2637, 2638, 2639, 2639, 2640, 2641, 2642, 2642, 2643, 2645, 2646, 2646, 2647, 2648, 2649, 2649, 2650, 2651, 2653, 2653, 2654, 2655, 2656, 2656, 2657, 2658, 2659, 2659, 2660, 2661, 2662, 2662, 2663, 2665, 2666, 2666, 2667, 2668, 2669, 2669, 2670, 2671, 2672, 2672, 2673, 2674, 2675, 2675, 2676, 2677, 2679, 2679, 2680, 2681, 2682, 2682, 2683, 2684, 2685, 2685, 2686, 2687, 2688, 2688, 2689, 2690, 2691, 2691, 2692, 2693, 2695, 2695, 2696, 2697, 2698, 2698, 2699, 2700, 2701, 2701, 2702, 2703, 2704, 2704, 2705, 2706, 2707, 2707, 2708, 2709, 2711, 2711, 2712, 2713, 2714, 2714, 2714, 2715, 2716, 2716, 2717, 2718, 2720, 2720, 2721, 2722, 2723, 2723, 2724, 2725, 2726, 2726, 2727, 2728, 2729, 2729, 2730, 2731, 2732, 2732, 2733, 2734, 2735, 2735, 2736, 2737, 2738, 2738, 2739, 2740, 2741, 2741, 2742, 2743, 2744, 2744, 2745, 2746, 2747, 2747, 2748, 2749, 2750, 2750, 2751, 2752, 2753, 2753, 2754, 2755, 2756, 2756, 2757, 2758, 2759, 2759, 2760, 2761, 2762, 2762, 2763, 2764, 2765, 2765, 2766, 2767, 2768, 2768, 2769, 2770, 2771, 2771, 2772, 2773, 2774, 2774, 2775, 2776, 2777, 2777, 2778, 2779, 2780, 2780, 2780, 2781, 2782, 2782, 2782, 2783, 2785, 2785, 2786, 2788, 2789, 2789, 2789, 2790, 2791, 2791, 2792, 2793, 2794, 2794, 2795, 2796, 2797, 2797, 2798, 2799, 2800, 2800, 2801, 2802, 2803, 2803, 2804, 2805, 2806, 2806, 2807, 2808, 2809, 2809, 2810, 2811, 2812, 2812, 2812, 2813, 2814, 2814, 2814, 2815, 2817, 2817, 2818, 2820, 2821, 2821, 2821, 2822, 2823, 2823, 2824, 2825, 2826, 2826, 2827, 2828, 2829, 2829, 2830, 2831, 2832, 2832, 2833, 2834, 2835, 2835, 2835, 2836, 2837, 2837, 2838, 2839, 2841, 2841, 2841, 2842, 2843, 2843, 2843, 2845, 2846, 2846, 2847, 2848, 2849, 2849, 2850, 2851, 2852, 2852, 2853, 2854, 2855, 2855, 2855, 2856, 2857, 2857, 2858, 2859, 2860, 2860, 2861, 2862, 2863, 2863, 2864, 2865, 2866, 2866, 2866, 2867, 2868, 2868, 2869, 2870, 2871, 2871, 2872, 2873, 2874, 2874, 2875, 2876, 2877, 2877, 2877, 2878, 2879, 2879, 2880, 2881, 2883, 2883, 2883, 2884, 2885, 2885, 2885, 2887, 2888, 2888, 2889, 2890, 2891, 2891, 2892, 2893, 2894, 2894, 2894, 2895, 2896, 2896, 2897, 2898, 2899, 2899, 2900, 2901, 2902, 2902, 2903, 2904, 2905, 2905, 2905, 2906, 2907, 2907, 2907, 2908, 2910, 2910, 2911, 2912, 2913, 2913, 2913, 2914, 2915, 2915, 2915, 2917, 2918, 2918, 2919, 2920, 2921, 2921, 2922, 2923, 2924, 2924, 2924, 2925, 2926, 2926, 2926, 2927, 2928, 2928, 2929, 2930, 2932, 2932, 2932, 2933, 2934, 2934, 2934, 2935, 2936, 2936, 2937, 2938, 2939, 2939, 2940, 2941, 2942, 2942, 2943, 2944, 2945, 2945, 2945, 2946, 2947, 2947, 2947, 2948, 2950, 2950, 2951, 2952, 2953, 2953, 2953, 2954, 2955, 2955, 2956, 2957, 2958, 2958, 2958, 2959, 2960, 2960, 2961, 2962, 2963, 2963, 2963, 2964, 2965, 2965, 2965, 2966, 2968, 2968, 2969, 2970, 2971, 2971, 2971, 2972, 2973, 2973, 2973, 2974, 2976, 2976, 2977, 2978, 2979, 2979, 2979, 2980, 2981, 2981, 2981, 2982, 2983, 2983, 2983, 2984, 2986, 2986, 2987, 2988, 2989, 2989, 2989, 2990, 2991, 2991, 2992, 2993, 2994, 2994, 2994, 2995, 2996, 2996, 2997, 2998, 2999, 2999, 2999, 3000, 3001, 3001, 3002, 3003, 3004, 3004, 3004, 3005, 3006, 3006, 3006, 3007, 3009, 3009, 3010, 3011, 3012, 3012, 3012, 3013, 3014, 3014, 3014, 3015, 3016, 3016, 3017, 3018, 3019, 3019, 3019, 3020, 3021, 3021, 3022, 3023, 3024, 3024, 3024, 3025, 3026, 3026, 3027, 3028, 3029, 3029, 3029, 3030, 3031, 3031, 3031, 3033, 3034, 3034, 3034, 3035, 3036, 3036, 3036, 3037, 3038, 3038, 3038, 3039, 3041, 3041, 3042, 3043, 3044, 3044, 3044, 3045, 3046, 3046, 3046, 3047, 3048, 3048, 3049, 3050, 3051, 3051, 3051, 3052, 3053, 3053, 3053, 3054, 3055, 3055, 3056, 3057, 3058, 3058, 3058, 3059, 3060, 3060, 3060, 3061, 3062, 3062, 3063, 3064, 3065, 3065, 3065, 3066, 3067, 3067, 3067, 3068, 3069, 3069, 3070, 3071, 3072, 3072, 3072, 3073, 3074, 3074, 3074, 3076, 3077, 3077, 3077, 3078, 3079, 3079, 3079, 3080, 3082, 3082, 3082, 3083, 3084, 3084, 3084, 3085, 3086, 3086, 3086, 3088, 3089, 3089, 3089, 3090, 3091, 3091, 3091, 3092, 3093, 3093, 3093, 3095, 3096, 3096, 3096, 3097, 3098, 3098, 3098, 3099, 3100, 3100, 3100, 3102, 3103, 3103, 3103, 3104, 3105, 3105, 3105, 3106, 3107, 3107, 3107, 3108, 3109, 3109, 3109, 3110, 3111, 3111, 3111, 3112, 3114, 3114, 3114, 3115, 3116, 3116, 3116, 3117, 3118, 3118, 3118, 3119, 3121, 3121, 3121, 3122, 3123, 3123, 3123, 3124, 3125, 3125, 3125, 3126, 3128, 3128, 3128, 3129, 3130, 3130, 3130, 3131, 3132, 3132, 3132, 3133, 3134, 3134, 3134, 3135, 3137, 3137, 3137, 3138, 3139, 3139, 3139, 3140, 3141, 3141, 3141, 3142, 3143, 3143, 3143, 3144, 3145, 3145, 3145, 3146, 3148, 3148, 3148, 3149, 3150, 3150, 3150, 3151, 3152, 3152, 3152, 3153, 3155, 3155, 3155, 3156, 3157, 3157, 3157, 3158, 3159, 3159, 3159, 3160, 3161, 3161, 3162, 3163, 3164, 3163, 3163, 3164, 3165, 3165, 3165, 3166, 3168, 3168, 3168, 3169, 3170, 3170, 3170, 3171, 3172, 3172, 3172, 3173, 3175, 3175, 3175, 3176, 3177, 3177, 3177, 3178, 3179, 3179, 3179, 3180, 3181, 3181, 3181, 3182, 3183, 3183, 3183, 3184, 3185, 3185, 3185, 3186, 3188, 3188, 3188, 3189, 3190, 3189, 3189, 3190, 3191, 3191, 3191, 3192, 3194, 3194, 3194, 3195, 3196, 3196, 3196, 3197, 3198, 3198, 3199, 3200, 3201, 3201, 3201, 3201, 3202, 3201, 3202, 3202, 3204, 3204, 3204, 3205, 3207, 3207, 3207, 3208, 3209, 3209, 3209, 3210, 3211, 3211, 3211, 3212, 3213, 3213, 3213, 3214, 3215, 3215, 3215, 3216, 3217, 3217, 3218, 3219, 3220, 3219, 3219, 3220, 3221, 3221, 3221, 3222, 3224, 3224, 3224, 3225, 3226, 3225, 3225, 3226, 3227, 3227, 3227, 3228, 3230, 3230, 3230, 3231, 3232, 3232, 3232, 3233, 3234, 3234, 3234, 3235, 3236, 3236, 3236, 3237, 3238, 3238, 3238, 3239, 3240, 3240, 3240, 3242, 3243, 3243, 3243, 3243, 3244, 3243, 3244, 3244, 3246, 3246, 3247, 3248, 3249, 3248, 3248, 3249, 3250, 3250, 3250, 3251, 3253, 3253, 3253, 3254, 3255, 3255, 3255, 3256, 3257, 3257, 3257, 3258, 3259, 3259, 3259, 3260, 3261, 3261, 3261, 3262, 3263, 3263, 3263, 3264, 3265, 3265, 3265, 3266, 3267, 3267, 3267, 3268, 3269, 3269, 3269, 3270, 3271, 3271, 3271, 3272, 3273, 3273, 3273, 3274, 3275, 3275, 3275, 3276, 3278, 3278, 3278, 3278, 3279, 3278, 3279, 3279, 3281, 3281, 3281, 3282, 3284, 3284, 3284, 3285, 3286, 3285, 3285, 3286, 3287, 3287, 3287, 3288, 3290, 3290, 3290, 3291, 3292, 3291, 3291, 3292, 3293, 3293, 3293, 3294, 3296, 3296, 3296, 3297, 3298, 3298, 3298, 3299, 3300, 3300, 3300, 3301, 3302, 3302, 3302, 3303, 3304, 3304, 3304, 3305, 3306, 3306, 3306, 3307, 3308, 3308, 3308, 3309, 3310, 3310, 3310, 3311, 3312, 3312, 3312, 3313, 3314, 3314, 3314, 3315, 3316, 3316, 3316, 3317, 3318, 3318, 3318, 3319, 3320, 3320, 3320, 3321, 3322, 3322, 3322, 3323, 3324, 3324, 3324, 3325, 3326, 3326, 3326, 3327, 3328, 3328, 3328, 3329, 3330, 3330, 3330, 3331, 3332, 3332, 3332, 3333, 3334, 3334, 3334, 3335, 3336, 3336, 3336, 3337, 3338, 3338, 3338, 3339, 3340, 3340, 3340, 3341, 3342, 3342, 3342, 3343, 3344, 3344, 3344, 3345, 3346, 3346, 3346, 3347, 3348, 3348, 3348, 3349, 3350, 3350, 3350, 3351, 3352, 3352, 3352, 3353, 3354, 3354, 3354, 3355, 3356, 3356, 3356, 3357, 3358, 3357, 3357, 3358, 3359, 3359, 3359, 3360, 3362, 3362, 3362, 3363, 3364, 3363, 3363, 3364, 3365, 3365, 3365, 3366, 3368, 3368, 3368, 3369, 3370, 3369, 3369, 3370, 3371, 3371, 3371, 3372, 3374, 3373, 3373, 3374, 3375, 3374, 3375, 3375, 3377, 3377, 3377, 3378, 3380, 3379, 3379, 3380, 3381, 3380, 3381, 3381, 3383, 3383, 3383, 3384, 3385, 3385, 3385, 3386, 3387, 3387, 3387, 3388, 3389, 3389, 3389, 3390, 3391, 3391, 3391, 3392, 3393, 3393, 3393, 3394, 3395, 3395, 3395, 3396, 3397, 3397, 3397, 3398, 3399, 3399, 3399, 3400, 3401, 3401, 3401, 3402, 3403, 3403, 3403, 3404, 3405, 3405, 3405, 3406, 3407, 3406, 3406, 3407, 3408, 3408, 3408, 3409, 3411, 3411, 3411, 3412, 3413, 3412, 3412, 3413, 3414, 3414, 3414, 3415, 3417, 3417, 3417, 3418, 3419, 3418, 3418, 3419, 3420, 3419, 3420, 3420, 3422, 3422, 3422, 3423, 3425, 3424, 3424, 3425, 3426, 3425, 3425, 3426, 3428, 3428, 3428, 3429, 3431, 3430, 3430, 3431, 3432, 3431, 3432, 3432, 3434, 3434, 3434, 3435, 3436, 3436, 3436, 3437, 3438, 3438, 3438, 3439, 3440, 3440, 3440, 3441, 3442, 3442, 3442, 3443, 3444, 3444, 3444, 3445, 3446, 3446, 3446, 3447, 3448, 3448, 3448, 3449, 3450, 3450, 3450, 3451, 3452, 3452, 3452, 3453, 3454, 3454, 3454, 3455, 3456, 3456, 3456, 3457, 3458, 3458, 3458, 3459, 3460, 3460, 3460, 3461, 3462, 3462, 3462, 3463, 3464, 3463, 3464, 3464, 3466, 3466, 3466, 3467, 3468, 3467, 3467, 3468, 3469, 3469, 3469, 3470, 3472, 3472, 3472, 3473, 3474, 3473, 3473, 3474, 3475, 3474, 3474, 3475, 3477, 3477, 3477, 3478, 3480, 3479, 3479, 3480, 3481, 3480, 3481, 3481, 3483, 3483, 3483, 3484, 3485, 3485, 3485, 3486, 3487, 3487, 3487, 3488, 3489, 3489, 3489, 3490, 3491, 3491, 3491, 3492, 3493, 3492, 3493, 3493, 3495, 3495, 3495, 3496, 3497, 3496, 3496, 3497, 3498, 3498, 3498, 3499, 3501, 3501, 3501, 3502, 3503, 3502, 3502, 3503, 3504, 3503, 3503, 3504, 3506, 3506, 3506, 3507, 3509, 3508, 3508, 3509, 3510, 3509, 3510, 3510, 3512, 3512, 3512, 3513, 3514, 3513, 3514, 3514, 3516, 3515, 3516, 3516, 3518, 3517, 3518, 3518, 3520, 3519, 3520, 3520, 3522, 3522, 3522, 3523, 3524, 3523, 3523, 3524, 3525, 3524, 3524, 3525, 3527, 3527, 3527, 3528, 3530, 3529, 3529, 3530, 3531, 3530, 3531, 3531, 3533, 3532, 3533, 3533, 3535, 3535, 3535, 3536, 3537, 3536, 3536, 3537, 3538, 3537, 3537, 3538, 3540, 3540, 3540, 3541, 3543, 3542, 3542, 3543, 3544, 3543, 3544, 3544, 3546, 3545, 3546, 3546, 3548, 3548, 3548, 3549, 3550, 3549, 3549, 3550, 3551, 3550, 3551, 3551, 3553, 3552, 3553, 3553, 3555, 3554, 3555, 3555, 3557, 3556, 3557, 3557, 3559, 3559, 3559, 3560, 3561, 3560, 3560, 3561, 3562, 3561, 3562, 3562, 3564, 3563, 3564, 3564, 3566, 3566, 3566, 3567, 3568, 3567, 3567, 3568, 3569, 3568, 3569, 3569, 3571, 3570, 3571, 3571, 3573, 3572, 3573, 3573, 3575, 3574, 3575, 3575, 3577, 3577, 3577, 3578, 3579, 3578, 3578, 3579, 3580, 3579, 3580, 3580, 3582, 3581, 3582, 3582, 3584, 3584, 3584, 3585, 3586, 3585, 3585, 3586, 3587, 3586, 3587, 3587, 3589, 3588, 3589, 3589, 3591, 3590, 3591, 3591, 3593, 3593, 3593, 3594, 3595, 3594, 3594, 3595, 3596, 3595, 3596, 3596, 3598, 3597, 3598, 3598, 3600, 3600, 3600, 3601, 3602, 3601, 3601, 3602, 3603, 3602, 3603, 3603, 3605, 3604, 3605, 3605, 3607, 3606, 3607, 3608, 3609, 3608, 3608, 3609, 3610, 3609, 3610, 3610, 3612, 3612, 3612, 3613, 3614, 3613, 3613, 3614, 3615, 3614, 3615, 3615, 3617, 3616, 3617, 3617, 3619, 3619, 3619, 3620, 3621, 3620, 3620, 3621, 3622, 3622, 3622, 3623, 3625, 3624, 3624, 3625, 3626, 3625, 3625, 3625, 3627, 3627, 3627, 3628, 3630, 3629, 3629, 3630, 3631, 3630, 3630, 3631, 3633, 3632, 3633, 3633, 3635, 3634, 3635, 3636, 3637, 3636, 3636, 3637, 3638, 3637, 3637, 3638, 3640, 3640, 3640, 3641, 3642, 3641, 3641, 3642, 3643, 3642, 3643, 3643, 3645, 3644, 3645, 3645, 3647, 3646, 3647, 3648, 3649, 3648, 3648, 3649, 3650, 3649, 3649, 3650, 3652, 3652, 3652, 3653, 3654, 3653, 3653, 3654, 3655, 3654, 3655, 3655, 3657, 3656, 3657, 3657, 3659, 3658, 3659, 3659, 3661, 3660, 3660, 3661, 3662, 3661, 3661, 3662, 3664, 3663, 3664, 3665, 3666, 3665, 3665, 3666, 3667, 3666, 3667, 3667, 3669, 3668, 3669, 3669, 3671, 3670, 3671, 3671, 3673, 3672, 3672, 3673, 3674, 3673, 3673, 3674, 3676, 3675, 3676, 3677, 3678, 3677, 3677, 3678, 3679, 3678, 3678, 3679, 3681, 3680, 3681, 3682, 3683, 3682, 3682, 3683, 3684, 3683, 3683, 3684, 3686, 3685, 3686, 3686, 3688, 3687, 3688, 3688, 3690, 3689, 3689, 3690, 3691, 3690, 3690, 3691, 3693, 3692, 3693, 3694, 3695, 3694, 3694, 3695, 3696, 3695, 3695, 3696, 3698, 3697, 3698, 3699, 3700, 3699, 3699, 3700, 3701, 3700, 3700, 3701, 3703, 3702, 3703, 3703, 3705, 3704, 3705, 3705, 3707, 3706, 3706, 3707, 3708, 3707, 3707, 3708, 3710, 3709, 3710, 3710, 3712, 3711, 3711, 3712, 3713, 3712, 3712, 3713, 3715, 3714, 3715, 3715, 3717, 3716, 3716, 3717, 3718, 3717, 3717, 3718, 3720, 3719, 3720, 3720, 3722, 3721, 3722, 3722, 3724, 3723, 3723, 3724, 3725, 3724, 3724, 3724, 3726, 3726, 3726, 3727, 3729, 3728, 3728, 3729, 3730, 3729, 3730, 3730, 3732, 3731, 3731, 3731, 3733, 3733, 3733, 3734, 3736, 3735, 3735, 3736, 3737, 3736, 3736, 3736, 3738, 3737, 3737, 3738, 3740, 3739, 3740, 3740, 3742, 3741, 3742, 3742, 3744, 3743, 3743, 3744, 3745, 3744, 3744, 3745, 3747, 3746, 3747, 3747, 3749, 3748, 3749, 3749, 3751, 3750, 3750, 3751, 3752, 3751, 3751, 3752, 3754, 3753, 3754, 3754, 3756, 3755, 3756, 3756, 3758, 3757, 3757, 3758, 3759, 3758, 3758, 3759, 3761, 3760, 3761, 3761, 3763, 3762, 3763, 3763, 3765, 3764, 3764, 3765, 3766, 3765, 3765, 3766, 3768, 3767, 3768, 3768, 3770, 3769, 3770, 3770, 3772, 3771, 3771, 3772, 3773, 3772, 3772, 3773, 3775, 3774, 3775, 3775, 3777, 3776, 3777, 3777, 3779, 3778, 3778, 3779, 3780, 3779, 3779, 3780, 3782, 3781, 3782, 3782, 3784, 3783, 3783, 3784, 3786, 3785, 3786, 3786, 3788, 3787, 3787, 3788, 3789, 3788, 3788, 3789, 3791, 3790, 3791, 3791, 3793, 3792, 3792, 3793, 3795, 3794, 3795, 3795, 3797, 3796, 3796, 3797, 3798, 3797, 3797, 3798, 3800, 3799, 3800, 3800, 3802, 3801, 3801, 3802, 3804, 3803, 3804, 3804, 3806, 3805, 3805, 3806, 3807, 3806, 3806, 3807, 3809, 3808, 3809, 3809, 3811, 3810, 3810, 3811, 3813, 3812, 3813, 3813, 3815, 3814, 3814, 3815, 3816, 3815, 3815, 3816, 3818, 3817, 3818, 3818, 3820, 3819, 3820, 3820, 3822, 3821, 3821, 3822, 3824, 3823, 3824, 3824, 3826, 3825, 3825, 3826, 3827, 3826, 3826, 3827, 3829, 3828, 3829, 3829, 3831, 3830, 3830, 3831, 3833, 3832, 3833, 3833, 3835, 3834, 3834, 3835, 3836, 3835, 3835, 3836, 3838, 3837, 3838, 3838, 3840, 3839, 3839, 3840, 3842, 3841, 3842, 3842, 3844, 3843, 3843, 3844, 3845, 3844, 3844, 3845, 3847, 3846, 3847, 3847, 3849, 3848, 3848, 3849, 3850, 3849, 3849, 3850, 3852, 3851, 3852, 3852, 3854, 3853, 3853, 3854, 3856, 3855, 3856, 3856, 3858, 3857, 3857, 3858, 3859, 3858, 3858, 3859, 3861, 3860, 3861, 3861, 3863, 3862, 3862, 3863, 3865, 3864, 3865, 3865, 3867, 3866, 3866, 3867, 3868, 3867, 3867, 3868, 3870, 3869, 3869, 3870, 3872, 3871, 3872, 3872, 3874, 3873, 3873, 3874, 3875, 3874, 3874, 3875, 3877, 3876, 3877, 3877, 3879, 3878, 3878, 3879, 3881, 3880, 3881, 3881, 3883, 3882, 3882, 3882, 3884, 3883, 3883, 3884, 3886, 3885, 3885, 3886, 3887, 3886, 3886, 3887, 3889, 3888, 3888, 3889, 3891, 3890, 3891, 3891, 3893, 3892, 3892, 3892, 3894, 3893, 3893, 3894, 3896, 3895, 3895, 3896, 3898, 3897, 3898, 3898, 3900, 3899, 3899, 3899, 3901, 3900, 3900, 3901, 3903, 3902, 3902, 3903, 3904, 3903, 3903, 3904, 3906, 3905, 3905, 3906, 3908, 3907, 3908, 3908, 3910, 3909, 3909, 3909, 3911, 3910, 3910, 3911, 3913, 3912, 3912, 3913, 3915, 3914, 3915, 3915, 3917, 3916, 3916, 3916, 3918, 3917, 3917, 3918, 3920, 3919, 3919, 3920, 3921, 3920, 3920, 3921, 3923, 3922, 3922, 3923, 3925, 3924, 3925, 3925, 3927, 3926, 3926, 3926, 3928, 3927, 3927, 3928, 3930, 3929, 3929, 3930, 3932, 3931, 3932, 3932, 3934, 3933, 3933, 3933, 3935, 3934, 3934, 3935, 3937, 3936, 3936, 3936, 3938, 3937, 3937, 3938, 3940, 3939, 3939, 3940, 3942, 3941, 3942, 3942, 3944, 3943, 3943, 3943, 3945, 3944, 3944, 3945, 3947, 3946, 3946, 3947, 3949, 3948, 3949, 3949, 3951, 3950, 3950, 3950, 3952, 3951, 3951, 3952, 3954, 3953, 3953, 3953, 3955, 3954, 3954, 3955, 3957, 3956, 3957, 3957, 3959, 3958, 3958, 3958, 3960, 3959, 3959, 3960, 3962, 3961, 3961, 3961, 3963, 3962, 3962, 3963, 3965, 3964, 3964, 3965, 3967, 3966, 3967, 3967, 3969, 3968, 3968, 3968, 3970, 3969, 3969, 3970, 3972, 3971, 3971, 3972, 3974, 3973, 3974, 3974, 3976, 3975, 3975, 3975, 3977, 3976, 3976, 3977, 3979, 3978, 3978, 3978, 3980, 3979, 3979, 3980, 3982, 3981, 3981, 3982, 3984, 3983, 3983, 3984, 3986, 3985, 3986, 3986, 3988, 3987, 3987, 3987, 3989, 3988, 3988, 3989, 3991, 3990, 3990, 3990, 3992, 3991, 3991, 3992, 3994, 3993, 3993, 3994, 3996, 3995, 3995, 3996, 3998, 3997, 3997, 3997, 3999, 3998, 3998, 3999, 4001, 4000, 4000, 4001, 4003, 4002, 4002, 4003, 4005, 4004, 4004, 4004, 4006, 4005, 4005, 4006, 4008, 4007, 4007, 4007, 4009, 4008, 4008, 4009, 4011, 4010, 4010, 4011, 4013, 4012, 4012, 4013, 4015, 4014, 4014, 4014, 4016, 4015, 4015, 4016, 4018, 4017, 4017, 4017, 4019, 4018, 4018, 4019, 4021, 4020, 4020, 4021, 4023, 4022, 4022, 4023, 4025, 4024, 4024, 4025, 4027, 4026, 4026, 4026, 4028, 4027, 4027, 4028, 4030, 4029, 4029, 4029, 4031, 4030, 4030, 4031, 4033, 4032, 4032, 4033, 4035, 4034, 4034, 4035, 4037, 4036, 4036, 4036, 4038, 4037, 4037, 4038, 4040, 4039, 4039, 4039, 4041, 4040, 4040, 4041, 4043, 4042, 4042, 4043, 4045, 4044, 4044, 4045, 4047, 4046, 4046, 4047, 4049, 4048, 4048, 4048, 4050, 4049, 4049, 4050, 4052, 4051, 4051, 4051, 4053, 4052, 4052, 4053, 4055, 4054, 4054, 4055, 4057, 4056, 4056, 4057, 4059, 4058, 4058, 4058, 4060, 4059, 4059, 4060, 4062, 4061, 4061, 4061, 4062, 4062, 4062, 4063, 4064, 4064, 4064, 4065, 4066, 4066, 4066, 4067, 4068, 4068, 4068, 4069, 4070, 4070, 4070, 4070, 4071, 4071, 4071, 4072, 4073, 4073, 4073, 4073, 4074, 4074, 4074, 4075, 4076, 4076, 4076, 4077, 4078, 4078, 4078, 4079, 4080, 4080, 4080, 4080, 4081, 4081, 4081, 4082, 4083, 4083, 4083, 4083, 4084, 4084, 4084, 4085, 4086, 4086, 4086, 4087, 4088, 4088, 4088, 4089, 4090, 4090, 4091, 4092, 4093, 4093, 4094, 4095] + # 14-bit + gamma_lut_14: [0, 11, 22, 32, 43, 53, 64, 74, 83, 93, 102, 110, 119, 127, 134, 141, 148, 154, 160, 165, 170, 174, 178, 182, 186, 190, 193, 196, 199, 202, 205, 209, 212, 215, 219, 223, 227, 231, 235, 239, 244, 248, 252, 257, 262, 266, 271, 275, 280, 284, 288, 293, 297, 301, 305, 309, 313, 317, 321, 325, 329, 332, 336, 340, 344, 348, 352, 356, 360, 364, 368, 372, 376, 380, 384, 388, 392, 396, 400, 404, 408, 412, 416, 420, 424, 427, 431, 435, 439, 443, 447, 451, 455, 459, 464, 468, 472, 476, 480, 484, 489, 493, 497, 501, 506, 510, 514, 519, 523, 527, 531, 536, 540, 544, 548, 552, 556, 560, 564, 568, 572, 576, 580, 584, 588, 592, 596, 600, 604, 608, 612, 616, 620, 623, 627, 631, 636, 639, 643, 647, 652, 656, 660, 664, 668, 672, 676, 680, 684, 688, 692, 696, 700, 704, 708, 712, 716, 720, 724, 728, 732, 736, 739, 743, 747, 751, 755, 759, 763, 767, 771, 775, 779, 783, 787, 792, 796, 800, 804, 808, 813, 817, 821, 825, 830, 834, 838, 842, 847, 851, 855, 860, 864, 868, 872, 876, 880, 884, 887, 891, 896, 899, 903, 907, 912, 915, 919, 924, 928, 932, 936, 940, 944, 948, 953, 957, 961, 966, 970, 974, 979, 983, 987, 991, 996, 1000, 1004, 1008, 1012, 1016, 1020, 1024, 1028, 1032, 1036, 1040, 1044, 1048, 1052, 1056, 1060, 1064, 1067, 1071, 1075, 1079, 1083, 1087, 1091, 1095, 1099, 1103, 1107, 1111, 1115, 1120, 1124, 1128, 1131, 1135, 1140, 1143, 1147, 1151, 1156, 1159, 1163, 1167, 1172, 1175, 1179, 1184, 1188, 1191, 1195, 1199, 1203, 1207, 1211, 1215, 1219, 1223, 1227, 1231, 1235, 1239, 1243, 1247, 1252, 1256, 1260, 1264, 1268, 1272, 1277, 1281, 1285, 1289, 1294, 1298, 1303, 1307, 1311, 1315, 1320, 1324, 1327, 1332, 1336, 1339, 1343, 1347, 1352, 1355, 1359, 1363, 1368, 1371, 1375, 1379, 1384, 1387, 1391, 1395, 1400, 1403, 1407, 1411, 1416, 1420, 1423, 1428, 1432, 1436, 1440, 1444, 1448, 1451, 1455, 1458, 1462, 1465, 1469, 1473, 1477, 1480, 1484, 1488, 1492, 1495, 1499, 1503, 1508, 1511, 1515, 1520, 1524, 1528, 1532, 1537, 1541, 1545, 1549, 1554, 1559, 1563, 1567, 1571, 1576, 1579, 1583, 1587, 1591, 1594, 1598, 1602, 1606, 1609, 1613, 1616, 1621, 1624, 1628, 1632, 1636, 1639, 1643, 1647, 1651, 1655, 1658, 1663, 1667, 1671, 1675, 1679, 1683, 1687, 1691, 1695, 1700, 1703, 1707, 1711, 1715, 1718, 1722, 1726, 1730, 1733, 1737, 1741, 1745, 1748, 1752, 1756, 1760, 1763, 1766, 1770, 1774, 1778, 1781, 1785, 1789, 1792, 1796, 1800, 1804, 1808, 1811, 1815, 1820, 1823, 1827, 1830, 1834, 1838, 1841, 1845, 1849, 1853, 1856, 1860, 1864, 1868, 1871, 1875, 1880, 1883, 1886, 1890, 1894, 1898, 1901, 1905, 1909, 1912, 1916, 1920, 1924, 1928, 1931, 1935, 1940, 1943, 1946, 1950, 1954, 1958, 1961, 1965, 1969, 1972, 1976, 1980, 1984, 1988, 1991, 1995, 2000, 2003, 2006, 2010, 2014, 2017, 2021, 2025, 2029, 2032, 2036, 2040, 2044, 2048, 2051, 2055, 2060, 2063, 2067, 2070, 2074, 2078, 2081, 2085, 2089, 2093, 2096, 2100, 2105, 2108, 2112, 2116, 2120, 2123, 2126, 2129, 2133, 2136, 2139, 2143, 2147, 2150, 2153, 2157, 2161, 2164, 2168, 2171, 2176, 2179, 2182, 2186, 2190, 2193, 2197, 2201, 2205, 2208, 2212, 2216, 2220, 2224, 2227, 2231, 2236, 2239, 2242, 2245, 2249, 2252, 2255, 2259, 2263, 2266, 2269, 2273, 2277, 2280, 2284, 2287, 2292, 2295, 2298, 2302, 2306, 2309, 2313, 2317, 2321, 2324, 2328, 2332, 2336, 2340, 2343, 2347, 2352, 2355, 2358, 2362, 2365, 2368, 2372, 2375, 2379, 2382, 2386, 2389, 2393, 2396, 2400, 2404, 2408, 2410, 2414, 2417, 2421, 2424, 2427, 2431, 2435, 2438, 2441, 2445, 2449, 2452, 2456, 2460, 2464, 2466, 2470, 2473, 2477, 2480, 2483, 2486, 2490, 2493, 2497, 2501, 2505, 2508, 2511, 2515, 2520, 2523, 2526, 2530, 2534, 2537, 2541, 2545, 2549, 2552, 2556, 2560, 2564, 2568, 2571, 2575, 2580, 2583, 2586, 2589, 2593, 2596, 2600, 2603, 2607, 2610, 2613, 2617, 2621, 2624, 2628, 2631, 2636, 2638, 2641, 2645, 2649, 2652, 2655, 2658, 2662, 2665, 2669, 2673, 2677, 2680, 2683, 2687, 2691, 2694, 2698, 2701, 2705, 2708, 2712, 2715, 2719, 2722, 2726, 2729, 2733, 2737, 2740, 2744, 2747, 2750, 2753, 2756, 2760, 2762, 2765, 2768, 2772, 2775, 2778, 2781, 2785, 2788, 2792, 2795, 2799, 2802, 2806, 2810, 2814, 2817, 2820, 2824, 2829, 2832, 2836, 2840, 2844, 2847, 2851, 2855, 2859, 2862, 2865, 2869, 2872, 2875, 2878, 2881, 2885, 2888, 2891, 2894, 2898, 2901, 2904, 2908, 2911, 2914, 2917, 2920, 2924, 2927, 2930, 2934, 2938, 2941, 2944, 2948, 2952, 2956, 2959, 2963, 2967, 2970, 2974, 2977, 2981, 2984, 2987, 2991, 2995, 2998, 3001, 3005, 3009, 3012, 3016, 3019, 3023, 3026, 3029, 3032, 3036, 3038, 3041, 3045, 3048, 3051, 3054, 3058, 3062, 3064, 3068, 3071, 3075, 3078, 3081, 3085, 3089, 3091, 3095, 3098, 3102, 3105, 3109, 3113, 3117, 3120, 3123, 3127, 3131, 3134, 3137, 3140, 3144, 3147, 3150, 3153, 3157, 3160, 3163, 3166, 3170, 3173, 3176, 3179, 3183, 3186, 3189, 3192, 3196, 3198, 3201, 3205, 3208, 3211, 3214, 3218, 3222, 3225, 3228, 3231, 3235, 3238, 3241, 3244, 3247, 3250, 3253, 3256, 3260, 3263, 3266, 3269, 3273, 3276, 3279, 3283, 3287, 3290, 3293, 3297, 3301, 3303, 3306, 3310, 3314, 3317, 3321, 3324, 3329, 3332, 3335, 3339, 3343, 3346, 3349, 3352, 3356, 3359, 3361, 3365, 3369, 3371, 3374, 3378, 3382, 3385, 3388, 3391, 3395, 3398, 3401, 3404, 3408, 3410, 3413, 3416, 3420, 3423, 3426, 3429, 3434, 3436, 3440, 3443, 3447, 3450, 3453, 3456, 3460, 3462, 3465, 3468, 3472, 3475, 3478, 3481, 3486, 3488, 3492, 3495, 3499, 3502, 3505, 3508, 3512, 3514, 3517, 3521, 3525, 3527, 3530, 3534, 3538, 3541, 3544, 3547, 3551, 3554, 3556, 3559, 3562, 3564, 3567, 3570, 3574, 3576, 3579, 3582, 3586, 3589, 3592, 3595, 3599, 3602, 3605, 3608, 3612, 3615, 3618, 3622, 3626, 3629, 3632, 3636, 3641, 3644, 3647, 3651, 3655, 3658, 3660, 3664, 3667, 3669, 3672, 3675, 3679, 3681, 3684, 3687, 3691, 3693, 3696, 3699, 3703, 3706, 3708, 3711, 3715, 3717, 3720, 3724, 3728, 3730, 3733, 3737, 3741, 3744, 3747, 3751, 3755, 3758, 3761, 3764, 3768, 3770, 3773, 3777, 3781, 3783, 3786, 3790, 3794, 3797, 3800, 3803, 3807, 3809, 3812, 3815, 3819, 3821, 3823, 3826, 3830, 3832, 3835, 3838, 3842, 3845, 3848, 3851, 3855, 3858, 3860, 3864, 3867, 3870, 3873, 3876, 3880, 3883, 3886, 3889, 3894, 3896, 3900, 3903, 3907, 3909, 3912, 3915, 3919, 3921, 3923, 3926, 3930, 3932, 3935, 3938, 3942, 3945, 3948, 3951, 3955, 3958, 3960, 3963, 3967, 3970, 3972, 3976, 3980, 3982, 3985, 3989, 3993, 3996, 3999, 4003, 4007, 4010, 4012, 4015, 4019, 4021, 4023, 4027, 4031, 4033, 4035, 4039, 4043, 4045, 4048, 4051, 4055, 4057, 4060, 4063, 4066, 4068, 4071, 4074, 4078, 4080, 4083, 4086, 4090, 4093, 4096, 4099, 4103, 4105, 4108, 4111, 4114, 4116, 4119, 4122, 4126, 4128, 4131, 4134, 4138, 4141, 4144, 4147, 4151, 4153, 4156, 4159, 4162, 4164, 4167, 4170, 4174, 4176, 4179, 4182, 4186, 4189, 4192, 4195, 4199, 4201, 4204, 4207, 4210, 4212, 4215, 4218, 4222, 4224, 4227, 4230, 4234, 4237, 4240, 4243, 4247, 4249, 4252, 4255, 4258, 4260, 4263, 4266, 4270, 4272, 4275, 4278, 4282, 4285, 4288, 4291, 4295, 4297, 4300, 4303, 4306, 4308, 4311, 4314, 4318, 4320, 4323, 4326, 4330, 4333, 4336, 4339, 4343, 4345, 4348, 4351, 4354, 4356, 4359, 4362, 4366, 4368, 4371, 4374, 4378, 4381, 4384, 4387, 4391, 4393, 4396, 4399, 4403, 4405, 4407, 4410, 4414, 4416, 4419, 4423, 4427, 4429, 4432, 4435, 4439, 4441, 4443, 4446, 4449, 4451, 4453, 4456, 4460, 4462, 4464, 4467, 4471, 4473, 4476, 4479, 4483, 4485, 4487, 4490, 4494, 4496, 4498, 4501, 4505, 4507, 4510, 4514, 4518, 4520, 4523, 4527, 4531, 4533, 4536, 4539, 4543, 4544, 4547, 4550, 4554, 4556, 4559, 4563, 4567, 4569, 4572, 4575, 4579, 4581, 4583, 4586, 4590, 4591, 4594, 4597, 4600, 4602, 4604, 4608, 4611, 4614, 4616, 4619, 4623, 4625, 4627, 4630, 4633, 4634, 4637, 4640, 4643, 4645, 4648, 4651, 4655, 4657, 4660, 4663, 4667, 4669, 4671, 4674, 4678, 4680, 4682, 4686, 4690, 4692, 4695, 4698, 4702, 4705, 4708, 4711, 4715, 4717, 4719, 4722, 4726, 4727, 4729, 4733, 4736, 4738, 4740, 4744, 4747, 4749, 4752, 4755, 4759, 4761, 4763, 4766, 4769, 4771, 4773, 4776, 4780, 4781, 4784, 4787, 4791, 4793, 4796, 4799, 4803, 4805, 4807, 4810, 4813, 4815, 4817, 4820, 4824, 4826, 4828, 4831, 4835, 4837, 4840, 4843, 4847, 4849, 4851, 4854, 4857, 4859, 4861, 4864, 4868, 4869, 4872, 4875, 4879, 4881, 4884, 4887, 4891, 4893, 4895, 4898, 4901, 4903, 4905, 4908, 4912, 4913, 4916, 4919, 4923, 4925, 4928, 4931, 4935, 4937, 4939, 4942, 4945, 4947, 4949, 4952, 4956, 4957, 4960, 4963, 4967, 4969, 4972, 4975, 4979, 4981, 4983, 4986, 4989, 4990, 4993, 4996, 5000, 5001, 5004, 5007, 5011, 5013, 5016, 5019, 5023, 5025, 5027, 5030, 5033, 5035, 5037, 5040, 5044, 5046, 5048, 5051, 5055, 5057, 5060, 5063, 5067, 5068, 5070, 5073, 5076, 5077, 5079, 5082, 5086, 5087, 5089, 5092, 5096, 5098, 5100, 5103, 5107, 5108, 5110, 5113, 5117, 5118, 5120, 5123, 5127, 5129, 5131, 5135, 5139, 5141, 5144, 5147, 5151, 5153, 5155, 5158, 5161, 5163, 5165, 5168, 5172, 5174, 5176, 5180, 5183, 5185, 5188, 5191, 5195, 5196, 5198, 5201, 5204, 5205, 5207, 5210, 5213, 5215, 5217, 5220, 5224, 5226, 5228, 5231, 5235, 5237, 5239, 5241, 5245, 5246, 5249, 5252, 5256, 5257, 5260, 5263, 5267, 5269, 5272, 5275, 5279, 5280, 5282, 5285, 5288, 5289, 5291, 5294, 5297, 5299, 5301, 5304, 5308, 5309, 5312, 5315, 5319, 5321, 5323, 5326, 5329, 5331, 5333, 5336, 5340, 5342, 5344, 5347, 5351, 5353, 5356, 5359, 5363, 5364, 5366, 5368, 5371, 5372, 5374, 5376, 5379, 5380, 5382, 5385, 5389, 5390, 5392, 5395, 5399, 5400, 5402, 5405, 5409, 5410, 5412, 5416, 5419, 5421, 5424, 5427, 5431, 5433, 5436, 5439, 5443, 5444, 5446, 5448, 5451, 5452, 5454, 5456, 5459, 5461, 5462, 5465, 5469, 5470, 5472, 5475, 5479, 5480, 5482, 5485, 5489, 5490, 5492, 5495, 5499, 5501, 5504, 5507, 5511, 5513, 5516, 5519, 5523, 5524, 5526, 5528, 5531, 5532, 5534, 5536, 5539, 5540, 5542, 5545, 5549, 5550, 5552, 5555, 5559, 5560, 5562, 5565, 5568, 5570, 5572, 5575, 5579, 5581, 5583, 5587, 5591, 5593, 5596, 5599, 5603, 5604, 5606, 5608, 5611, 5612, 5614, 5617, 5620, 5621, 5623, 5626, 5629, 5630, 5633, 5635, 5639, 5640, 5642, 5644, 5647, 5648, 5650, 5653, 5657, 5658, 5660, 5663, 5667, 5669, 5672, 5675, 5679, 5680, 5682, 5685, 5688, 5689, 5691, 5694, 5698, 5699, 5701, 5704, 5708, 5710, 5712, 5715, 5719, 5720, 5721, 5724, 5727, 5728, 5729, 5732, 5735, 5736, 5738, 5741, 5745, 5746, 5748, 5751, 5755, 5756, 5758, 5760, 5763, 5764, 5766, 5769, 5773, 5774, 5776, 5779, 5783, 5785, 5788, 5791, 5795, 5796, 5798, 5801, 5804, 5805, 5807, 5810, 5814, 5815, 5817, 5820, 5824, 5826, 5828, 5831, 5835, 5836, 5838, 5840, 5843, 5844, 5846, 5848, 5852, 5853, 5855, 5857, 5861, 5862, 5864, 5867, 5871, 5872, 5873, 5875, 5878, 5879, 5881, 5883, 5887, 5888, 5890, 5893, 5896, 5898, 5900, 5903, 5907, 5908, 5910, 5912, 5916, 5917, 5919, 5922, 5925, 5927, 5929, 5932, 5936, 5938, 5940, 5943, 5947, 5948, 5950, 5952, 5955, 5956, 5958, 5960, 5964, 5965, 5966, 5969, 5973, 5974, 5976, 5979, 5983, 5984, 5985, 5988, 5991, 5991, 5993, 5996, 5999, 6000, 6002, 6005, 6009, 6010, 6012, 6015, 6019, 6020, 6021, 6024, 6027, 6027, 6029, 6032, 6035, 6036, 6038, 6041, 6045, 6046, 6048, 6051, 6055, 6056, 6057, 6060, 6063, 6063, 6065, 6068, 6071, 6072, 6074, 6077, 6081, 6082, 6084, 6087, 6091, 6092, 6093, 6096, 6099, 6099, 6101, 6104, 6107, 6108, 6110, 6113, 6117, 6118, 6120, 6123, 6127, 6128, 6129, 6132, 6135, 6135, 6137, 6140, 6143, 6144, 6146, 6149, 6153, 6154, 6156, 6159, 6163, 6164, 6165, 6168, 6171, 6171, 6173, 6176, 6179, 6180, 6182, 6185, 6189, 6190, 6192, 6195, 6199, 6200, 6201, 6203, 6207, 6207, 6209, 6211, 6215, 6216, 6218, 6221, 6224, 6226, 6228, 6231, 6235, 6236, 6237, 6240, 6243, 6244, 6245, 6248, 6252, 6253, 6254, 6257, 6261, 6262, 6264, 6267, 6271, 6271, 6273, 6275, 6278, 6278, 6279, 6282, 6285, 6286, 6287, 6290, 6293, 6294, 6296, 6299, 6303, 6304, 6305, 6307, 6310, 6311, 6313, 6315, 6319, 6320, 6322, 6325, 6329, 6330, 6332, 6335, 6339, 6339, 6341, 6343, 6346, 6346, 6347, 6350, 6353, 6354, 6355, 6358, 6361, 6363, 6364, 6367, 6371, 6372, 6373, 6375, 6378, 6379, 6381, 6383, 6387, 6388, 6390, 6393, 6397, 6398, 6400, 6403, 6407, 6407, 6409, 6411, 6414, 6414, 6415, 6418, 6421, 6422, 6423, 6426, 6429, 6430, 6432, 6435, 6439, 6440, 6441, 6443, 6446, 6447, 6449, 6451, 6455, 6456, 6458, 6461, 6465, 6466, 6468, 6471, 6475, 6475, 6477, 6479, 6482, 6482, 6483, 6486, 6489, 6490, 6491, 6494, 6497, 6498, 6500, 6503, 6507, 6507, 6509, 6511, 6514, 6515, 6517, 6519, 6523, 6524, 6526, 6529, 6533, 6534, 6536, 6539, 6543, 6543, 6545, 6547, 6550, 6550, 6551, 6554, 6557, 6558, 6559, 6562, 6565, 6566, 6568, 6571, 6575, 6575, 6577, 6579, 6582, 6583, 6584, 6587, 6591, 6592, 6594, 6597, 6600, 6602, 6604, 6607, 6611, 6611, 6613, 6615, 6618, 6618, 6620, 6622, 6625, 6626, 6627, 6630, 6634, 6635, 6637, 6639, 6643, 6643, 6644, 6646, 6649, 6650, 6651, 6653, 6657, 6657, 6659, 6662, 6665, 6666, 6668, 6671, 6675, 6675, 6676, 6679, 6682, 6682, 6683, 6686, 6689, 6690, 6691, 6694, 6698, 6699, 6700, 6703, 6707, 6707, 6708, 6710, 6713, 6713, 6715, 6717, 6720, 6721, 6723, 6725, 6729, 6730, 6732, 6735, 6739, 6739, 6741, 6743, 6746, 6747, 6748, 6751, 6755, 6756, 6758, 6761, 6764, 6766, 6768, 6771, 6775, 6775, 6777, 6779, 6782, 6782, 6783, 6786, 6789, 6790, 6791, 6794, 6798, 6799, 6800, 6803, 6807, 6807, 6808, 6810, 6813, 6814, 6815, 6817, 6821, 6821, 6823, 6826, 6829, 6830, 6832, 6835, 6839, 6839, 6840, 6842, 6845, 6846, 6847, 6849, 6853, 6853, 6855, 6858, 6861, 6862, 6864, 6867, 6871, 6871, 6872, 6875, 6878, 6878, 6879, 6882, 6885, 6886, 6887, 6890, 6894, 6895, 6897, 6899, 6903, 6903, 6904, 6906, 6908, 6908, 6909, 6912, 6915, 6915, 6916, 6919, 6922, 6923, 6925, 6927, 6931, 6931, 6932, 6934, 6937, 6937, 6938, 6941, 6944, 6945, 6946, 6949, 6953, 6954, 6956, 6959, 6963, 6963, 6964, 6967, 6970, 6970, 6971, 6974, 6977, 6978, 6979, 6982, 6986, 6987, 6989, 6991, 6995, 6995, 6996, 6998, 7000, 7000, 7001, 7004, 7007, 7007, 7008, 7011, 7014, 7015, 7017, 7019, 7023, 7023, 7024, 7026, 7029, 7029, 7030, 7033, 7036, 7037, 7038, 7041, 7045, 7046, 7048, 7051, 7055, 7055, 7056, 7059, 7062, 7062, 7063, 7066, 7069, 7070, 7071, 7074, 7078, 7079, 7080, 7083, 7087, 7087, 7088, 7090, 7092, 7092, 7093, 7095, 7099, 7099, 7100, 7103, 7106, 7107, 7108, 7111, 7115, 7115, 7116, 7118, 7121, 7121, 7123, 7125, 7129, 7129, 7131, 7133, 7137, 7138, 7140, 7143, 7147, 7147, 7148, 7150, 7153, 7153, 7154, 7156, 7159, 7159, 7161, 7163, 7166, 7167, 7169, 7171, 7175, 7175, 7176, 7177, 7180, 7180, 7181, 7183, 7187, 7187, 7188, 7191, 7194, 7195, 7197, 7199, 7203, 7203, 7203, 7205, 7208, 7208, 7209, 7211, 7214, 7214, 7216, 7218, 7222, 7223, 7224, 7227, 7231, 7231, 7232, 7234, 7237, 7237, 7239, 7241, 7245, 7245, 7247, 7249, 7253, 7254, 7256, 7259, 7263, 7263, 7264, 7266, 7269, 7269, 7270, 7272, 7275, 7275, 7276, 7279, 7282, 7283, 7285, 7287, 7291, 7291, 7291, 7293, 7296, 7296, 7297, 7299, 7302, 7303, 7304, 7306, 7310, 7311, 7312, 7315, 7319, 7319, 7320, 7321, 7324, 7324, 7325, 7327, 7331, 7331, 7332, 7335, 7338, 7339, 7341, 7343, 7347, 7347, 7347, 7349, 7352, 7352, 7353, 7355, 7358, 7358, 7359, 7362, 7366, 7366, 7368, 7371, 7375, 7375, 7376, 7378, 7381, 7382, 7383, 7385, 7389, 7389, 7391, 7394, 7398, 7399, 7400, 7403, 7407, 7407, 7407, 7409, 7412, 7411, 7412, 7414, 7417, 7417, 7418, 7420, 7423, 7424, 7425, 7427, 7431, 7430, 7431, 7433, 7435, 7435, 7436, 7438, 7441, 7442, 7443, 7446, 7449, 7450, 7452, 7455, 7459, 7459, 7460, 7462, 7465, 7466, 7467, 7470, 7473, 7474, 7475, 7478, 7482, 7483, 7484, 7487, 7491, 7491, 7491, 7493, 7496, 7495, 7496, 7498, 7501, 7501, 7502, 7504, 7507, 7508, 7509, 7511, 7515, 7514, 7515, 7517, 7520, 7519, 7520, 7522, 7526, 7526, 7527, 7530, 7534, 7534, 7536, 7539, 7543, 7543, 7544, 7546, 7548, 7548, 7549, 7552, 7555, 7555, 7556, 7559, 7563, 7563, 7565, 7567, 7571, 7570, 7571, 7573, 7575, 7575, 7575, 7577, 7580, 7580, 7581, 7584, 7587, 7587, 7589, 7591, 7595, 7594, 7595, 7597, 7600, 7599, 7600, 7603, 7606, 7606, 7607, 7610, 7614, 7614, 7616, 7619, 7623, 7623, 7624, 7626, 7628, 7628, 7629, 7632, 7635, 7635, 7636, 7639, 7642, 7643, 7645, 7647, 7651, 7650, 7651, 7653, 7655, 7655, 7655, 7657, 7660, 7660, 7661, 7664, 7667, 7667, 7669, 7671, 7675, 7674, 7675, 7677, 7680, 7679, 7680, 7683, 7686, 7686, 7687, 7690, 7694, 7694, 7696, 7699, 7703, 7703, 7704, 7705, 7708, 7708, 7709, 7712, 7715, 7715, 7716, 7719, 7722, 7723, 7725, 7727, 7731, 7730, 7731, 7732, 7735, 7735, 7735, 7737, 7740, 7740, 7741, 7743, 7747, 7747, 7749, 7751, 7755, 7754, 7755, 7757, 7760, 7760, 7761, 7763, 7766, 7766, 7768, 7770, 7774, 7775, 7776, 7779, 7783, 7782, 7783, 7785, 7787, 7787, 7788, 7790, 7793, 7793, 7794, 7796, 7799, 7800, 7801, 7803, 7807, 7806, 7807, 7808, 7811, 7810, 7811, 7813, 7816, 7816, 7817, 7819, 7822, 7823, 7824, 7827, 7831, 7830, 7831, 7833, 7836, 7836, 7837, 7839, 7843, 7843, 7844, 7847, 7850, 7851, 7852, 7855, 7859, 7858, 7859, 7860, 7863, 7862, 7863, 7865, 7868, 7868, 7869, 7871, 7875, 7875, 7877, 7879, 7883, 7882, 7883, 7885, 7888, 7888, 7889, 7891, 7895, 7895, 7896, 7899, 7902, 7903, 7905, 7907, 7911, 7910, 7910, 7912, 7914, 7913, 7914, 7915, 7918, 7918, 7919, 7921, 7924, 7924, 7925, 7927, 7931, 7930, 7931, 7933, 7935, 7935, 7936, 7938, 7942, 7942, 7943, 7946, 7950, 7951, 7952, 7955, 7959, 7958, 7959, 7961, 7963, 7963, 7963, 7965, 7968, 7968, 7969, 7971, 7975, 7975, 7977, 7979, 7983, 7982, 7983, 7985, 7988, 7987, 7988, 7991, 7994, 7994, 7995, 7998, 8002, 8003, 8004, 8007, 8011, 8010, 8011, 8013, 8015, 8015, 8016, 8018, 8021, 8021, 8021, 8024, 8027, 8027, 8029, 8031, 8035, 8034, 8035, 8036, 8039, 8038, 8039, 8041, 8044, 8044, 8045, 8047, 8051, 8051, 8053, 8055, 8058, 8058, 8059, 8060, 8063, 8062, 8063, 8065, 8068, 8068, 8069, 8071, 8075, 8075, 8077, 8079, 8082, 8082, 8083, 8084, 8087, 8086, 8087, 8089, 8092, 8092, 8093, 8095, 8099, 8099, 8101, 8103, 8106, 8106, 8107, 8108, 8111, 8110, 8111, 8113, 8116, 8116, 8117, 8119, 8123, 8123, 8125, 8127, 8130, 8130, 8131, 8132, 8135, 8134, 8135, 8137, 8140, 8140, 8141, 8143, 8147, 8147, 8149, 8151, 8154, 8154, 8154, 8156, 8158, 8158, 8158, 8160, 8164, 8163, 8164, 8167, 8170, 8171, 8172, 8175, 8178, 8178, 8179, 8181, 8184, 8184, 8185, 8187, 8191, 8191, 8192, 8195, 8198, 8199, 8200, 8203, 8206, 8206, 8206, 8208, 8210, 8209, 8210, 8211, 8214, 8214, 8214, 8216, 8220, 8220, 8221, 8223, 8226, 8226, 8227, 8228, 8231, 8231, 8232, 8234, 8238, 8238, 8239, 8242, 8246, 8246, 8248, 8251, 8254, 8254, 8255, 8257, 8259, 8259, 8259, 8261, 8265, 8264, 8265, 8268, 8271, 8271, 8273, 8275, 8278, 8278, 8279, 8280, 8283, 8282, 8283, 8285, 8288, 8288, 8289, 8292, 8295, 8295, 8297, 8299, 8302, 8302, 8302, 8304, 8306, 8305, 8305, 8307, 8310, 8310, 8310, 8312, 8316, 8316, 8317, 8319, 8322, 8322, 8322, 8324, 8326, 8326, 8326, 8328, 8332, 8331, 8332, 8335, 8338, 8339, 8340, 8343, 8346, 8346, 8347, 8348, 8351, 8350, 8351, 8353, 8356, 8356, 8357, 8359, 8363, 8363, 8365, 8367, 8370, 8370, 8370, 8372, 8375, 8374, 8375, 8377, 8380, 8380, 8381, 8383, 8387, 8387, 8388, 8391, 8394, 8394, 8394, 8396, 8399, 8398, 8399, 8401, 8404, 8404, 8405, 8407, 8411, 8411, 8412, 8415, 8418, 8418, 8419, 8420, 8423, 8422, 8423, 8425, 8428, 8428, 8429, 8432, 8435, 8435, 8437, 8439, 8442, 8442, 8442, 8443, 8446, 8445, 8445, 8447, 8450, 8450, 8450, 8452, 8456, 8456, 8457, 8459, 8462, 8462, 8462, 8464, 8466, 8466, 8466, 8468, 8471, 8471, 8472, 8475, 8478, 8479, 8480, 8483, 8486, 8486, 8487, 8488, 8491, 8491, 8491, 8493, 8497, 8496, 8497, 8500, 8503, 8503, 8505, 8507, 8510, 8510, 8510, 8511, 8514, 8513, 8513, 8515, 8518, 8517, 8518, 8520, 8523, 8524, 8525, 8527, 8530, 8530, 8530, 8532, 8535, 8534, 8535, 8537, 8540, 8540, 8541, 8543, 8547, 8547, 8548, 8551, 8554, 8554, 8554, 8555, 8558, 8557, 8557, 8559, 8562, 8562, 8562, 8564, 8568, 8568, 8569, 8571, 8574, 8574, 8574, 8576, 8578, 8578, 8578, 8580, 8583, 8583, 8584, 8587, 8590, 8591, 8592, 8595, 8598, 8598, 8599, 8600, 8603, 8602, 8603, 8605, 8608, 8608, 8609, 8611, 8615, 8615, 8617, 8619, 8622, 8622, 8622, 8624, 8626, 8625, 8626, 8627, 8630, 8630, 8630, 8633, 8636, 8636, 8637, 8639, 8642, 8642, 8642, 8643, 8645, 8644, 8645, 8646, 8649, 8649, 8650, 8652, 8655, 8655, 8657, 8659, 8662, 8662, 8662, 8664, 8667, 8666, 8667, 8669, 8672, 8672, 8673, 8675, 8679, 8679, 8680, 8683, 8686, 8686, 8686, 8688, 8690, 8689, 8690, 8691, 8694, 8694, 8695, 8697, 8700, 8700, 8701, 8703, 8706, 8706, 8706, 8707, 8709, 8708, 8709, 8710, 8713, 8713, 8713, 8716, 8719, 8719, 8720, 8723, 8726, 8726, 8726, 8728, 8731, 8730, 8730, 8733, 8736, 8736, 8737, 8739, 8743, 8743, 8744, 8747, 8750, 8750, 8750, 8751, 8754, 8753, 8753, 8755, 8758, 8758, 8758, 8761, 8764, 8764, 8765, 8767, 8770, 8770, 8770, 8771, 8774, 8773, 8773, 8775, 8778, 8777, 8778, 8780, 8784, 8784, 8785, 8787, 8790, 8790, 8790, 8791, 8793, 8792, 8793, 8794, 8797, 8797, 8798, 8800, 8803, 8803, 8805, 8807, 8810, 8810, 8810, 8812, 8814, 8814, 8814, 8816, 8820, 8819, 8820, 8823, 8827, 8827, 8828, 8831, 8834, 8834, 8834, 8836, 8838, 8837, 8838, 8840, 8843, 8842, 8843, 8845, 8848, 8848, 8849, 8851, 8854, 8853, 8853, 8854, 8857, 8855, 8855, 8857, 8860, 8859, 8859, 8861, 8864, 8864, 8865, 8867, 8870, 8869, 8869, 8871, 8873, 8872, 8872, 8874, 8877, 8876, 8877, 8879, 8883, 8883, 8884, 8887, 8890, 8890, 8890, 8892, 8895, 8894, 8894, 8897, 8900, 8900, 8901, 8903, 8907, 8907, 8908, 8911, 8914, 8914, 8914, 8915, 8918, 8917, 8917, 8919, 8922, 8922, 8922, 8924, 8928, 8928, 8929, 8931, 8934, 8934, 8934, 8935, 8938, 8937, 8937, 8939, 8942, 8942, 8942, 8944, 8948, 8948, 8949, 8951, 8954, 8953, 8953, 8954, 8957, 8955, 8955, 8957, 8960, 8959, 8959, 8961, 8964, 8964, 8965, 8967, 8970, 8969, 8969, 8971, 8973, 8972, 8973, 8974, 8978, 8977, 8978, 8980, 8983, 8983, 8985, 8987, 8990, 8990, 8990, 8991, 8993, 8992, 8992, 8994, 8997, 8997, 8997, 9000, 9003, 9003, 9004, 9007, 9010, 9010, 9010, 9012, 9015, 9014, 9015, 9017, 9020, 9020, 9021, 9023, 9027, 9027, 9028, 9031, 9034, 9033, 9033, 9035, 9037, 9036, 9036, 9037, 9040, 9039, 9039, 9041, 9045, 9044, 9045, 9047, 9050, 9049, 9049, 9051, 9053, 9052, 9053, 9054, 9058, 9057, 9058, 9060, 9064, 9064, 9065, 9067, 9070, 9069, 9069, 9070, 9073, 9071, 9071, 9073, 9076, 9075, 9075, 9077, 9080, 9080, 9081, 9083, 9086, 9085, 9085, 9087, 9089, 9088, 9088, 9090, 9093, 9093, 9093, 9096, 9099, 9099, 9100, 9103, 9106, 9106, 9106, 9107, 9110, 9109, 9109, 9111, 9114, 9113, 9114, 9116, 9120, 9120, 9121, 9123, 9126, 9125, 9126, 9127, 9129, 9128, 9129, 9131, 9134, 9133, 9134, 9136, 9139, 9139, 9141, 9143, 9146, 9145, 9146, 9147, 9149, 9148, 9149, 9150, 9154, 9153, 9154, 9156, 9159, 9159, 9160, 9163, 9166, 9166, 9166, 9167, 9170, 9169, 9169, 9171, 9174, 9174, 9174, 9176, 9180, 9180, 9181, 9183, 9186, 9185, 9185, 9186, 9188, 9187, 9187, 9189, 9192, 9191, 9191, 9193, 9196, 9196, 9197, 9199, 9202, 9201, 9201, 9203, 9205, 9204, 9205, 9207, 9210, 9209, 9210, 9212, 9216, 9216, 9217, 9219, 9222, 9221, 9221, 9222, 9225, 9223, 9223, 9225, 9228, 9227, 9227, 9229, 9232, 9232, 9233, 9235, 9238, 9237, 9237, 9238, 9241, 9240, 9240, 9242, 9245, 9244, 9245, 9247, 9251, 9251, 9252, 9255, 9258, 9258, 9258, 9259, 9262, 9261, 9261, 9263, 9266, 9266, 9266, 9268, 9272, 9272, 9273, 9275, 9278, 9277, 9277, 9278, 9280, 9279, 9279, 9281, 9284, 9283, 9283, 9285, 9288, 9288, 9289, 9291, 9294, 9293, 9293, 9294, 9297, 9296, 9296, 9298, 9301, 9300, 9301, 9303, 9307, 9307, 9308, 9311, 9314, 9314, 9314, 9315, 9318, 9317, 9317, 9319, 9322, 9322, 9322, 9324, 9328, 9328, 9329, 9331, 9334, 9333, 9333, 9334, 9336, 9335, 9335, 9337, 9339, 9339, 9339, 9341, 9344, 9344, 9345, 9347, 9350, 9349, 9349, 9351, 9353, 9352, 9353, 9354, 9358, 9357, 9358, 9360, 9363, 9363, 9365, 9367, 9370, 9369, 9369, 9370, 9372, 9371, 9371, 9373, 9376, 9375, 9375, 9377, 9380, 9380, 9381, 9383, 9386, 9385, 9385, 9387, 9389, 9388, 9388, 9390, 9393, 9393, 9393, 9396, 9399, 9399, 9400, 9403, 9406, 9405, 9405, 9406, 9409, 9408, 9408, 9409, 9412, 9411, 9412, 9413, 9417, 9416, 9417, 9419, 9422, 9421, 9421, 9422, 9424, 9423, 9422, 9424, 9427, 9426, 9426, 9428, 9432, 9432, 9433, 9435, 9438, 9437, 9437, 9439, 9441, 9440, 9441, 9443, 9446, 9445, 9446, 9448, 9452, 9451, 9453, 9455, 9458, 9457, 9457, 9458, 9460, 9459, 9459, 9461, 9464, 9463, 9463, 9465, 9468, 9468, 9469, 9471, 9474, 9473, 9473, 9475, 9477, 9476, 9476, 9478, 9482, 9481, 9482, 9484, 9487, 9487, 9488, 9491, 9494, 9493, 9493, 9494, 9496, 9495, 9495, 9497, 9500, 9499, 9499, 9501, 9504, 9504, 9505, 9507, 9510, 9509, 9509, 9511, 9513, 9512, 9512, 9514, 9518, 9517, 9518, 9520, 9523, 9523, 9524, 9527, 9530, 9529, 9529, 9530, 9532, 9531, 9531, 9533, 9536, 9535, 9535, 9537, 9540, 9540, 9541, 9543, 9546, 9545, 9545, 9547, 9549, 9548, 9548, 9550, 9553, 9553, 9553, 9556, 9559, 9559, 9560, 9563, 9566, 9565, 9565, 9566, 9569, 9567, 9567, 9569, 9572, 9571, 9571, 9573, 9577, 9576, 9577, 9579, 9582, 9581, 9581, 9582, 9584, 9582, 9582, 9584, 9587, 9586, 9586, 9588, 9592, 9592, 9593, 9595, 9598, 9597, 9597, 9599, 9601, 9600, 9600, 9602, 9605, 9605, 9605, 9608, 9611, 9611, 9612, 9615, 9618, 9617, 9617, 9618, 9621, 9619, 9619, 9621, 9624, 9623, 9623, 9625, 9629, 9628, 9629, 9631, 9634, 9633, 9633, 9634, 9636, 9634, 9634, 9636, 9639, 9638, 9638, 9640, 9644, 9644, 9644, 9647, 9650, 9649, 9649, 9651, 9653, 9652, 9652, 9654, 9657, 9657, 9657, 9660, 9663, 9663, 9664, 9667, 9670, 9669, 9669, 9670, 9673, 9671, 9671, 9673, 9676, 9675, 9675, 9677, 9681, 9680, 9681, 9683, 9686, 9685, 9685, 9686, 9688, 9687, 9687, 9688, 9691, 9690, 9691, 9693, 9696, 9696, 9697, 9699, 9702, 9701, 9701, 9702, 9704, 9703, 9703, 9704, 9707, 9706, 9707, 9709, 9712, 9712, 9713, 9715, 9718, 9717, 9717, 9718, 9720, 9719, 9719, 9721, 9724, 9723, 9723, 9725, 9728, 9728, 9729, 9731, 9734, 9733, 9733, 9734, 9736, 9734, 9734, 9736, 9739, 9738, 9738, 9740, 9744, 9744, 9744, 9747, 9750, 9749, 9749, 9751, 9753, 9752, 9752, 9754, 9757, 9757, 9757, 9760, 9763, 9763, 9764, 9767, 9770, 9769, 9769, 9770, 9773, 9771, 9771, 9773, 9776, 9775, 9775, 9777, 9780, 9780, 9781, 9783, 9786, 9785, 9785, 9786, 9788, 9787, 9787, 9788, 9791, 9790, 9791, 9793, 9796, 9796, 9797, 9799, 9802, 9801, 9801, 9802, 9804, 9803, 9803, 9804, 9807, 9806, 9807, 9809, 9812, 9812, 9813, 9815, 9818, 9817, 9817, 9818, 9820, 9819, 9819, 9820, 9823, 9822, 9823, 9825, 9828, 9828, 9829, 9831, 9834, 9833, 9833, 9834, 9836, 9835, 9835, 9836, 9839, 9838, 9839, 9841, 9844, 9844, 9845, 9847, 9850, 9849, 9849, 9850, 9852, 9851, 9851, 9852, 9855, 9854, 9855, 9857, 9860, 9860, 9861, 9863, 9866, 9865, 9865, 9866, 9868, 9867, 9867, 9869, 9872, 9871, 9871, 9873, 9877, 9876, 9877, 9879, 9882, 9881, 9880, 9881, 9883, 9882, 9881, 9883, 9885, 9884, 9884, 9886, 9889, 9888, 9889, 9891, 9894, 9893, 9892, 9893, 9896, 9894, 9894, 9896, 9899, 9898, 9898, 9900, 9904, 9904, 9905, 9907, 9910, 9909, 9909, 9910, 9912, 9911, 9911, 9912, 9915, 9914, 9915, 9917, 9920, 9920, 9921, 9923, 9926, 9925, 9925, 9926, 9928, 9927, 9927, 9928, 9931, 9930, 9931, 9933, 9936, 9936, 9937, 9939, 9942, 9941, 9941, 9942, 9944, 9943, 9943, 9944, 9947, 9946, 9947, 9949, 9952, 9952, 9953, 9955, 9958, 9957, 9957, 9958, 9960, 9959, 9959, 9960, 9963, 9962, 9963, 9965, 9968, 9968, 9969, 9971, 9974, 9973, 9973, 9974, 9976, 9975, 9975, 9976, 9979, 9978, 9979, 9981, 9984, 9984, 9985, 9987, 9990, 9989, 9989, 9990, 9992, 9991, 9990, 9992, 9995, 9994, 9994, 9997, 10000, 10000, 10001, 10003, 10006, 10005, 10005, 10006, 10008, 10007, 10007, 10009, 10012, 10011, 10011, 10013, 10017, 10016, 10017, 10019, 10022, 10021, 10020, 10021, 10023, 10021, 10021, 10022, 10025, 10024, 10024, 10026, 10029, 10028, 10029, 10031, 10034, 10033, 10032, 10034, 10036, 10035, 10034, 10036, 10039, 10038, 10039, 10041, 10044, 10044, 10045, 10047, 10050, 10049, 10048, 10049, 10051, 10050, 10049, 10051, 10053, 10052, 10052, 10054, 10057, 10056, 10057, 10059, 10062, 10061, 10060, 10061, 10064, 10062, 10062, 10064, 10067, 10066, 10066, 10068, 10072, 10071, 10072, 10075, 10078, 10077, 10077, 10078, 10080, 10079, 10079, 10080, 10083, 10082, 10083, 10085, 10088, 10088, 10089, 10091, 10094, 10093, 10092, 10094, 10096, 10094, 10094, 10096, 10099, 10098, 10098, 10100, 10104, 10104, 10104, 10107, 10110, 10109, 10109, 10110, 10112, 10111, 10111, 10113, 10116, 10115, 10115, 10117, 10120, 10120, 10121, 10123, 10126, 10125, 10124, 10125, 10127, 10125, 10125, 10126, 10129, 10128, 10128, 10130, 10133, 10132, 10133, 10135, 10138, 10137, 10136, 10138, 10140, 10138, 10138, 10140, 10143, 10142, 10143, 10145, 10148, 10148, 10149, 10151, 10154, 10153, 10152, 10153, 10155, 10153, 10153, 10154, 10157, 10156, 10156, 10158, 10161, 10160, 10161, 10163, 10166, 10165, 10164, 10165, 10168, 10166, 10166, 10168, 10171, 10170, 10170, 10173, 10176, 10176, 10177, 10179, 10182, 10181, 10180, 10181, 10183, 10182, 10181, 10183, 10185, 10184, 10184, 10186, 10189, 10188, 10189, 10191, 10194, 10193, 10192, 10193, 10196, 10194, 10194, 10196, 10199, 10198, 10198, 10200, 10204, 10203, 10204, 10207, 10210, 10209, 10209, 10210, 10212, 10211, 10211, 10213, 10216, 10215, 10215, 10217, 10221, 10220, 10221, 10223, 10226, 10225, 10224, 10225, 10227, 10225, 10225, 10226, 10229, 10228, 10228, 10230, 10233, 10232, 10233, 10235, 10238, 10237, 10236, 10237, 10240, 10238, 10238, 10240, 10243, 10242, 10242, 10245, 10248, 10248, 10249, 10251, 10254, 10253, 10252, 10253, 10255, 10253, 10253, 10255, 10257, 10256, 10256, 10258, 10261, 10260, 10261, 10263, 10266, 10265, 10264, 10265, 10268, 10266, 10266, 10267, 10271, 10270, 10270, 10272, 10276, 10275, 10276, 10279, 10282, 10281, 10281, 10282, 10284, 10283, 10283, 10285, 10288, 10287, 10287, 10289, 10292, 10292, 10293, 10295, 10298, 10297, 10296, 10297, 10299, 10297, 10297, 10298, 10301, 10300, 10300, 10302, 10305, 10304, 10305, 10307, 10310, 10309, 10308, 10309, 10312, 10310, 10310, 10312, 10315, 10314, 10314, 10316, 10320, 10320, 10320, 10323, 10326, 10325, 10324, 10325, 10327, 10326, 10325, 10327, 10330, 10328, 10328, 10330, 10333, 10333, 10333, 10335, 10338, 10336, 10336, 10337, 10339, 10337, 10336, 10338, 10341, 10339, 10339, 10341, 10345, 10344, 10345, 10347, 10350, 10349, 10348, 10349, 10352, 10350, 10350, 10352, 10355, 10354, 10354, 10356, 10360, 10359, 10360, 10363, 10366, 10365, 10365, 10366, 10368, 10367, 10367, 10368, 10372, 10370, 10371, 10373, 10376, 10376, 10377, 10379, 10382, 10381, 10380, 10381, 10383, 10382, 10381, 10383, 10386, 10384, 10384, 10386, 10389, 10389, 10389, 10391, 10394, 10392, 10392, 10393, 10395, 10393, 10392, 10394, 10397, 10395, 10395, 10397, 10400, 10400, 10401, 10403, 10406, 10405, 10404, 10405, 10408, 10406, 10406, 10408, 10411, 10410, 10410, 10413, 10416, 10416, 10417, 10419, 10422, 10421, 10420, 10421, 10423, 10421, 10421, 10422, 10425, 10424, 10424, 10426, 10429, 10428, 10429, 10431, 10434, 10433, 10432, 10433, 10435, 10434, 10434, 10435, 10439, 10437, 10438, 10440, 10444, 10443, 10444, 10447, 10450, 10449, 10449, 10450, 10452, 10451, 10451, 10452, 10456, 10454, 10455, 10457, 10460, 10460, 10461, 10463, 10466, 10465, 10464, 10465, 10467, 10465, 10465, 10467, 10469, 10468, 10468, 10470, 10473, 10472, 10473, 10475, 10478, 10476, 10476, 10477, 10479, 10477, 10477, 10478, 10481, 10480, 10480, 10482, 10485, 10484, 10485, 10487, 10490, 10488, 10488, 10489, 10491, 10489, 10488, 10490, 10493, 10491, 10491, 10493, 10497, 10496, 10497, 10499, 10502, 10501, 10500, 10501, 10504, 10502, 10502, 10503, 10507, 10506, 10506, 10508, 10512, 10511, 10512, 10515, 10518, 10517, 10516, 10518, 10520, 10519, 10519, 10520, 10523, 10522, 10523, 10525, 10528, 10528, 10529, 10531, 10534, 10533, 10532, 10533, 10535, 10533, 10533, 10534, 10537, 10536, 10536, 10538, 10541, 10540, 10541, 10543, 10546, 10544, 10544, 10545, 10547, 10545, 10545, 10546, 10549, 10548, 10548, 10550, 10553, 10552, 10553, 10555, 10558, 10556, 10556, 10557, 10559, 10557, 10556, 10558, 10561, 10559, 10559, 10561, 10565, 10564, 10565, 10567, 10570, 10569, 10568, 10569, 10572, 10570, 10570, 10572, 10575, 10574, 10574, 10576, 10580, 10580, 10580, 10583, 10586, 10584, 10584, 10585, 10587, 10585, 10585, 10586, 10589, 10588, 10588, 10589, 10593, 10592, 10593, 10595, 10598, 10597, 10596, 10597, 10600, 10598, 10598, 10600, 10603, 10602, 10602, 10604, 10608, 10607, 10608, 10611, 10614, 10613, 10612, 10613, 10615, 10613, 10613, 10615, 10617, 10616, 10616, 10618, 10621, 10620, 10621, 10623, 10626, 10624, 10624, 10625, 10627, 10625, 10625, 10626, 10629, 10628, 10628, 10630, 10633, 10632, 10633, 10635, 10638, 10636, 10636, 10636, 10639, 10637, 10636, 10638, 10641, 10639, 10639, 10641, 10644, 10644, 10644, 10647, 10650, 10649, 10648, 10649, 10652, 10650, 10650, 10652, 10655, 10654, 10654, 10656, 10660, 10660, 10660, 10663, 10666, 10665, 10664, 10665, 10667, 10665, 10665, 10666, 10669, 10668, 10668, 10670, 10673, 10672, 10673, 10675, 10678, 10676, 10676, 10677, 10679, 10677, 10677, 10678, 10681, 10680, 10680, 10681, 10685, 10684, 10685, 10687, 10690, 10688, 10688, 10688, 10691, 10689, 10688, 10690, 10693, 10691, 10691, 10693, 10696, 10696, 10696, 10699, 10702, 10701, 10700, 10701, 10704, 10702, 10702, 10704, 10707, 10706, 10706, 10708, 10712, 10711, 10712, 10715, 10718, 10716, 10716, 10717, 10719, 10717, 10717, 10718, 10721, 10720, 10720, 10722, 10725, 10724, 10725, 10727, 10730, 10728, 10728, 10729, 10731, 10729, 10728, 10730, 10733, 10731, 10731, 10733, 10737, 10736, 10737, 10739, 10742, 10740, 10740, 10741, 10743, 10741, 10741, 10742, 10745, 10744, 10744, 10746, 10749, 10748, 10749, 10751, 10754, 10752, 10752, 10752, 10755, 10753, 10752, 10754, 10757, 10755, 10755, 10757, 10760, 10760, 10760, 10763, 10766, 10765, 10764, 10765, 10768, 10766, 10766, 10768, 10771, 10770, 10770, 10772, 10776, 10775, 10776, 10779, 10782, 10780, 10780, 10781, 10783, 10781, 10781, 10782, 10785, 10784, 10784, 10786, 10789, 10788, 10789, 10791, 10794, 10792, 10792, 10792, 10795, 10793, 10792, 10794, 10797, 10795, 10795, 10797, 10801, 10800, 10801, 10803, 10806, 10804, 10804, 10805, 10807, 10805, 10805, 10806, 10809, 10808, 10808, 10810, 10813, 10812, 10813, 10815, 10818, 10816, 10816, 10816, 10819, 10817, 10816, 10818, 10821, 10819, 10819, 10821, 10824, 10824, 10824, 10827, 10830, 10828, 10828, 10829, 10832, 10830, 10830, 10832, 10835, 10834, 10834, 10836, 10840, 10839, 10840, 10843, 10846, 10845, 10844, 10845, 10848, 10846, 10845, 10847, 10850, 10848, 10848, 10850, 10854, 10853, 10853, 10855, 10858, 10856, 10855, 10856, 10858, 10855, 10855, 10856, 10858, 10857, 10856, 10858, 10861, 10860, 10861, 10863, 10866, 10864, 10864, 10865, 10867, 10866, 10865, 10867, 10870, 10869, 10870, 10872, 10876, 10875, 10876, 10879, 10882, 10880, 10880, 10881, 10883, 10881, 10881, 10883, 10885, 10884, 10884, 10886, 10889, 10888, 10889, 10891, 10894, 10892, 10892, 10892, 10895, 10893, 10892, 10894, 10897, 10895, 10895, 10897, 10901, 10900, 10901, 10903, 10906, 10904, 10904, 10905, 10907, 10905, 10904, 10906, 10909, 10907, 10907, 10909, 10913, 10912, 10913, 10915, 10918, 10916, 10916, 10917, 10919, 10917, 10916, 10918, 10921, 10919, 10919, 10921, 10925, 10924, 10925, 10927, 10930, 10928, 10928, 10929, 10931, 10929, 10928, 10930, 10933, 10931, 10931, 10933, 10937, 10936, 10937, 10939, 10942, 10940, 10940, 10940, 10943, 10941, 10940, 10942, 10945, 10943, 10943, 10945, 10949, 10948, 10949, 10951, 10954, 10952, 10952, 10952, 10955, 10953, 10952, 10954, 10957, 10955, 10955, 10957, 10961, 10960, 10961, 10963, 10966, 10964, 10964, 10964, 10967, 10965, 10964, 10966, 10969, 10967, 10967, 10969, 10973, 10972, 10973, 10975, 10978, 10976, 10976, 10976, 10979, 10977, 10976, 10978, 10981, 10979, 10979, 10981, 10985, 10984, 10985, 10987, 10990, 10988, 10988, 10988, 10991, 10989, 10988, 10990, 10993, 10991, 10991, 10993, 10997, 10996, 10997, 10999, 11002, 11000, 11000, 11000, 11003, 11001, 11000, 11002, 11005, 11003, 11003, 11005, 11009, 11008, 11009, 11011, 11014, 11012, 11012, 11012, 11015, 11013, 11012, 11014, 11017, 11015, 11015, 11017, 11021, 11020, 11021, 11023, 11026, 11024, 11024, 11024, 11027, 11025, 11024, 11026, 11029, 11027, 11027, 11029, 11033, 11032, 11033, 11035, 11038, 11036, 11036, 11036, 11039, 11037, 11036, 11038, 11041, 11039, 11039, 11041, 11045, 11044, 11045, 11047, 11050, 11048, 11048, 11048, 11051, 11049, 11048, 11050, 11053, 11051, 11051, 11053, 11057, 11056, 11057, 11059, 11062, 11060, 11060, 11060, 11063, 11061, 11060, 11062, 11065, 11063, 11063, 11065, 11069, 11068, 11069, 11071, 11074, 11072, 11072, 11072, 11075, 11073, 11072, 11074, 11077, 11075, 11075, 11077, 11081, 11080, 11080, 11083, 11086, 11084, 11084, 11084, 11087, 11085, 11084, 11086, 11089, 11087, 11087, 11089, 11093, 11092, 11093, 11095, 11098, 11096, 11095, 11096, 11099, 11097, 11096, 11098, 11101, 11099, 11099, 11101, 11105, 11104, 11104, 11107, 11110, 11108, 11108, 11109, 11111, 11109, 11109, 11110, 11113, 11112, 11112, 11114, 11117, 11116, 11117, 11119, 11122, 11120, 11119, 11120, 11122, 11120, 11119, 11120, 11123, 11121, 11121, 11123, 11126, 11125, 11125, 11127, 11130, 11128, 11127, 11128, 11130, 11128, 11127, 11129, 11132, 11130, 11130, 11132, 11136, 11135, 11136, 11138, 11142, 11140, 11140, 11141, 11144, 11142, 11142, 11144, 11147, 11146, 11146, 11149, 11152, 11152, 11152, 11155, 11158, 11156, 11155, 11156, 11158, 11156, 11155, 11156, 11159, 11157, 11157, 11159, 11162, 11161, 11161, 11163, 11166, 11164, 11163, 11164, 11166, 11164, 11164, 11165, 11168, 11167, 11167, 11169, 11172, 11172, 11172, 11175, 11178, 11176, 11176, 11176, 11179, 11177, 11176, 11178, 11181, 11179, 11179, 11181, 11185, 11184, 11184, 11187, 11190, 11188, 11187, 11188, 11191, 11189, 11188, 11190, 11193, 11191, 11191, 11193, 11197, 11196, 11196, 11199, 11202, 11200, 11199, 11200, 11203, 11201, 11200, 11202, 11205, 11203, 11203, 11205, 11209, 11208, 11208, 11211, 11214, 11212, 11211, 11212, 11215, 11213, 11212, 11214, 11217, 11215, 11215, 11217, 11221, 11220, 11220, 11223, 11226, 11224, 11223, 11224, 11227, 11225, 11224, 11226, 11229, 11227, 11227, 11229, 11233, 11232, 11232, 11235, 11238, 11236, 11236, 11237, 11239, 11237, 11237, 11238, 11241, 11240, 11240, 11242, 11245, 11244, 11245, 11247, 11250, 11248, 11247, 11248, 11250, 11248, 11247, 11248, 11251, 11249, 11249, 11250, 11254, 11253, 11253, 11255, 11258, 11256, 11255, 11256, 11258, 11256, 11255, 11257, 11260, 11258, 11258, 11260, 11264, 11263, 11264, 11266, 11270, 11268, 11268, 11269, 11272, 11270, 11270, 11272, 11275, 11274, 11274, 11276, 11280, 11280, 11280, 11283, 11286, 11284, 11283, 11284, 11286, 11284, 11283, 11284, 11287, 11285, 11285, 11287, 11290, 11289, 11289, 11291, 11294, 11292, 11291, 11292, 11294, 11292, 11292, 11293, 11296, 11295, 11295, 11297, 11300, 11300, 11300, 11303, 11306, 11304, 11303, 11304, 11307, 11305, 11304, 11306, 11309, 11307, 11307, 11309, 11313, 11312, 11312, 11315, 11318, 11316, 11315, 11316, 11318, 11316, 11316, 11317, 11321, 11319, 11319, 11321, 11324, 11324, 11324, 11327, 11330, 11328, 11328, 11329, 11331, 11329, 11329, 11330, 11333, 11332, 11332, 11334, 11337, 11336, 11337, 11339, 11342, 11340, 11339, 11339, 11341, 11339, 11338, 11339, 11342, 11340, 11340, 11342, 11345, 11344, 11344, 11347, 11350, 11348, 11348, 11349, 11351, 11350, 11349, 11351, 11355, 11353, 11354, 11356, 11360, 11359, 11360, 11362, 11366, 11364, 11363, 11364, 11366, 11364, 11363, 11364, 11367, 11365, 11365, 11367, 11370, 11369, 11369, 11371, 11374, 11372, 11371, 11372, 11374, 11372, 11371, 11373, 11376, 11375, 11375, 11377, 11380, 11379, 11380, 11382, 11386, 11384, 11383, 11384, 11387, 11385, 11384, 11386, 11389, 11387, 11387, 11389, 11393, 11392, 11392, 11395, 11398, 11396, 11395, 11396, 11398, 11396, 11396, 11397, 11400, 11399, 11399, 11401, 11404, 11404, 11404, 11407, 11410, 11408, 11407, 11408, 11411, 11409, 11408, 11410, 11413, 11412, 11411, 11413, 11417, 11416, 11417, 11419, 11422, 11420, 11419, 11420, 11422, 11419, 11419, 11420, 11423, 11421, 11420, 11422, 11425, 11424, 11425, 11427, 11430, 11428, 11427, 11428, 11430, 11428, 11428, 11429, 11432, 11431, 11431, 11433, 11436, 11436, 11436, 11438, 11442, 11440, 11439, 11440, 11443, 11441, 11440, 11442, 11445, 11443, 11443, 11445, 11449, 11448, 11448, 11451, 11454, 11452, 11451, 11452, 11455, 11453, 11452, 11454, 11457, 11455, 11455, 11457, 11461, 11460, 11461, 11463, 11466, 11464, 11463, 11464, 11466, 11463, 11463, 11464, 11467, 11465, 11464, 11466, 11469, 11468, 11469, 11471, 11474, 11472, 11471, 11472, 11474, 11472, 11472, 11473, 11476, 11475, 11475, 11477, 11480, 11480, 11480, 11482, 11486, 11484, 11483, 11484, 11487, 11484, 11484, 11485, 11489, 11487, 11487, 11489, 11492, 11492, 11492, 11494, 11498, 11496, 11495, 11496, 11499, 11497, 11496, 11498, 11501, 11500, 11500, 11501, 11505, 11504, 11505, 11507, 11510, 11508, 11507, 11507, 11509, 11507, 11506, 11507, 11510, 11508, 11508, 11510, 11513, 11512, 11512, 11515, 11518, 11516, 11516, 11517, 11519, 11518, 11517, 11519, 11523, 11521, 11522, 11524, 11528, 11527, 11528, 11530, 11534, 11532, 11531, 11532, 11534, 11532, 11531, 11532, 11535, 11533, 11533, 11535, 11538, 11537, 11537, 11539, 11542, 11540, 11539, 11540, 11542, 11540, 11539, 11541, 11544, 11542, 11542, 11544, 11548, 11547, 11548, 11550, 11554, 11552, 11551, 11552, 11555, 11552, 11552, 11554, 11557, 11555, 11555, 11557, 11561, 11560, 11560, 11562, 11566, 11564, 11563, 11564, 11567, 11565, 11564, 11566, 11569, 11567, 11567, 11569, 11573, 11572, 11572, 11575, 11578, 11576, 11575, 11576, 11578, 11575, 11574, 11576, 11579, 11577, 11576, 11578, 11581, 11580, 11581, 11583, 11586, 11584, 11583, 11584, 11586, 11584, 11583, 11585, 11588, 11587, 11587, 11589, 11592, 11591, 11592, 11594, 11598, 11596, 11595, 11596, 11599, 11596, 11596, 11597, 11601, 11599, 11599, 11601, 11604, 11604, 11604, 11606, 11610, 11608, 11607, 11608, 11611, 11609, 11608, 11610, 11613, 11611, 11611, 11613, 11617, 11616, 11616, 11619, 11622, 11620, 11619, 11620, 11622, 11619, 11618, 11620, 11623, 11621, 11620, 11622, 11625, 11624, 11625, 11627, 11630, 11628, 11627, 11628, 11630, 11628, 11627, 11629, 11632, 11630, 11630, 11632, 11636, 11635, 11636, 11638, 11642, 11640, 11639, 11640, 11643, 11641, 11640, 11642, 11645, 11643, 11643, 11645, 11649, 11648, 11648, 11651, 11654, 11652, 11651, 11651, 11654, 11651, 11650, 11652, 11655, 11653, 11652, 11654, 11657, 11656, 11657, 11659, 11662, 11660, 11659, 11660, 11662, 11660, 11659, 11661, 11664, 11663, 11662, 11665, 11668, 11667, 11668, 11670, 11674, 11672, 11671, 11672, 11674, 11672, 11672, 11673, 11677, 11675, 11675, 11677, 11680, 11680, 11680, 11682, 11686, 11684, 11683, 11684, 11687, 11685, 11684, 11686, 11689, 11687, 11687, 11689, 11693, 11692, 11692, 11695, 11698, 11696, 11695, 11696, 11698, 11696, 11695, 11696, 11699, 11697, 11697, 11699, 11702, 11701, 11701, 11703, 11706, 11704, 11702, 11703, 11705, 11702, 11701, 11703, 11706, 11704, 11703, 11705, 11709, 11708, 11708, 11710, 11714, 11712, 11711, 11713, 11715, 11713, 11713, 11715, 11718, 11717, 11717, 11720, 11724, 11723, 11724, 11726, 11730, 11728, 11727, 11728, 11730, 11728, 11727, 11729, 11731, 11730, 11729, 11731, 11734, 11733, 11733, 11735, 11738, 11736, 11734, 11735, 11737, 11735, 11734, 11735, 11738, 11736, 11736, 11738, 11741, 11740, 11740, 11743, 11746, 11744, 11743, 11744, 11746, 11744, 11744, 11745, 11748, 11747, 11747, 11749, 11752, 11751, 11752, 11754, 11758, 11756, 11755, 11756, 11758, 11756, 11756, 11757, 11760, 11759, 11759, 11761, 11764, 11764, 11764, 11766, 11770, 11768, 11767, 11768, 11771, 11769, 11768, 11770, 11773, 11771, 11771, 11773, 11777, 11776, 11776, 11779, 11782, 11780, 11779, 11779, 11782, 11779, 11778, 11780, 11782, 11781, 11780, 11782, 11785, 11784, 11785, 11787, 11790, 11788, 11787, 11788, 11790, 11788, 11787, 11789, 11792, 11790, 11790, 11792, 11796, 11795, 11796, 11798, 11802, 11800, 11799, 11800, 11803, 11801, 11800, 11802, 11805, 11803, 11803, 11805, 11809, 11808, 11808, 11811, 11814, 11812, 11811, 11811, 11813, 11811, 11810, 11811, 11814, 11812, 11812, 11814, 11817, 11816, 11816, 11819, 11822, 11820, 11819, 11820, 11822, 11820, 11820, 11821, 11824, 11823, 11823, 11825, 11829, 11828, 11828, 11830, 11834, 11832, 11831, 11831, 11834, 11831, 11830, 11832, 11834, 11833, 11832, 11834, 11837, 11836, 11836, 11839, 11842, 11840, 11839, 11840, 11842, 11840, 11840, 11841, 11844, 11843, 11843, 11845, 11848, 11848, 11848, 11850, 11854, 11852, 11851, 11851, 11854, 11851, 11850, 11852, 11855, 11853, 11852, 11854, 11857, 11856, 11857, 11859, 11862, 11860, 11859, 11860, 11862, 11860, 11859, 11861, 11864, 11862, 11862, 11864, 11868, 11867, 11868, 11870, 11874, 11872, 11871, 11872, 11875, 11873, 11872, 11874, 11877, 11875, 11875, 11877, 11881, 11880, 11880, 11883, 11886, 11884, 11883, 11883, 11885, 11883, 11882, 11884, 11886, 11884, 11884, 11886, 11889, 11888, 11888, 11891, 11894, 11892, 11891, 11892, 11894, 11892, 11891, 11893, 11896, 11894, 11894, 11896, 11900, 11899, 11900, 11902, 11906, 11904, 11903, 11904, 11907, 11905, 11904, 11906, 11909, 11907, 11907, 11909, 11913, 11912, 11912, 11914, 11918, 11916, 11915, 11916, 11918, 11915, 11915, 11916, 11919, 11917, 11917, 11918, 11922, 11920, 11921, 11923, 11926, 11924, 11922, 11923, 11925, 11923, 11922, 11923, 11926, 11924, 11924, 11926, 11929, 11928, 11928, 11930, 11934, 11932, 11931, 11932, 11934, 11932, 11931, 11933, 11936, 11934, 11934, 11936, 11940, 11939, 11940, 11942, 11946, 11944, 11943, 11944, 11947, 11945, 11944, 11946, 11949, 11947, 11947, 11949, 11953, 11952, 11952, 11955, 11958, 11956, 11955, 11955, 11957, 11955, 11954, 11955, 11958, 11956, 11956, 11958, 11961, 11960, 11960, 11962, 11966, 11964, 11963, 11964, 11966, 11964, 11964, 11965, 11968, 11967, 11967, 11969, 11972, 11972, 11972, 11974, 11978, 11976, 11975, 11975, 11977, 11975, 11974, 11975, 11978, 11976, 11976, 11978, 11981, 11980, 11980, 11982, 11986, 11984, 11983, 11984, 11986, 11984, 11984, 11985, 11988, 11987, 11987, 11989, 11992, 11992, 11992, 11994, 11998, 11996, 11995, 11995, 11997, 11995, 11994, 11995, 11998, 11996, 11996, 11998, 12001, 12000, 12000, 12002, 12006, 12004, 12003, 12004, 12006, 12004, 12004, 12005, 12008, 12007, 12007, 12009, 12012, 12012, 12012, 12014, 12018, 12016, 12015, 12015, 12018, 12015, 12014, 12016, 12019, 12017, 12016, 12018, 12021, 12020, 12020, 12023, 12026, 12024, 12023, 12024, 12026, 12024, 12023, 12025, 12028, 12026, 12026, 12028, 12032, 12031, 12032, 12034, 12038, 12036, 12035, 12036, 12039, 12036, 12036, 12038, 12041, 12039, 12039, 12041, 12045, 12044, 12044, 12046, 12050, 12048, 12047, 12047, 12050, 12047, 12047, 12048, 12051, 12049, 12048, 12050, 12054, 12052, 12053, 12055, 12058, 12055, 12054, 12055, 12057, 12054, 12054, 12055, 12058, 12056, 12055, 12057, 12061, 12060, 12060, 12062, 12066, 12064, 12063, 12064, 12066, 12064, 12064, 12065, 12068, 12067, 12067, 12069, 12073, 12072, 12072, 12074, 12078, 12076, 12075, 12075, 12077, 12075, 12074, 12075, 12078, 12076, 12076, 12078, 12081, 12080, 12080, 12082, 12086, 12084, 12083, 12084, 12086, 12084, 12083, 12085, 12088, 12087, 12087, 12089, 12092, 12092, 12092, 12094, 12098, 12096, 12095, 12095, 12097, 12095, 12094, 12095, 12098, 12096, 12096, 12098, 12101, 12100, 12100, 12102, 12106, 12104, 12103, 12104, 12106, 12104, 12103, 12105, 12108, 12107, 12107, 12109, 12112, 12112, 12112, 12114, 12118, 12116, 12115, 12115, 12117, 12115, 12114, 12115, 12118, 12116, 12116, 12118, 12121, 12120, 12120, 12122, 12126, 12124, 12123, 12124, 12126, 12124, 12123, 12125, 12128, 12126, 12126, 12129, 12132, 12131, 12132, 12134, 12138, 12136, 12135, 12136, 12138, 12135, 12135, 12136, 12139, 12137, 12137, 12138, 12142, 12140, 12141, 12143, 12146, 12143, 12142, 12143, 12145, 12142, 12142, 12143, 12146, 12144, 12144, 12145, 12149, 12148, 12148, 12150, 12154, 12152, 12151, 12152, 12154, 12152, 12151, 12153, 12156, 12154, 12154, 12156, 12160, 12159, 12160, 12162, 12166, 12164, 12163, 12164, 12167, 12164, 12164, 12165, 12169, 12167, 12167, 12169, 12173, 12172, 12172, 12174, 12178, 12176, 12175, 12175, 12178, 12175, 12174, 12176, 12179, 12177, 12176, 12178, 12182, 12180, 12181, 12183, 12186, 12183, 12182, 12183, 12185, 12182, 12181, 12183, 12186, 12184, 12183, 12185, 12189, 12188, 12188, 12190, 12194, 12192, 12191, 12192, 12194, 12192, 12191, 12193, 12196, 12195, 12195, 12197, 12200, 12199, 12200, 12202, 12206, 12204, 12203, 12203, 12206, 12203, 12203, 12204, 12207, 12205, 12204, 12206, 12210, 12208, 12209, 12211, 12214, 12211, 12210, 12211, 12213, 12210, 12209, 12211, 12214, 12212, 12211, 12213, 12217, 12216, 12216, 12218, 12222, 12220, 12219, 12220, 12222, 12220, 12219, 12221, 12224, 12223, 12222, 12225, 12228, 12227, 12228, 12230, 12234, 12232, 12231, 12231, 12234, 12231, 12230, 12232, 12235, 12233, 12232, 12234, 12238, 12236, 12237, 12239, 12242, 12239, 12238, 12239, 12241, 12238, 12237, 12239, 12242, 12240, 12239, 12241, 12245, 12244, 12244, 12246, 12250, 12248, 12247, 12248, 12250, 12248, 12247, 12249, 12252, 12251, 12250, 12253, 12256, 12255, 12256, 12258, 12262, 12260, 12259, 12259, 12262, 12259, 12258, 12260, 12263, 12261, 12260, 12262, 12266, 12264, 12265, 12267, 12270, 12267, 12266, 12267, 12269, 12266, 12265, 12267, 12270, 12268, 12267, 12269, 12273, 12272, 12272, 12274, 12278, 12276, 12275, 12276, 12278, 12276, 12275, 12277, 12280, 12279, 12279, 12281, 12284, 12284, 12284, 12286, 12290, 12288, 12286, 12287, 12289, 12287, 12286, 12287, 12290, 12288, 12288, 12290, 12293, 12292, 12292, 12294, 12298, 12296, 12295, 12296, 12298, 12296, 12295, 12297, 12300, 12299, 12298, 12301, 12304, 12303, 12304, 12306, 12310, 12308, 12306, 12307, 12309, 12307, 12306, 12307, 12310, 12308, 12308, 12310, 12313, 12312, 12312, 12314, 12318, 12316, 12315, 12316, 12318, 12316, 12315, 12317, 12320, 12318, 12318, 12320, 12324, 12323, 12324, 12326, 12330, 12328, 12327, 12327, 12330, 12327, 12326, 12328, 12331, 12329, 12328, 12330, 12334, 12332, 12333, 12335, 12338, 12335, 12334, 12335, 12337, 12334, 12333, 12335, 12338, 12336, 12335, 12337, 12341, 12340, 12340, 12342, 12346, 12344, 12343, 12344, 12346, 12344, 12343, 12345, 12348, 12346, 12346, 12349, 12352, 12351, 12352, 12354, 12358, 12356, 12355, 12355, 12358, 12355, 12354, 12356, 12359, 12357, 12356, 12358, 12362, 12360, 12361, 12363, 12366, 12363, 12362, 12363, 12365, 12362, 12361, 12363, 12366, 12364, 12363, 12365, 12369, 12368, 12368, 12370, 12374, 12372, 12371, 12372, 12374, 12372, 12371, 12373, 12376, 12374, 12374, 12376, 12380, 12379, 12380, 12382, 12386, 12384, 12383, 12383, 12386, 12383, 12382, 12384, 12387, 12385, 12384, 12386, 12390, 12388, 12388, 12391, 12394, 12391, 12390, 12391, 12393, 12390, 12389, 12391, 12394, 12392, 12391, 12393, 12397, 12396, 12396, 12398, 12402, 12400, 12399, 12400, 12402, 12400, 12399, 12401, 12404, 12402, 12402, 12404, 12408, 12407, 12408, 12410, 12414, 12412, 12411, 12411, 12414, 12411, 12410, 12412, 12415, 12413, 12412, 12414, 12417, 12416, 12416, 12418, 12422, 12419, 12418, 12419, 12421, 12418, 12418, 12419, 12422, 12420, 12420, 12421, 12425, 12424, 12424, 12426, 12430, 12427, 12426, 12427, 12429, 12427, 12426, 12427, 12430, 12428, 12428, 12430, 12433, 12432, 12432, 12434, 12438, 12435, 12434, 12435, 12437, 12434, 12433, 12435, 12438, 12436, 12435, 12437, 12441, 12440, 12440, 12442, 12446, 12444, 12443, 12444, 12446, 12444, 12443, 12445, 12448, 12446, 12446, 12448, 12452, 12451, 12452, 12454, 12458, 12456, 12455, 12455, 12458, 12455, 12454, 12456, 12459, 12457, 12456, 12458, 12462, 12460, 12460, 12462, 12466, 12463, 12462, 12463, 12465, 12462, 12461, 12463, 12466, 12464, 12463, 12465, 12469, 12468, 12468, 12470, 12474, 12472, 12471, 12472, 12474, 12472, 12471, 12473, 12476, 12474, 12474, 12476, 12480, 12479, 12480, 12482, 12486, 12484, 12483, 12483, 12486, 12483, 12482, 12484, 12487, 12485, 12484, 12486, 12490, 12488, 12488, 12490, 12494, 12491, 12490, 12491, 12493, 12490, 12489, 12491, 12494, 12492, 12491, 12493, 12497, 12496, 12496, 12498, 12502, 12500, 12499, 12500, 12502, 12500, 12499, 12501, 12504, 12502, 12502, 12504, 12508, 12507, 12508, 12510, 12514, 12511, 12510, 12511, 12513, 12511, 12510, 12512, 12515, 12512, 12512, 12514, 12517, 12516, 12516, 12518, 12522, 12519, 12518, 12519, 12521, 12519, 12518, 12519, 12522, 12520, 12520, 12522, 12525, 12524, 12524, 12526, 12530, 12527, 12526, 12527, 12529, 12526, 12525, 12527, 12530, 12528, 12527, 12529, 12533, 12532, 12532, 12534, 12538, 12536, 12535, 12536, 12538, 12536, 12535, 12537, 12540, 12538, 12538, 12540, 12544, 12543, 12544, 12546, 12550, 12547, 12546, 12547, 12550, 12547, 12546, 12548, 12551, 12548, 12548, 12550, 12553, 12552, 12552, 12554, 12558, 12555, 12554, 12555, 12557, 12554, 12554, 12555, 12558, 12556, 12556, 12557, 12561, 12560, 12560, 12562, 12566, 12563, 12562, 12563, 12565, 12563, 12562, 12563, 12566, 12564, 12564, 12566, 12569, 12568, 12568, 12570, 12574, 12571, 12570, 12571, 12573, 12570, 12569, 12571, 12574, 12572, 12571, 12573, 12577, 12576, 12576, 12578, 12582, 12580, 12579, 12580, 12582, 12580, 12579, 12581, 12584, 12582, 12582, 12584, 12588, 12587, 12588, 12590, 12594, 12591, 12590, 12591, 12594, 12591, 12590, 12592, 12595, 12593, 12592, 12594, 12597, 12596, 12596, 12598, 12602, 12599, 12598, 12599, 12601, 12598, 12597, 12598, 12602, 12599, 12599, 12601, 12605, 12603, 12604, 12606, 12610, 12608, 12607, 12608, 12610, 12608, 12607, 12609, 12612, 12610, 12610, 12612, 12616, 12615, 12616, 12618, 12622, 12619, 12618, 12619, 12621, 12619, 12618, 12619, 12622, 12620, 12620, 12622, 12625, 12624, 12624, 12626, 12630, 12627, 12626, 12627, 12629, 12627, 12626, 12627, 12630, 12628, 12628, 12630, 12633, 12632, 12632, 12634, 12638, 12635, 12634, 12635, 12637, 12634, 12633, 12634, 12637, 12635, 12635, 12637, 12641, 12639, 12640, 12642, 12646, 12644, 12643, 12644, 12646, 12644, 12644, 12645, 12649, 12647, 12647, 12649, 12653, 12652, 12652, 12654, 12658, 12655, 12654, 12654, 12656, 12653, 12652, 12653, 12656, 12654, 12653, 12655, 12658, 12656, 12656, 12658, 12662, 12659, 12658, 12659, 12661, 12659, 12658, 12660, 12663, 12662, 12662, 12664, 12668, 12667, 12668, 12670, 12674, 12672, 12671, 12671, 12674, 12671, 12670, 12672, 12675, 12673, 12672, 12674, 12678, 12676, 12676, 12678, 12682, 12679, 12678, 12679, 12681, 12678, 12677, 12678, 12681, 12679, 12679, 12681, 12685, 12683, 12684, 12686, 12690, 12687, 12687, 12687, 12690, 12688, 12687, 12689, 12692, 12690, 12690, 12692, 12696, 12695, 12696, 12698, 12702, 12699, 12698, 12699, 12701, 12699, 12698, 12699, 12702, 12700, 12700, 12702, 12705, 12704, 12704, 12706, 12710, 12707, 12706, 12707, 12709, 12706, 12705, 12707, 12710, 12708, 12707, 12709, 12713, 12712, 12712, 12714, 12718, 12715, 12714, 12715, 12717, 12714, 12714, 12715, 12718, 12716, 12716, 12717, 12721, 12720, 12720, 12722, 12726, 12723, 12722, 12723, 12725, 12723, 12722, 12723, 12726, 12724, 12724, 12726, 12729, 12728, 12728, 12730, 12734, 12731, 12730, 12731, 12733, 12730, 12729, 12731, 12734, 12732, 12731, 12733, 12737, 12735, 12736, 12738, 12742, 12739, 12738, 12739, 12742, 12739, 12739, 12740, 12744, 12742, 12742, 12744, 12748, 12747, 12748, 12750, 12754, 12751, 12751, 12751, 12754, 12751, 12750, 12752, 12755, 12753, 12752, 12754, 12758, 12756, 12757, 12758, 12762, 12759, 12757, 12758, 12760, 12757, 12756, 12757, 12759, 12757, 12756, 12758, 12761, 12760, 12760, 12762, 12766, 12763, 12762, 12763, 12766, 12763, 12763, 12764, 12768, 12766, 12766, 12768, 12772, 12771, 12772, 12774, 12778, 12775, 12774, 12775, 12778, 12775, 12774, 12776, 12779, 12777, 12776, 12778, 12782, 12780, 12780, 12782, 12786, 12783, 12782, 12782, 12785, 12782, 12781, 12782, 12785, 12783, 12783, 12785, 12788, 12787, 12788, 12790, 12794, 12791, 12791, 12792, 12794, 12792, 12791, 12793, 12796, 12795, 12795, 12797, 12801, 12799, 12800, 12802, 12806, 12803, 12802, 12803, 12805, 12802, 12801, 12802, 12805, 12802, 12801, 12803, 12806, 12805, 12805, 12807, 12810, 12807, 12806, 12806, 12808, 12806, 12805, 12806, 12809, 12807, 12807, 12809, 12812, 12811, 12812, 12814, 12818, 12815, 12815, 12816, 12818, 12816, 12815, 12817, 12820, 12818, 12818, 12820, 12824, 12823, 12824, 12826, 12830, 12827, 12826, 12827, 12829, 12827, 12826, 12827, 12830, 12828, 12828, 12830, 12833, 12832, 12832, 12834, 12838, 12835, 12834, 12835, 12837, 12834, 12833, 12835, 12838, 12836, 12835, 12837, 12841, 12840, 12840, 12842, 12846, 12843, 12842, 12843, 12845, 12842, 12841, 12843, 12846, 12844, 12843, 12845, 12849, 12848, 12848, 12850, 12854, 12851, 12850, 12851, 12853, 12850, 12850, 12851, 12854, 12852, 12852, 12853, 12857, 12856, 12856, 12858, 12862, 12859, 12858, 12858, 12861, 12858, 12857, 12858, 12861, 12859, 12859, 12861, 12864, 12863, 12864, 12866, 12870, 12867, 12867, 12868, 12870, 12868, 12867, 12869, 12873, 12871, 12871, 12873, 12877, 12876, 12876, 12878, 12882, 12879, 12878, 12878, 12880, 12877, 12876, 12877, 12880, 12878, 12877, 12878, 12882, 12880, 12880, 12882, 12886, 12883, 12882, 12883, 12885, 12883, 12882, 12884, 12887, 12885, 12885, 12888, 12892, 12891, 12891, 12894, 12898, 12895, 12895, 12895, 12898, 12895, 12895, 12896, 12899, 12897, 12897, 12898, 12902, 12900, 12901, 12902, 12906, 12903, 12901, 12902, 12904, 12901, 12899, 12901, 12903, 12901, 12900, 12902, 12905, 12904, 12904, 12906, 12910, 12907, 12906, 12907, 12910, 12907, 12906, 12908, 12912, 12910, 12910, 12912, 12916, 12915, 12915, 12918, 12922, 12919, 12918, 12919, 12921, 12919, 12918, 12919, 12923, 12920, 12920, 12922, 12925, 12924, 12924, 12926, 12930, 12927, 12926, 12927, 12929, 12926, 12925, 12927, 12930, 12928, 12927, 12929, 12933, 12932, 12932, 12934, 12938, 12935, 12934, 12935, 12937, 12934, 12933, 12935, 12938, 12936, 12935, 12937, 12941, 12940, 12940, 12942, 12946, 12943, 12942, 12943, 12945, 12942, 12942, 12943, 12946, 12944, 12944, 12945, 12949, 12948, 12948, 12950, 12954, 12951, 12950, 12950, 12953, 12950, 12949, 12950, 12953, 12951, 12951, 12953, 12956, 12955, 12956, 12958, 12962, 12959, 12958, 12960, 12962, 12960, 12959, 12961, 12964, 12962, 12962, 12965, 12968, 12967, 12968, 12970, 12974, 12971, 12970, 12970, 12973, 12970, 12969, 12970, 12973, 12970, 12969, 12971, 12974, 12973, 12973, 12974, 12978, 12975, 12973, 12974, 12976, 12973, 12972, 12974, 12977, 12975, 12974, 12976, 12980, 12979, 12979, 12982, 12986, 12983, 12983, 12984, 12986, 12984, 12983, 12985, 12989, 12987, 12987, 12989, 12993, 12992, 12992, 12994, 12998, 12995, 12994, 12994, 12996, 12993, 12992, 12993, 12996, 12993, 12993, 12994, 12998, 12996, 12996, 12998, 13002, 12999, 12998, 12999, 13001, 12999, 12998, 13000, 13003, 13001, 13001, 13004, 13008, 13007, 13007, 13010, 13014, 13011, 13010, 13011, 13013, 13011, 13010, 13011, 13014, 13012, 13012, 13014, 13017, 13016, 13016, 13018, 13022, 13019, 13018, 13019, 13021, 13018, 13017, 13019, 13022, 13020, 13019, 13021, 13025, 13024, 13024, 13026, 13030, 13027, 13026, 13027, 13029, 13026, 13025, 13027, 13030, 13028, 13027, 13029, 13033, 13032, 13032, 13034, 13038, 13035, 13034, 13035, 13037, 13034, 13033, 13035, 13038, 13036, 13035, 13037, 13041, 13040, 13040, 13042, 13046, 13043, 13042, 13043, 13045, 13042, 13041, 13043, 13046, 13044, 13043, 13045, 13049, 13048, 13048, 13050, 13054, 13051, 13050, 13051, 13053, 13050, 13049, 13051, 13054, 13052, 13051, 13053, 13057, 13056, 13056, 13058, 13062, 13059, 13058, 13059, 13061, 13058, 13057, 13059, 13062, 13060, 13059, 13061, 13065, 13064, 13064, 13066, 13070, 13067, 13066, 13067, 13069, 13066, 13065, 13067, 13070, 13068, 13067, 13069, 13073, 13072, 13072, 13074, 13078, 13075, 13074, 13075, 13077, 13074, 13073, 13075, 13078, 13076, 13075, 13077, 13081, 13080, 13080, 13082, 13086, 13083, 13082, 13083, 13085, 13082, 13081, 13083, 13086, 13084, 13083, 13085, 13089, 13088, 13088, 13090, 13094, 13091, 13090, 13090, 13093, 13090, 13089, 13090, 13093, 13091, 13091, 13093, 13096, 13095, 13096, 13098, 13102, 13099, 13098, 13099, 13102, 13100, 13099, 13101, 13104, 13102, 13102, 13104, 13108, 13107, 13108, 13110, 13114, 13111, 13110, 13110, 13112, 13110, 13108, 13110, 13112, 13110, 13109, 13111, 13114, 13113, 13112, 13114, 13118, 13115, 13113, 13114, 13116, 13113, 13112, 13114, 13117, 13115, 13114, 13116, 13120, 13119, 13119, 13122, 13126, 13123, 13122, 13123, 13126, 13123, 13123, 13124, 13128, 13126, 13126, 13128, 13132, 13131, 13131, 13134, 13138, 13135, 13134, 13135, 13138, 13135, 13134, 13136, 13139, 13137, 13136, 13138, 13142, 13140, 13140, 13142, 13146, 13143, 13141, 13142, 13144, 13141, 13139, 13140, 13143, 13141, 13140, 13142, 13145, 13144, 13144, 13146, 13150, 13147, 13146, 13147, 13149, 13147, 13146, 13148, 13151, 13149, 13149, 13152, 13156, 13155, 13155, 13158, 13162, 13159, 13158, 13159, 13162, 13159, 13158, 13160, 13163, 13161, 13160, 13162, 13166, 13164, 13164, 13166, 13170, 13167, 13165, 13166, 13168, 13165, 13163, 13164, 13167, 13165, 13164, 13166, 13169, 13168, 13168, 13170, 13174, 13171, 13170, 13171, 13173, 13171, 13170, 13172, 13175, 13174, 13173, 13176, 13180, 13179, 13179, 13182, 13186, 13183, 13182, 13183, 13185, 13183, 13182, 13183, 13186, 13184, 13184, 13186, 13189, 13188, 13188, 13190, 13194, 13191, 13190, 13190, 13193, 13190, 13189, 13190, 13194, 13191, 13191, 13193, 13197, 13195, 13196, 13198, 13202, 13199, 13198, 13199, 13201, 13198, 13197, 13199, 13202, 13200, 13199, 13201, 13205, 13204, 13204, 13206, 13210, 13207, 13206, 13207, 13209, 13206, 13205, 13207, 13210, 13208, 13207, 13209, 13213, 13212, 13212, 13214, 13218, 13215, 13214, 13215, 13217, 13214, 13213, 13215, 13218, 13216, 13215, 13217, 13221, 13220, 13220, 13222, 13226, 13223, 13222, 13223, 13225, 13222, 13221, 13223, 13226, 13224, 13223, 13225, 13229, 13228, 13228, 13230, 13234, 13231, 13230, 13231, 13233, 13230, 13229, 13231, 13234, 13232, 13231, 13233, 13237, 13236, 13236, 13238, 13242, 13239, 13238, 13239, 13241, 13238, 13237, 13239, 13242, 13240, 13239, 13241, 13245, 13244, 13244, 13246, 13250, 13247, 13246, 13247, 13249, 13246, 13245, 13247, 13250, 13248, 13247, 13249, 13253, 13252, 13252, 13254, 13258, 13255, 13254, 13255, 13257, 13254, 13253, 13255, 13258, 13256, 13255, 13257, 13261, 13260, 13260, 13262, 13266, 13263, 13262, 13263, 13265, 13262, 13261, 13263, 13266, 13264, 13263, 13265, 13269, 13268, 13268, 13270, 13274, 13271, 13270, 13271, 13273, 13270, 13269, 13271, 13274, 13272, 13271, 13273, 13277, 13276, 13276, 13278, 13282, 13279, 13278, 13279, 13281, 13278, 13277, 13279, 13282, 13280, 13279, 13281, 13285, 13284, 13284, 13286, 13290, 13287, 13286, 13287, 13289, 13286, 13285, 13287, 13290, 13288, 13287, 13289, 13293, 13292, 13292, 13294, 13298, 13295, 13294, 13295, 13297, 13294, 13293, 13295, 13298, 13296, 13295, 13297, 13301, 13300, 13300, 13302, 13306, 13303, 13302, 13303, 13305, 13302, 13301, 13303, 13306, 13304, 13303, 13305, 13309, 13308, 13308, 13310, 13314, 13311, 13310, 13310, 13313, 13310, 13309, 13311, 13314, 13312, 13311, 13313, 13317, 13315, 13316, 13318, 13322, 13319, 13318, 13318, 13321, 13318, 13317, 13319, 13322, 13320, 13319, 13321, 13325, 13323, 13324, 13326, 13330, 13327, 13326, 13326, 13329, 13326, 13325, 13327, 13330, 13328, 13327, 13329, 13333, 13331, 13332, 13334, 13338, 13335, 13334, 13334, 13337, 13334, 13333, 13335, 13338, 13336, 13335, 13337, 13341, 13339, 13340, 13342, 13346, 13343, 13342, 13342, 13345, 13342, 13341, 13343, 13346, 13344, 13343, 13345, 13349, 13347, 13348, 13350, 13354, 13351, 13350, 13350, 13353, 13350, 13349, 13351, 13354, 13352, 13351, 13353, 13357, 13355, 13356, 13358, 13362, 13359, 13358, 13358, 13361, 13358, 13357, 13359, 13362, 13360, 13359, 13361, 13365, 13363, 13364, 13366, 13370, 13367, 13366, 13366, 13369, 13366, 13365, 13367, 13370, 13368, 13367, 13369, 13373, 13371, 13372, 13374, 13378, 13375, 13374, 13374, 13377, 13374, 13373, 13375, 13378, 13376, 13375, 13377, 13381, 13379, 13380, 13382, 13386, 13383, 13382, 13382, 13385, 13382, 13381, 13382, 13386, 13383, 13383, 13385, 13389, 13387, 13388, 13390, 13394, 13391, 13390, 13390, 13393, 13390, 13389, 13390, 13394, 13391, 13391, 13393, 13397, 13395, 13396, 13398, 13402, 13399, 13398, 13398, 13401, 13398, 13397, 13398, 13402, 13399, 13399, 13401, 13405, 13403, 13404, 13406, 13410, 13407, 13406, 13406, 13409, 13406, 13405, 13407, 13410, 13408, 13407, 13409, 13413, 13411, 13412, 13414, 13417, 13415, 13414, 13414, 13417, 13414, 13413, 13414, 13418, 13415, 13415, 13417, 13421, 13419, 13420, 13422, 13425, 13423, 13422, 13423, 13425, 13422, 13422, 13423, 13426, 13424, 13424, 13426, 13429, 13428, 13428, 13430, 13433, 13431, 13429, 13430, 13432, 13429, 13427, 13428, 13431, 13429, 13428, 13430, 13433, 13432, 13432, 13434, 13437, 13435, 13434, 13435, 13437, 13435, 13434, 13436, 13439, 13437, 13437, 13439, 13443, 13442, 13443, 13446, 13449, 13447, 13446, 13447, 13450, 13447, 13446, 13448, 13451, 13449, 13448, 13450, 13454, 13452, 13452, 13454, 13457, 13455, 13453, 13453, 13455, 13452, 13451, 13452, 13455, 13453, 13452, 13454, 13457, 13456, 13456, 13458, 13461, 13459, 13458, 13459, 13461, 13459, 13458, 13460, 13463, 13461, 13461, 13463, 13467, 13466, 13467, 13470, 13473, 13471, 13470, 13471, 13474, 13471, 13470, 13472, 13475, 13473, 13472, 13474, 13478, 13476, 13476, 13478, 13481, 13479, 13477, 13477, 13479, 13476, 13475, 13476, 13479, 13476, 13476, 13477, 13481, 13480, 13480, 13482, 13485, 13483, 13482, 13483, 13486, 13483, 13482, 13484, 13488, 13486, 13486, 13488, 13492, 13491, 13491, 13494, 13497, 13495, 13494, 13494, 13496, 13493, 13492, 13493, 13496, 13494, 13493, 13495, 13498, 13496, 13496, 13498, 13501, 13499, 13497, 13498, 13500, 13497, 13496, 13497, 13500, 13498, 13498, 13500, 13504, 13503, 13503, 13506, 13509, 13507, 13506, 13507, 13510, 13508, 13507, 13509, 13512, 13510, 13510, 13512, 13516, 13515, 13516, 13518, 13521, 13519, 13518, 13518, 13520, 13517, 13516, 13517, 13520, 13518, 13517, 13518, 13522, 13520, 13520, 13522, 13525, 13523, 13521, 13522, 13524, 13521, 13520, 13522, 13525, 13523, 13522, 13524, 13528, 13527, 13528, 13530, 13533, 13531, 13530, 13530, 13533, 13530, 13529, 13531, 13534, 13532, 13531, 13533, 13537, 13535, 13536, 13538, 13541, 13539, 13538, 13538, 13541, 13538, 13537, 13538, 13542, 13539, 13539, 13541, 13545, 13543, 13544, 13546, 13549, 13547, 13546, 13546, 13549, 13546, 13545, 13546, 13550, 13547, 13547, 13549, 13553, 13551, 13552, 13554, 13557, 13555, 13554, 13554, 13557, 13554, 13553, 13554, 13558, 13555, 13555, 13557, 13561, 13559, 13560, 13562, 13565, 13563, 13562, 13562, 13565, 13562, 13561, 13562, 13566, 13563, 13563, 13565, 13569, 13567, 13568, 13570, 13573, 13571, 13570, 13570, 13573, 13570, 13569, 13570, 13574, 13571, 13571, 13573, 13577, 13575, 13576, 13578, 13581, 13579, 13578, 13578, 13581, 13578, 13577, 13578, 13582, 13579, 13579, 13581, 13585, 13583, 13584, 13586, 13589, 13587, 13586, 13586, 13589, 13586, 13585, 13586, 13590, 13587, 13587, 13589, 13593, 13591, 13592, 13594, 13597, 13595, 13594, 13594, 13597, 13594, 13593, 13594, 13598, 13595, 13595, 13597, 13601, 13599, 13600, 13602, 13605, 13603, 13602, 13602, 13605, 13602, 13601, 13602, 13606, 13603, 13603, 13605, 13609, 13607, 13608, 13610, 13613, 13611, 13610, 13610, 13613, 13610, 13609, 13610, 13613, 13611, 13611, 13613, 13617, 13615, 13616, 13618, 13621, 13619, 13618, 13619, 13621, 13618, 13617, 13619, 13622, 13620, 13619, 13621, 13625, 13624, 13624, 13626, 13629, 13627, 13625, 13626, 13628, 13624, 13623, 13624, 13627, 13625, 13624, 13626, 13629, 13628, 13628, 13630, 13633, 13631, 13630, 13631, 13633, 13630, 13630, 13631, 13635, 13633, 13633, 13635, 13639, 13638, 13639, 13642, 13645, 13643, 13642, 13643, 13646, 13643, 13642, 13643, 13647, 13644, 13644, 13646, 13650, 13648, 13648, 13650, 13653, 13651, 13649, 13649, 13651, 13648, 13647, 13648, 13651, 13648, 13648, 13649, 13653, 13652, 13652, 13654, 13657, 13655, 13654, 13655, 13657, 13655, 13654, 13655, 13659, 13657, 13657, 13659, 13663, 13662, 13663, 13666, 13669, 13667, 13666, 13667, 13669, 13667, 13666, 13667, 13671, 13668, 13668, 13670, 13673, 13672, 13672, 13674, 13677, 13675, 13673, 13674, 13676, 13673, 13671, 13673, 13676, 13673, 13672, 13674, 13678, 13676, 13676, 13678, 13681, 13679, 13677, 13678, 13680, 13677, 13676, 13677, 13681, 13678, 13678, 13680, 13684, 13683, 13683, 13686, 13689, 13687, 13686, 13687, 13690, 13687, 13687, 13689, 13692, 13690, 13690, 13692, 13696, 13695, 13695, 13698, 13701, 13699, 13697, 13698, 13700, 13697, 13696, 13697, 13700, 13698, 13697, 13698, 13702, 13700, 13700, 13702, 13705, 13703, 13701, 13702, 13704, 13701, 13700, 13701, 13704, 13702, 13702, 13704, 13708, 13707, 13707, 13710, 13713, 13711, 13710, 13711, 13714, 13711, 13711, 13713, 13716, 13714, 13714, 13716, 13720, 13719, 13719, 13722, 13725, 13723, 13721, 13722, 13724, 13721, 13720, 13721, 13724, 13721, 13721, 13722, 13726, 13724, 13724, 13726, 13729, 13727, 13725, 13726, 13728, 13725, 13724, 13726, 13729, 13727, 13726, 13728, 13732, 13731, 13731, 13734, 13737, 13735, 13734, 13734, 13737, 13734, 13733, 13734, 13738, 13735, 13735, 13737, 13741, 13739, 13740, 13742, 13745, 13743, 13742, 13742, 13745, 13742, 13741, 13742, 13746, 13743, 13743, 13745, 13749, 13747, 13748, 13750, 13753, 13751, 13750, 13750, 13753, 13750, 13749, 13750, 13754, 13751, 13751, 13753, 13757, 13755, 13756, 13758, 13761, 13759, 13758, 13758, 13761, 13758, 13757, 13758, 13762, 13759, 13759, 13761, 13765, 13763, 13764, 13766, 13769, 13767, 13766, 13766, 13769, 13766, 13765, 13766, 13770, 13767, 13767, 13769, 13773, 13771, 13772, 13774, 13777, 13775, 13774, 13774, 13777, 13774, 13773, 13774, 13778, 13775, 13775, 13777, 13781, 13779, 13780, 13782, 13785, 13783, 13782, 13782, 13785, 13782, 13781, 13782, 13786, 13783, 13783, 13785, 13789, 13787, 13788, 13790, 13793, 13791, 13790, 13790, 13793, 13790, 13789, 13790, 13794, 13791, 13791, 13793, 13797, 13795, 13796, 13798, 13801, 13799, 13798, 13798, 13801, 13798, 13797, 13798, 13802, 13799, 13799, 13801, 13805, 13803, 13804, 13806, 13809, 13807, 13806, 13806, 13809, 13806, 13805, 13806, 13810, 13807, 13807, 13809, 13813, 13811, 13812, 13814, 13817, 13815, 13814, 13814, 13817, 13814, 13813, 13814, 13818, 13815, 13815, 13817, 13821, 13819, 13820, 13822, 13825, 13823, 13822, 13822, 13825, 13822, 13821, 13822, 13826, 13823, 13823, 13825, 13829, 13827, 13828, 13830, 13833, 13831, 13830, 13830, 13833, 13830, 13829, 13830, 13834, 13831, 13831, 13833, 13837, 13835, 13836, 13838, 13841, 13839, 13838, 13838, 13841, 13838, 13837, 13838, 13842, 13839, 13839, 13841, 13845, 13843, 13844, 13846, 13849, 13847, 13846, 13846, 13849, 13846, 13845, 13846, 13850, 13847, 13847, 13849, 13853, 13851, 13852, 13854, 13857, 13855, 13853, 13854, 13857, 13854, 13853, 13854, 13857, 13855, 13855, 13857, 13860, 13859, 13859, 13862, 13865, 13863, 13862, 13862, 13865, 13862, 13861, 13863, 13866, 13864, 13863, 13865, 13869, 13868, 13868, 13870, 13873, 13871, 13869, 13869, 13871, 13868, 13867, 13868, 13871, 13868, 13868, 13869, 13873, 13872, 13872, 13874, 13877, 13875, 13874, 13874, 13877, 13874, 13874, 13875, 13879, 13877, 13877, 13879, 13883, 13882, 13883, 13886, 13889, 13887, 13886, 13887, 13889, 13887, 13886, 13887, 13890, 13888, 13888, 13890, 13893, 13892, 13892, 13894, 13897, 13895, 13893, 13894, 13896, 13893, 13891, 13892, 13895, 13893, 13892, 13894, 13898, 13896, 13896, 13898, 13901, 13899, 13897, 13898, 13900, 13897, 13896, 13897, 13900, 13898, 13898, 13900, 13904, 13903, 13903, 13906, 13909, 13907, 13906, 13907, 13910, 13907, 13907, 13908, 13912, 13910, 13910, 13912, 13916, 13915, 13915, 13918, 13921, 13919, 13917, 13918, 13920, 13917, 13916, 13917, 13920, 13917, 13916, 13918, 13922, 13920, 13920, 13922, 13925, 13923, 13921, 13922, 13924, 13921, 13920, 13922, 13925, 13923, 13922, 13924, 13928, 13927, 13927, 13930, 13933, 13931, 13930, 13930, 13933, 13930, 13929, 13930, 13934, 13931, 13931, 13933, 13937, 13935, 13936, 13938, 13941, 13939, 13937, 13938, 13941, 13938, 13937, 13938, 13941, 13939, 13939, 13941, 13945, 13943, 13943, 13946, 13949, 13947, 13945, 13946, 13949, 13946, 13945, 13946, 13949, 13947, 13947, 13949, 13953, 13951, 13951, 13954, 13957, 13955, 13953, 13954, 13957, 13954, 13953, 13954, 13957, 13955, 13955, 13957, 13961, 13959, 13959, 13962, 13965, 13963, 13961, 13962, 13965, 13962, 13961, 13962, 13965, 13963, 13963, 13965, 13969, 13967, 13967, 13970, 13973, 13971, 13969, 13970, 13972, 13970, 13968, 13970, 13973, 13971, 13970, 13973, 13976, 13975, 13975, 13978, 13981, 13979, 13978, 13978, 13981, 13978, 13977, 13979, 13982, 13980, 13979, 13981, 13985, 13984, 13984, 13986, 13989, 13987, 13985, 13985, 13987, 13984, 13983, 13984, 13987, 13984, 13984, 13985, 13989, 13987, 13988, 13990, 13993, 13991, 13990, 13990, 13993, 13990, 13990, 13991, 13995, 13993, 13993, 13995, 13999, 13998, 13999, 14001, 14005, 14003, 14002, 14003, 14005, 14002, 14002, 14003, 14006, 14004, 14004, 14005, 14009, 14008, 14008, 14010, 14013, 14011, 14009, 14009, 14012, 14008, 14007, 14008, 14011, 14009, 14008, 14010, 14013, 14012, 14012, 14014, 14017, 14015, 14013, 14014, 14016, 14013, 14012, 14013, 14016, 14014, 14014, 14016, 14020, 14019, 14019, 14021, 14025, 14023, 14022, 14023, 14026, 14023, 14023, 14024, 14028, 14026, 14026, 14028, 14032, 14031, 14031, 14034, 14037, 14035, 14033, 14034, 14036, 14033, 14032, 14033, 14036, 14033, 14032, 14034, 14038, 14036, 14036, 14038, 14041, 14039, 14037, 14038, 14040, 14037, 14036, 14037, 14041, 14039, 14038, 14040, 14044, 14043, 14043, 14046, 14049, 14047, 14045, 14046, 14049, 14046, 14045, 14046, 14050, 14047, 14047, 14049, 14053, 14051, 14051, 14054, 14057, 14055, 14053, 14054, 14057, 14054, 14053, 14054, 14057, 14055, 14055, 14057, 14061, 14059, 14059, 14062, 14065, 14063, 14061, 14062, 14065, 14062, 14061, 14062, 14065, 14063, 14063, 14065, 14069, 14067, 14067, 14070, 14073, 14071, 14069, 14070, 14073, 14070, 14069, 14070, 14073, 14071, 14071, 14073, 14077, 14075, 14075, 14078, 14081, 14079, 14077, 14078, 14080, 14077, 14076, 14078, 14081, 14079, 14078, 14080, 14084, 14083, 14083, 14086, 14089, 14087, 14085, 14086, 14089, 14086, 14085, 14086, 14090, 14087, 14087, 14089, 14093, 14091, 14092, 14094, 14097, 14095, 14093, 14094, 14096, 14093, 14091, 14092, 14096, 14093, 14092, 14094, 14098, 14096, 14096, 14098, 14101, 14098, 14097, 14097, 14100, 14097, 14096, 14097, 14100, 14098, 14098, 14100, 14104, 14102, 14103, 14105, 14109, 14107, 14106, 14107, 14110, 14107, 14106, 14108, 14112, 14110, 14110, 14112, 14116, 14115, 14115, 14118, 14121, 14119, 14117, 14118, 14120, 14117, 14116, 14117, 14120, 14117, 14116, 14118, 14122, 14120, 14120, 14122, 14125, 14123, 14121, 14122, 14124, 14121, 14120, 14121, 14125, 14122, 14122, 14124, 14128, 14127, 14127, 14130, 14133, 14131, 14129, 14130, 14133, 14130, 14129, 14130, 14133, 14131, 14131, 14133, 14137, 14135, 14135, 14138, 14141, 14139, 14137, 14138, 14141, 14138, 14137, 14138, 14142, 14139, 14139, 14141, 14145, 14143, 14144, 14146, 14149, 14147, 14145, 14145, 14148, 14144, 14143, 14144, 14148, 14145, 14144, 14146, 14150, 14148, 14148, 14150, 14153, 14150, 14149, 14149, 14152, 14149, 14148, 14149, 14152, 14150, 14150, 14152, 14156, 14154, 14155, 14157, 14161, 14159, 14158, 14159, 14162, 14159, 14158, 14160, 14164, 14162, 14162, 14164, 14168, 14167, 14167, 14170, 14173, 14171, 14169, 14170, 14172, 14169, 14167, 14169, 14172, 14169, 14168, 14170, 14174, 14172, 14172, 14174, 14177, 14174, 14173, 14174, 14176, 14173, 14172, 14173, 14177, 14174, 14174, 14176, 14180, 14179, 14179, 14182, 14185, 14183, 14181, 14182, 14185, 14182, 14181, 14182, 14185, 14183, 14183, 14185, 14188, 14187, 14187, 14190, 14193, 14191, 14189, 14190, 14193, 14190, 14189, 14190, 14194, 14191, 14191, 14193, 14197, 14195, 14196, 14198, 14201, 14198, 14197, 14197, 14200, 14196, 14195, 14196, 14199, 14197, 14196, 14198, 14201, 14200, 14200, 14202, 14205, 14203, 14201, 14202, 14204, 14201, 14200, 14201, 14205, 14203, 14202, 14204, 14208, 14207, 14207, 14210, 14213, 14211, 14209, 14210, 14213, 14210, 14209, 14210, 14213, 14211, 14211, 14213, 14217, 14215, 14215, 14218, 14221, 14219, 14217, 14218, 14220, 14217, 14216, 14218, 14221, 14219, 14218, 14220, 14224, 14223, 14223, 14226, 14229, 14227, 14225, 14226, 14228, 14225, 14224, 14226, 14229, 14227, 14226, 14228, 14232, 14231, 14231, 14234, 14237, 14235, 14233, 14234, 14237, 14234, 14233, 14234, 14238, 14235, 14235, 14237, 14241, 14239, 14240, 14242, 14245, 14242, 14241, 14241, 14244, 14240, 14239, 14240, 14243, 14241, 14240, 14242, 14245, 14244, 14244, 14246, 14249, 14246, 14245, 14246, 14248, 14245, 14244, 14245, 14249, 14247, 14246, 14248, 14252, 14251, 14251, 14254, 14257, 14255, 14253, 14254, 14256, 14253, 14252, 14254, 14257, 14255, 14254, 14256, 14260, 14259, 14259, 14262, 14265, 14263, 14261, 14262, 14265, 14262, 14261, 14262, 14266, 14263, 14263, 14265, 14269, 14267, 14268, 14270, 14273, 14270, 14269, 14269, 14272, 14268, 14267, 14268, 14271, 14269, 14268, 14270, 14273, 14272, 14272, 14274, 14277, 14274, 14273, 14274, 14276, 14273, 14272, 14273, 14277, 14274, 14274, 14276, 14280, 14279, 14279, 14282, 14285, 14283, 14281, 14282, 14285, 14282, 14281, 14282, 14285, 14283, 14283, 14285, 14289, 14287, 14287, 14290, 14293, 14291, 14289, 14290, 14292, 14289, 14288, 14290, 14293, 14291, 14290, 14292, 14296, 14295, 14295, 14298, 14301, 14299, 14297, 14298, 14300, 14297, 14296, 14298, 14301, 14299, 14298, 14300, 14304, 14303, 14303, 14306, 14309, 14307, 14305, 14306, 14309, 14306, 14305, 14306, 14310, 14307, 14307, 14309, 14313, 14311, 14312, 14314, 14317, 14314, 14313, 14313, 14316, 14312, 14311, 14312, 14315, 14313, 14312, 14314, 14317, 14316, 14316, 14318, 14321, 14318, 14317, 14318, 14320, 14317, 14316, 14317, 14321, 14318, 14318, 14320, 14324, 14323, 14323, 14326, 14329, 14327, 14325, 14326, 14328, 14325, 14324, 14326, 14329, 14327, 14326, 14328, 14332, 14331, 14331, 14334, 14337, 14335, 14333, 14334, 14337, 14334, 14333, 14334, 14338, 14335, 14335, 14337, 14341, 14339, 14339, 14342, 14345, 14342, 14341, 14341, 14344, 14340, 14339, 14340, 14343, 14341, 14340, 14342, 14345, 14344, 14344, 14346, 14349, 14346, 14345, 14346, 14348, 14345, 14344, 14345, 14349, 14346, 14346, 14348, 14352, 14351, 14351, 14354, 14357, 14355, 14353, 14354, 14357, 14354, 14353, 14354, 14357, 14355, 14354, 14357, 14361, 14359, 14359, 14362, 14365, 14363, 14361, 14362, 14364, 14361, 14360, 14362, 14365, 14363, 14362, 14364, 14368, 14367, 14367, 14370, 14373, 14371, 14369, 14370, 14373, 14370, 14369, 14370, 14374, 14371, 14371, 14373, 14377, 14375, 14375, 14378, 14381, 14378, 14377, 14377, 14380, 14376, 14375, 14376, 14379, 14377, 14376, 14378, 14381, 14380, 14380, 14382, 14385, 14382, 14381, 14382, 14384, 14381, 14380, 14381, 14385, 14382, 14382, 14384, 14388, 14387, 14387, 14390, 14393, 14391, 14389, 14390, 14392, 14389, 14388, 14390, 14393, 14391, 14390, 14392, 14396, 14395, 14395, 14398, 14401, 14399, 14397, 14398, 14401, 14398, 14397, 14398, 14402, 14399, 14399, 14401, 14405, 14403, 14403, 14406, 14409, 14406, 14405, 14405, 14407, 14404, 14403, 14404, 14407, 14405, 14404, 14406, 14409, 14408, 14408, 14410, 14413, 14410, 14409, 14410, 14412, 14409, 14408, 14409, 14413, 14410, 14410, 14412, 14416, 14415, 14415, 14418, 14421, 14419, 14417, 14418, 14420, 14417, 14416, 14418, 14421, 14419, 14418, 14420, 14424, 14423, 14423, 14426, 14429, 14427, 14425, 14426, 14429, 14426, 14425, 14426, 14430, 14427, 14427, 14429, 14433, 14431, 14431, 14434, 14437, 14434, 14433, 14433, 14436, 14432, 14431, 14432, 14435, 14433, 14432, 14434, 14437, 14436, 14436, 14438, 14441, 14438, 14437, 14438, 14440, 14437, 14436, 14437, 14441, 14438, 14438, 14440, 14444, 14443, 14443, 14445, 14449, 14447, 14445, 14446, 14449, 14446, 14445, 14446, 14450, 14447, 14447, 14449, 14453, 14451, 14451, 14454, 14457, 14454, 14453, 14453, 14455, 14452, 14451, 14452, 14455, 14452, 14452, 14453, 14457, 14456, 14456, 14458, 14461, 14458, 14457, 14458, 14460, 14457, 14456, 14457, 14461, 14458, 14458, 14460, 14464, 14463, 14463, 14466, 14469, 14467, 14465, 14466, 14468, 14465, 14464, 14466, 14469, 14467, 14466, 14468, 14472, 14471, 14471, 14474, 14477, 14475, 14473, 14474, 14477, 14474, 14473, 14474, 14478, 14475, 14475, 14477, 14481, 14479, 14479, 14482, 14485, 14482, 14481, 14481, 14483, 14480, 14478, 14480, 14483, 14480, 14479, 14481, 14485, 14483, 14483, 14486, 14489, 14487, 14485, 14486, 14489, 14486, 14485, 14487, 14491, 14489, 14489, 14491, 14495, 14494, 14495, 14497, 14501, 14499, 14497, 14498, 14500, 14497, 14496, 14497, 14500, 14498, 14497, 14498, 14502, 14500, 14500, 14502, 14505, 14502, 14500, 14501, 14503, 14499, 14498, 14499, 14502, 14499, 14499, 14500, 14504, 14503, 14503, 14505, 14509, 14507, 14506, 14506, 14509, 14507, 14506, 14508, 14511, 14509, 14509, 14511, 14516, 14514, 14515, 14517, 14521, 14519, 14517, 14518, 14520, 14517, 14515, 14517, 14520, 14517, 14516, 14518, 14522, 14520, 14520, 14522, 14525, 14522, 14521, 14521, 14524, 14521, 14520, 14521, 14525, 14522, 14522, 14524, 14528, 14527, 14527, 14529, 14533, 14531, 14529, 14530, 14532, 14529, 14528, 14530, 14533, 14531, 14530, 14532, 14536, 14535, 14535, 14537, 14541, 14539, 14537, 14538, 14541, 14538, 14537, 14538, 14542, 14539, 14539, 14541, 14545, 14543, 14543, 14546, 14549, 14546, 14545, 14545, 14547, 14544, 14543, 14544, 14547, 14544, 14544, 14545, 14549, 14548, 14548, 14550, 14553, 14550, 14549, 14549, 14552, 14549, 14548, 14549, 14553, 14550, 14550, 14552, 14556, 14555, 14555, 14557, 14561, 14559, 14557, 14558, 14561, 14558, 14557, 14558, 14562, 14559, 14559, 14561, 14565, 14563, 14563, 14566, 14569, 14566, 14565, 14565, 14567, 14564, 14563, 14564, 14567, 14564, 14564, 14565, 14569, 14567, 14567, 14570, 14573, 14570, 14569, 14570, 14572, 14569, 14568, 14569, 14573, 14570, 14570, 14572, 14576, 14575, 14575, 14577, 14581, 14579, 14577, 14578, 14580, 14577, 14576, 14578, 14581, 14579, 14578, 14580, 14584, 14583, 14583, 14585, 14589, 14587, 14585, 14586, 14589, 14586, 14585, 14586, 14590, 14587, 14587, 14589, 14593, 14591, 14591, 14594, 14597, 14594, 14593, 14593, 14595, 14592, 14591, 14592, 14595, 14592, 14592, 14593, 14597, 14595, 14596, 14598, 14601, 14598, 14597, 14597, 14600, 14597, 14596, 14597, 14601, 14598, 14598, 14600, 14604, 14603, 14603, 14605, 14609, 14607, 14605, 14606, 14609, 14606, 14605, 14606, 14610, 14607, 14607, 14609, 14613, 14611, 14611, 14614, 14617, 14614, 14613, 14613, 14615, 14612, 14611, 14612, 14615, 14612, 14612, 14613, 14617, 14615, 14615, 14618, 14621, 14618, 14617, 14617, 14620, 14617, 14616, 14617, 14621, 14618, 14618, 14620, 14624, 14623, 14623, 14625, 14629, 14627, 14625, 14626, 14628, 14625, 14624, 14626, 14629, 14627, 14626, 14628, 14632, 14631, 14631, 14633, 14637, 14635, 14633, 14634, 14637, 14634, 14633, 14634, 14638, 14635, 14635, 14637, 14641, 14639, 14639, 14642, 14645, 14642, 14641, 14641, 14643, 14640, 14639, 14640, 14643, 14640, 14640, 14641, 14645, 14643, 14643, 14646, 14649, 14646, 14645, 14645, 14648, 14645, 14644, 14645, 14649, 14646, 14646, 14648, 14652, 14651, 14651, 14653, 14657, 14655, 14653, 14654, 14657, 14654, 14653, 14654, 14658, 14655, 14655, 14657, 14661, 14659, 14659, 14662, 14665, 14662, 14661, 14661, 14663, 14660, 14659, 14660, 14663, 14660, 14660, 14661, 14665, 14663, 14663, 14666, 14669, 14666, 14665, 14665, 14668, 14665, 14664, 14665, 14669, 14666, 14666, 14668, 14672, 14671, 14671, 14673, 14677, 14674, 14673, 14674, 14676, 14673, 14672, 14674, 14677, 14675, 14674, 14676, 14680, 14679, 14679, 14681, 14685, 14683, 14681, 14682, 14685, 14681, 14680, 14682, 14686, 14683, 14683, 14685, 14689, 14687, 14687, 14690, 14693, 14690, 14689, 14689, 14691, 14688, 14687, 14688, 14691, 14688, 14688, 14689, 14693, 14691, 14691, 14694, 14697, 14694, 14693, 14693, 14696, 14693, 14692, 14693, 14697, 14694, 14694, 14696, 14700, 14698, 14699, 14701, 14705, 14703, 14701, 14702, 14705, 14702, 14701, 14702, 14706, 14703, 14703, 14705, 14709, 14707, 14707, 14710, 14713, 14710, 14709, 14709, 14711, 14708, 14707, 14708, 14711, 14708, 14708, 14709, 14713, 14711, 14711, 14714, 14717, 14714, 14713, 14713, 14716, 14713, 14712, 14713, 14717, 14714, 14714, 14716, 14720, 14718, 14719, 14721, 14725, 14723, 14721, 14722, 14725, 14722, 14721, 14722, 14726, 14723, 14723, 14725, 14729, 14727, 14727, 14730, 14733, 14730, 14729, 14729, 14731, 14728, 14727, 14728, 14731, 14728, 14727, 14729, 14733, 14731, 14731, 14734, 14737, 14734, 14733, 14733, 14736, 14733, 14732, 14733, 14737, 14734, 14734, 14736, 14740, 14739, 14739, 14741, 14745, 14742, 14741, 14742, 14744, 14741, 14740, 14742, 14745, 14743, 14742, 14744, 14748, 14747, 14747, 14749, 14753, 14750, 14749, 14750, 14753, 14749, 14748, 14750, 14753, 14751, 14750, 14753, 14757, 14755, 14755, 14758, 14761, 14758, 14757, 14757, 14759, 14756, 14755, 14756, 14759, 14756, 14756, 14757, 14761, 14759, 14759, 14762, 14765, 14762, 14761, 14761, 14764, 14761, 14759, 14761, 14764, 14762, 14762, 14764, 14768, 14766, 14767, 14769, 14773, 14771, 14769, 14770, 14773, 14770, 14769, 14770, 14774, 14771, 14771, 14773, 14777, 14775, 14775, 14778, 14781, 14778, 14777, 14777, 14779, 14776, 14775, 14776, 14779, 14776, 14775, 14777, 14781, 14779, 14779, 14782, 14785, 14782, 14781, 14781, 14784, 14781, 14779, 14781, 14784, 14782, 14782, 14784, 14788, 14786, 14787, 14789, 14793, 14791, 14789, 14790, 14793, 14790, 14789, 14790, 14794, 14791, 14791, 14793, 14797, 14795, 14795, 14798, 14801, 14798, 14797, 14797, 14799, 14796, 14795, 14796, 14799, 14796, 14795, 14797, 14801, 14799, 14799, 14802, 14805, 14802, 14801, 14801, 14804, 14801, 14800, 14801, 14805, 14802, 14802, 14804, 14808, 14807, 14807, 14809, 14813, 14810, 14809, 14810, 14812, 14809, 14808, 14810, 14813, 14811, 14810, 14812, 14816, 14815, 14815, 14817, 14821, 14818, 14817, 14818, 14820, 14817, 14816, 14818, 14821, 14819, 14818, 14821, 14825, 14823, 14823, 14826, 14829, 14826, 14825, 14825, 14827, 14824, 14823, 14824, 14827, 14824, 14823, 14825, 14829, 14827, 14827, 14830, 14833, 14830, 14829, 14829, 14832, 14829, 14827, 14829, 14832, 14830, 14829, 14832, 14836, 14834, 14835, 14837, 14841, 14838, 14837, 14838, 14841, 14838, 14836, 14838, 14842, 14839, 14839, 14841, 14845, 14843, 14843, 14846, 14849, 14846, 14845, 14845, 14847, 14844, 14843, 14844, 14847, 14844, 14843, 14845, 14849, 14847, 14847, 14850, 14853, 14850, 14849, 14849, 14852, 14849, 14847, 14849, 14852, 14850, 14849, 14852, 14856, 14854, 14855, 14857, 14861, 14858, 14857, 14858, 14861, 14858, 14856, 14858, 14862, 14859, 14859, 14861, 14865, 14863, 14863, 14866, 14869, 14866, 14865, 14865, 14867, 14864, 14863, 14864, 14867, 14864, 14863, 14865, 14869, 14867, 14867, 14870, 14873, 14870, 14869, 14869, 14872, 14869, 14868, 14869, 14873, 14870, 14870, 14872, 14876, 14875, 14875, 14877, 14881, 14878, 14877, 14878, 14880, 14877, 14876, 14878, 14881, 14879, 14878, 14880, 14884, 14883, 14883, 14885, 14889, 14886, 14885, 14886, 14888, 14885, 14884, 14886, 14889, 14887, 14886, 14888, 14892, 14891, 14891, 14893, 14897, 14894, 14893, 14893, 14896, 14892, 14891, 14892, 14896, 14893, 14892, 14894, 14898, 14896, 14896, 14898, 14901, 14898, 14896, 14896, 14899, 14895, 14894, 14895, 14898, 14895, 14894, 14896, 14900, 14899, 14899, 14901, 14905, 14903, 14901, 14902, 14905, 14902, 14901, 14903, 14907, 14905, 14905, 14907, 14912, 14910, 14911, 14913, 14917, 14914, 14913, 14913, 14916, 14912, 14911, 14912, 14915, 14913, 14912, 14913, 14917, 14915, 14915, 14918, 14921, 14918, 14917, 14917, 14920, 14917, 14916, 14917, 14921, 14918, 14918, 14920, 14924, 14923, 14923, 14925, 14929, 14926, 14924, 14925, 14927, 14924, 14922, 14923, 14927, 14924, 14923, 14925, 14929, 14927, 14927, 14929, 14933, 14930, 14929, 14930, 14933, 14930, 14929, 14931, 14935, 14933, 14932, 14935, 14939, 14938, 14939, 14941, 14945, 14942, 14941, 14942, 14944, 14941, 14939, 14941, 14944, 14941, 14940, 14942, 14946, 14944, 14944, 14946, 14949, 14946, 14944, 14945, 14947, 14943, 14942, 14943, 14946, 14944, 14943, 14945, 14949, 14947, 14947, 14949, 14953, 14950, 14949, 14949, 14952, 14949, 14948, 14949, 14953, 14950, 14950, 14952, 14956, 14955, 14955, 14957, 14961, 14958, 14957, 14958, 14960, 14957, 14956, 14957, 14961, 14958, 14958, 14960, 14964, 14963, 14963, 14965, 14969, 14966, 14965, 14966, 14968, 14965, 14964, 14966, 14969, 14967, 14966, 14968, 14973, 14971, 14971, 14973, 14977, 14974, 14972, 14973, 14975, 14972, 14970, 14972, 14975, 14972, 14971, 14973, 14977, 14975, 14975, 14978, 14981, 14978, 14977, 14977, 14980, 14977, 14975, 14977, 14981, 14978, 14978, 14980, 14984, 14982, 14983, 14985, 14989, 14986, 14985, 14986, 14988, 14985, 14984, 14985, 14989, 14986, 14986, 14988, 14992, 14991, 14991, 14993, 14997, 14994, 14993, 14994, 14996, 14993, 14992, 14994, 14997, 14995, 14994, 14996, 15001, 14999, 14999, 15001, 15005, 15002, 15000, 15001, 15003, 15000, 14998, 15000, 15003, 15000, 14999, 15001, 15005, 15003, 15003, 15006, 15009, 15006, 15005, 15005, 15008, 15005, 15003, 15005, 15009, 15006, 15006, 15008, 15012, 15010, 15011, 15013, 15017, 15014, 15013, 15014, 15016, 15013, 15012, 15013, 15017, 15014, 15014, 15016, 15020, 15019, 15019, 15021, 15025, 15022, 15021, 15022, 15024, 15021, 15020, 15022, 15025, 15023, 15022, 15024, 15029, 15027, 15027, 15029, 15033, 15030, 15028, 15029, 15031, 15028, 15026, 15028, 15031, 15028, 15027, 15029, 15033, 15031, 15031, 15033, 15037, 15034, 15033, 15033, 15036, 15033, 15031, 15033, 15037, 15034, 15033, 15036, 15040, 15038, 15039, 15041, 15045, 15042, 15041, 15042, 15044, 15041, 15040, 15041, 15045, 15042, 15042, 15044, 15048, 15047, 15047, 15049, 15053, 15050, 15049, 15050, 15052, 15049, 15048, 15050, 15053, 15051, 15050, 15052, 15057, 15055, 15055, 15057, 15061, 15058, 15056, 15057, 15059, 15056, 15054, 15056, 15059, 15056, 15055, 15057, 15061, 15059, 15059, 15061, 15065, 15062, 15061, 15061, 15064, 15061, 15059, 15061, 15065, 15062, 15061, 15064, 15068, 15066, 15067, 15069, 15073, 15070, 15069, 15070, 15072, 15069, 15068, 15069, 15073, 15070, 15070, 15072, 15076, 15075, 15075, 15077, 15081, 15078, 15077, 15078, 15080, 15077, 15076, 15078, 15081, 15079, 15078, 15080, 15084, 15083, 15083, 15085, 15089, 15086, 15084, 15085, 15087, 15084, 15082, 15084, 15087, 15084, 15083, 15085, 15089, 15087, 15087, 15089, 15093, 15090, 15089, 15089, 15092, 15089, 15087, 15089, 15093, 15090, 15089, 15092, 15096, 15094, 15095, 15097, 15101, 15098, 15097, 15098, 15100, 15097, 15096, 15097, 15101, 15098, 15098, 15100, 15104, 15103, 15103, 15105, 15109, 15106, 15105, 15106, 15108, 15105, 15104, 15106, 15109, 15107, 15106, 15108, 15112, 15111, 15111, 15113, 15117, 15114, 15112, 15113, 15115, 15112, 15110, 15112, 15115, 15112, 15111, 15113, 15117, 15115, 15115, 15117, 15121, 15118, 15117, 15117, 15120, 15116, 15115, 15117, 15120, 15118, 15117, 15120, 15124, 15122, 15123, 15125, 15129, 15126, 15125, 15126, 15128, 15125, 15124, 15125, 15129, 15126, 15126, 15128, 15132, 15131, 15131, 15133, 15137, 15134, 15133, 15133, 15136, 15133, 15132, 15133, 15137, 15134, 15134, 15136, 15140, 15138, 15139, 15141, 15145, 15142, 15141, 15142, 15144, 15141, 15140, 15142, 15145, 15143, 15142, 15144, 15148, 15147, 15147, 15149, 15153, 15150, 15148, 15149, 15151, 15148, 15146, 15148, 15151, 15148, 15147, 15149, 15153, 15151, 15151, 15153, 15157, 15154, 15153, 15153, 15156, 15152, 15151, 15153, 15156, 15154, 15153, 15156, 15160, 15158, 15159, 15161, 15165, 15162, 15161, 15162, 15164, 15161, 15160, 15161, 15165, 15162, 15162, 15164, 15168, 15167, 15167, 15169, 15173, 15170, 15169, 15169, 15172, 15169, 15168, 15169, 15173, 15170, 15170, 15172, 15176, 15174, 15175, 15177, 15181, 15178, 15177, 15178, 15180, 15177, 15176, 15178, 15181, 15179, 15178, 15180, 15184, 15183, 15183, 15185, 15189, 15186, 15184, 15185, 15187, 15184, 15182, 15184, 15187, 15184, 15183, 15185, 15189, 15187, 15187, 15189, 15193, 15190, 15189, 15189, 15192, 15188, 15187, 15189, 15192, 15190, 15189, 15192, 15196, 15194, 15195, 15197, 15201, 15198, 15197, 15198, 15200, 15197, 15196, 15197, 15201, 15198, 15198, 15200, 15204, 15203, 15203, 15205, 15209, 15206, 15205, 15205, 15208, 15205, 15204, 15205, 15209, 15206, 15206, 15208, 15212, 15210, 15211, 15213, 15217, 15214, 15213, 15214, 15216, 15213, 15212, 15214, 15217, 15215, 15214, 15216, 15220, 15219, 15219, 15221, 15225, 15222, 15220, 15221, 15223, 15220, 15218, 15220, 15223, 15220, 15219, 15221, 15225, 15223, 15223, 15225, 15229, 15226, 15225, 15225, 15228, 15224, 15223, 15225, 15228, 15226, 15225, 15228, 15232, 15230, 15231, 15233, 15237, 15234, 15233, 15234, 15236, 15233, 15232, 15233, 15237, 15234, 15234, 15236, 15240, 15239, 15239, 15241, 15245, 15242, 15241, 15241, 15244, 15241, 15240, 15241, 15245, 15242, 15242, 15244, 15248, 15246, 15247, 15249, 15253, 15250, 15249, 15250, 15252, 15249, 15248, 15250, 15253, 15251, 15250, 15252, 15256, 15255, 15255, 15257, 15261, 15258, 15256, 15257, 15259, 15256, 15254, 15256, 15259, 15256, 15255, 15257, 15261, 15259, 15259, 15261, 15265, 15262, 15260, 15261, 15264, 15260, 15259, 15261, 15264, 15262, 15261, 15263, 15268, 15266, 15267, 15269, 15273, 15270, 15269, 15270, 15272, 15269, 15268, 15269, 15273, 15270, 15270, 15272, 15276, 15275, 15275, 15277, 15281, 15278, 15277, 15277, 15280, 15277, 15276, 15277, 15281, 15278, 15278, 15280, 15284, 15282, 15283, 15285, 15289, 15286, 15285, 15285, 15288, 15285, 15284, 15285, 15289, 15286, 15286, 15288, 15292, 15290, 15291, 15293, 15297, 15294, 15293, 15294, 15296, 15293, 15292, 15294, 15297, 15295, 15294, 15296, 15300, 15299, 15299, 15301, 15305, 15302, 15300, 15301, 15303, 15300, 15298, 15299, 15303, 15300, 15299, 15301, 15305, 15303, 15303, 15305, 15309, 15306, 15304, 15305, 15308, 15304, 15303, 15305, 15308, 15306, 15305, 15307, 15312, 15310, 15311, 15313, 15317, 15314, 15313, 15314, 15316, 15313, 15312, 15313, 15317, 15314, 15314, 15316, 15320, 15319, 15319, 15321, 15325, 15322, 15321, 15321, 15324, 15321, 15319, 15321, 15325, 15322, 15321, 15324, 15328, 15326, 15327, 15329, 15333, 15330, 15329, 15330, 15332, 15329, 15328, 15330, 15333, 15331, 15330, 15332, 15336, 15335, 15335, 15337, 15341, 15338, 15336, 15337, 15339, 15336, 15334, 15335, 15339, 15336, 15335, 15337, 15341, 15339, 15339, 15341, 15345, 15342, 15340, 15341, 15344, 15340, 15339, 15341, 15344, 15342, 15341, 15343, 15348, 15346, 15347, 15349, 15353, 15350, 15349, 15350, 15352, 15349, 15348, 15349, 15353, 15350, 15350, 15352, 15356, 15355, 15355, 15357, 15361, 15358, 15357, 15357, 15360, 15357, 15355, 15357, 15361, 15358, 15357, 15360, 15364, 15362, 15363, 15365, 15369, 15366, 15365, 15366, 15368, 15365, 15364, 15366, 15369, 15367, 15366, 15368, 15372, 15371, 15371, 15373, 15377, 15374, 15372, 15373, 15375, 15372, 15370, 15371, 15375, 15372, 15371, 15373, 15377, 15375, 15375, 15377, 15381, 15378, 15376, 15377, 15380, 15376, 15375, 15377, 15380, 15378, 15377, 15379, 15384, 15382, 15382, 15385, 15389, 15386, 15385, 15386, 15388, 15385, 15384, 15386, 15389, 15387, 15386, 15388, 15392, 15391, 15391, 15393, 15397, 15394, 15392, 15393, 15395, 15392, 15390, 15391, 15395, 15392, 15391, 15393, 15397, 15395, 15395, 15397, 15401, 15398, 15396, 15397, 15400, 15396, 15395, 15397, 15400, 15398, 15397, 15399, 15404, 15402, 15403, 15405, 15409, 15406, 15405, 15406, 15408, 15405, 15404, 15405, 15409, 15406, 15406, 15408, 15412, 15410, 15411, 15413, 15417, 15414, 15413, 15413, 15416, 15413, 15411, 15413, 15417, 15414, 15413, 15416, 15420, 15418, 15419, 15421, 15425, 15422, 15421, 15422, 15424, 15421, 15420, 15422, 15425, 15423, 15422, 15424, 15428, 15427, 15427, 15429, 15433, 15430, 15428, 15429, 15431, 15428, 15426, 15427, 15431, 15428, 15427, 15429, 15433, 15431, 15431, 15433, 15437, 15434, 15432, 15433, 15436, 15432, 15431, 15433, 15436, 15434, 15433, 15435, 15440, 15438, 15439, 15441, 15445, 15442, 15441, 15441, 15444, 15441, 15440, 15441, 15445, 15442, 15442, 15444, 15448, 15446, 15447, 15449, 15453, 15450, 15449, 15449, 15452, 15449, 15447, 15449, 15453, 15450, 15449, 15452, 15456, 15454, 15455, 15457, 15461, 15458, 15457, 15458, 15460, 15457, 15456, 15458, 15461, 15459, 15458, 15460, 15464, 15463, 15463, 15465, 15469, 15466, 15464, 15465, 15467, 15464, 15462, 15463, 15467, 15464, 15463, 15465, 15469, 15467, 15467, 15469, 15473, 15470, 15468, 15469, 15472, 15468, 15467, 15469, 15472, 15470, 15469, 15471, 15476, 15474, 15475, 15477, 15481, 15478, 15477, 15477, 15480, 15477, 15476, 15477, 15481, 15478, 15478, 15480, 15484, 15482, 15483, 15485, 15489, 15486, 15485, 15486, 15488, 15485, 15484, 15485, 15489, 15487, 15486, 15488, 15492, 15491, 15491, 15493, 15497, 15494, 15492, 15493, 15495, 15492, 15490, 15491, 15495, 15492, 15491, 15493, 15497, 15495, 15495, 15497, 15501, 15498, 15496, 15497, 15500, 15496, 15495, 15497, 15500, 15498, 15497, 15499, 15504, 15502, 15502, 15505, 15509, 15506, 15505, 15505, 15508, 15505, 15504, 15505, 15509, 15506, 15506, 15508, 15512, 15510, 15511, 15513, 15517, 15514, 15513, 15513, 15516, 15513, 15511, 15513, 15517, 15514, 15513, 15516, 15520, 15518, 15519, 15521, 15525, 15522, 15521, 15522, 15524, 15521, 15520, 15521, 15525, 15523, 15522, 15524, 15528, 15527, 15527, 15529, 15533, 15530, 15528, 15529, 15531, 15527, 15526, 15527, 15531, 15528, 15527, 15529, 15533, 15531, 15531, 15533, 15537, 15534, 15532, 15533, 15536, 15533, 15531, 15533, 15537, 15534, 15534, 15536, 15540, 15538, 15539, 15541, 15545, 15542, 15540, 15541, 15543, 15540, 15538, 15539, 15543, 15540, 15539, 15541, 15545, 15543, 15543, 15545, 15549, 15546, 15544, 15545, 15548, 15544, 15543, 15545, 15548, 15546, 15545, 15547, 15552, 15550, 15550, 15553, 15557, 15554, 15553, 15553, 15556, 15553, 15551, 15553, 15557, 15554, 15553, 15556, 15560, 15558, 15559, 15561, 15565, 15562, 15561, 15561, 15564, 15561, 15560, 15561, 15565, 15562, 15562, 15564, 15568, 15567, 15567, 15569, 15573, 15570, 15568, 15569, 15571, 15567, 15566, 15567, 15571, 15568, 15567, 15569, 15573, 15571, 15571, 15573, 15577, 15574, 15572, 15573, 15576, 15572, 15571, 15573, 15576, 15574, 15573, 15575, 15580, 15578, 15578, 15581, 15585, 15582, 15581, 15581, 15584, 15581, 15579, 15581, 15585, 15582, 15581, 15584, 15588, 15586, 15587, 15589, 15593, 15590, 15589, 15589, 15592, 15589, 15588, 15589, 15593, 15590, 15590, 15592, 15596, 15595, 15595, 15597, 15601, 15598, 15596, 15597, 15599, 15595, 15594, 15595, 15599, 15596, 15595, 15597, 15601, 15599, 15599, 15601, 15605, 15602, 15600, 15601, 15604, 15601, 15599, 15601, 15605, 15602, 15601, 15604, 15608, 15606, 15607, 15609, 15613, 15610, 15608, 15609, 15611, 15608, 15606, 15607, 15611, 15608, 15607, 15609, 15613, 15611, 15611, 15613, 15617, 15614, 15612, 15613, 15616, 15612, 15611, 15613, 15616, 15614, 15613, 15615, 15620, 15618, 15618, 15621, 15625, 15622, 15621, 15621, 15624, 15621, 15619, 15621, 15625, 15622, 15621, 15624, 15628, 15626, 15627, 15629, 15633, 15630, 15629, 15629, 15632, 15629, 15628, 15629, 15633, 15630, 15630, 15632, 15636, 15635, 15635, 15637, 15641, 15638, 15636, 15637, 15639, 15635, 15634, 15635, 15639, 15636, 15635, 15637, 15641, 15639, 15639, 15641, 15645, 15642, 15640, 15641, 15644, 15640, 15639, 15641, 15644, 15642, 15641, 15643, 15648, 15646, 15646, 15649, 15653, 15650, 15649, 15649, 15652, 15649, 15647, 15649, 15653, 15650, 15649, 15652, 15656, 15654, 15654, 15657, 15661, 15658, 15657, 15657, 15660, 15657, 15656, 15657, 15661, 15658, 15658, 15660, 15664, 15663, 15663, 15665, 15669, 15666, 15664, 15665, 15667, 15663, 15662, 15663, 15667, 15664, 15663, 15665, 15669, 15667, 15667, 15669, 15673, 15670, 15668, 15669, 15672, 15668, 15667, 15669, 15673, 15670, 15669, 15672, 15676, 15674, 15675, 15677, 15681, 15678, 15676, 15677, 15679, 15676, 15674, 15675, 15679, 15676, 15675, 15677, 15681, 15679, 15679, 15681, 15685, 15682, 15680, 15681, 15684, 15680, 15679, 15681, 15684, 15682, 15681, 15683, 15688, 15686, 15686, 15689, 15693, 15690, 15689, 15689, 15692, 15689, 15687, 15689, 15693, 15690, 15689, 15692, 15696, 15694, 15694, 15697, 15701, 15698, 15697, 15697, 15700, 15697, 15696, 15697, 15701, 15698, 15698, 15700, 15704, 15703, 15703, 15705, 15709, 15706, 15704, 15705, 15707, 15703, 15702, 15703, 15707, 15704, 15703, 15705, 15709, 15707, 15707, 15709, 15713, 15710, 15708, 15709, 15712, 15708, 15707, 15709, 15712, 15710, 15709, 15711, 15716, 15714, 15714, 15717, 15721, 15718, 15717, 15717, 15720, 15717, 15715, 15717, 15721, 15718, 15717, 15720, 15724, 15722, 15722, 15725, 15729, 15726, 15725, 15725, 15728, 15725, 15724, 15725, 15729, 15726, 15726, 15728, 15732, 15731, 15731, 15733, 15737, 15734, 15732, 15733, 15735, 15731, 15730, 15731, 15734, 15732, 15731, 15733, 15737, 15735, 15735, 15737, 15741, 15738, 15736, 15737, 15740, 15736, 15735, 15737, 15741, 15738, 15737, 15740, 15744, 15742, 15743, 15745, 15749, 15746, 15744, 15745, 15747, 15743, 15742, 15743, 15747, 15744, 15743, 15745, 15749, 15747, 15747, 15749, 15753, 15750, 15748, 15749, 15751, 15748, 15747, 15748, 15752, 15749, 15749, 15751, 15756, 15754, 15754, 15757, 15761, 15758, 15757, 15757, 15760, 15757, 15755, 15757, 15761, 15758, 15757, 15759, 15764, 15762, 15762, 15765, 15769, 15766, 15765, 15765, 15768, 15765, 15764, 15765, 15769, 15766, 15766, 15768, 15772, 15771, 15771, 15773, 15777, 15774, 15772, 15773, 15775, 15771, 15770, 15771, 15775, 15772, 15771, 15773, 15777, 15775, 15775, 15777, 15781, 15778, 15776, 15777, 15779, 15776, 15775, 15776, 15780, 15777, 15777, 15779, 15784, 15782, 15782, 15785, 15789, 15786, 15784, 15785, 15788, 15785, 15783, 15785, 15789, 15786, 15785, 15787, 15792, 15790, 15790, 15793, 15797, 15794, 15793, 15793, 15796, 15793, 15792, 15793, 15797, 15794, 15794, 15796, 15800, 15799, 15799, 15801, 15805, 15802, 15800, 15800, 15803, 15799, 15798, 15799, 15802, 15799, 15799, 15801, 15805, 15803, 15803, 15805, 15809, 15806, 15804, 15805, 15808, 15804, 15803, 15805, 15809, 15806, 15805, 15808, 15812, 15810, 15811, 15813, 15817, 15814, 15812, 15813, 15815, 15811, 15810, 15811, 15815, 15812, 15811, 15813, 15817, 15815, 15815, 15817, 15821, 15818, 15816, 15817, 15819, 15816, 15815, 15816, 15820, 15817, 15817, 15819, 15823, 15822, 15822, 15825, 15829, 15826, 15825, 15825, 15828, 15825, 15824, 15825, 15829, 15826, 15826, 15828, 15832, 15831, 15831, 15833, 15837, 15834, 15832, 15832, 15835, 15831, 15830, 15831, 15834, 15831, 15831, 15832, 15837, 15835, 15835, 15837, 15841, 15838, 15836, 15837, 15840, 15836, 15835, 15837, 15841, 15838, 15837, 15840, 15844, 15842, 15843, 15845, 15849, 15846, 15844, 15845, 15847, 15843, 15842, 15843, 15847, 15844, 15843, 15845, 15849, 15847, 15847, 15849, 15853, 15850, 15848, 15849, 15851, 15848, 15847, 15848, 15852, 15849, 15849, 15851, 15856, 15854, 15854, 15857, 15861, 15858, 15856, 15857, 15860, 15856, 15855, 15857, 15861, 15858, 15857, 15859, 15864, 15862, 15862, 15865, 15869, 15866, 15865, 15865, 15868, 15865, 15864, 15865, 15869, 15866, 15866, 15868, 15872, 15870, 15871, 15873, 15877, 15874, 15872, 15873, 15875, 15871, 15870, 15871, 15875, 15872, 15871, 15873, 15877, 15875, 15875, 15877, 15881, 15878, 15876, 15877, 15879, 15876, 15875, 15876, 15880, 15877, 15877, 15879, 15884, 15882, 15882, 15885, 15889, 15886, 15884, 15885, 15888, 15884, 15883, 15885, 15889, 15886, 15885, 15887, 15892, 15890, 15890, 15893, 15897, 15894, 15893, 15893, 15896, 15893, 15892, 15893, 15897, 15894, 15894, 15896, 15900, 15898, 15899, 15901, 15905, 15902, 15900, 15900, 15903, 15899, 15898, 15899, 15902, 15899, 15899, 15900, 15905, 15903, 15903, 15905, 15909, 15906, 15904, 15905, 15908, 15904, 15903, 15905, 15909, 15906, 15905, 15908, 15912, 15910, 15911, 15913, 15917, 15914, 15912, 15913, 15915, 15911, 15910, 15911, 15915, 15912, 15911, 15913, 15917, 15915, 15915, 15917, 15921, 15918, 15916, 15917, 15919, 15916, 15915, 15916, 15920, 15917, 15917, 15919, 15924, 15922, 15922, 15925, 15929, 15926, 15924, 15925, 15928, 15925, 15923, 15925, 15929, 15926, 15925, 15928, 15932, 15930, 15930, 15933, 15937, 15934, 15932, 15933, 15936, 15932, 15931, 15933, 15936, 15934, 15933, 15935, 15940, 15938, 15938, 15941, 15945, 15942, 15941, 15941, 15944, 15941, 15940, 15941, 15945, 15942, 15942, 15944, 15948, 15946, 15947, 15949, 15953, 15950, 15948, 15948, 15951, 15947, 15946, 15947, 15950, 15947, 15946, 15948, 15953, 15951, 15951, 15953, 15957, 15954, 15952, 15953, 15956, 15952, 15951, 15953, 15957, 15954, 15953, 15955, 15960, 15958, 15958, 15961, 15965, 15962, 15960, 15961, 15963, 15959, 15958, 15959, 15963, 15960, 15959, 15961, 15965, 15963, 15963, 15965, 15969, 15966, 15964, 15965, 15967, 15964, 15963, 15964, 15968, 15965, 15965, 15967, 15972, 15970, 15970, 15973, 15977, 15974, 15972, 15973, 15976, 15972, 15971, 15973, 15976, 15974, 15973, 15975, 15980, 15978, 15978, 15981, 15985, 15982, 15980, 15981, 15984, 15981, 15980, 15981, 15985, 15982, 15982, 15984, 15988, 15986, 15987, 15989, 15993, 15990, 15988, 15988, 15991, 15987, 15986, 15987, 15990, 15987, 15987, 15989, 15993, 15991, 15991, 15993, 15997, 15994, 15992, 15993, 15995, 15992, 15991, 15992, 15996, 15993, 15993, 15995, 16000, 15998, 15998, 16001, 16005, 16002, 16000, 16001, 16004, 16000, 15999, 16001, 16004, 16002, 16001, 16003, 16008, 16006, 16006, 16009, 16013, 16010, 16008, 16009, 16012, 16009, 16008, 16009, 16013, 16010, 16010, 16012, 16016, 16014, 16015, 16017, 16021, 16018, 16016, 16016, 16019, 16015, 16014, 16015, 16018, 16015, 16014, 16016, 16021, 16019, 16019, 16021, 16025, 16022, 16020, 16021, 16024, 16020, 16019, 16021, 16024, 16022, 16021, 16023, 16028, 16026, 16026, 16029, 16033, 16030, 16028, 16029, 16031, 16027, 16026, 16027, 16031, 16028, 16027, 16029, 16033, 16031, 16031, 16033, 16037, 16034, 16032, 16033, 16035, 16032, 16031, 16032, 16036, 16033, 16033, 16035, 16039, 16038, 16038, 16041, 16045, 16042, 16040, 16041, 16044, 16040, 16039, 16041, 16044, 16042, 16041, 16043, 16048, 16046, 16046, 16049, 16053, 16050, 16048, 16049, 16052, 16049, 16047, 16049, 16053, 16050, 16050, 16052, 16056, 16054, 16055, 16057, 16061, 16058, 16056, 16056, 16059, 16055, 16054, 16055, 16058, 16055, 16054, 16056, 16061, 16059, 16059, 16061, 16065, 16062, 16060, 16061, 16064, 16060, 16059, 16061, 16064, 16062, 16061, 16063, 16068, 16066, 16066, 16069, 16073, 16070, 16068, 16069, 16071, 16067, 16066, 16067, 16071, 16068, 16067, 16069, 16073, 16071, 16071, 16073, 16077, 16074, 16072, 16073, 16075, 16072, 16071, 16072, 16076, 16073, 16073, 16075, 16079, 16078, 16078, 16081, 16085, 16082, 16080, 16081, 16084, 16080, 16079, 16081, 16085, 16082, 16081, 16083, 16088, 16086, 16086, 16089, 16093, 16090, 16088, 16089, 16092, 16088, 16087, 16089, 16092, 16090, 16089, 16091, 16096, 16094, 16094, 16097, 16101, 16098, 16096, 16097, 16100, 16097, 16095, 16097, 16101, 16098, 16098, 16100, 16104, 16102, 16103, 16105, 16109, 16106, 16104, 16104, 16107, 16103, 16101, 16103, 16106, 16103, 16102, 16104, 16109, 16107, 16107, 16109, 16113, 16110, 16108, 16109, 16112, 16108, 16107, 16109, 16112, 16110, 16109, 16111, 16116, 16114, 16114, 16117, 16121, 16118, 16116, 16116, 16119, 16115, 16114, 16115, 16119, 16116, 16115, 16117, 16121, 16119, 16119, 16121, 16125, 16122, 16120, 16121, 16123, 16120, 16119, 16120, 16124, 16121, 16121, 16123, 16127, 16126, 16126, 16129, 16133, 16130, 16128, 16129, 16132, 16128, 16127, 16129, 16132, 16130, 16129, 16131, 16136, 16134, 16134, 16137, 16141, 16138, 16136, 16137, 16140, 16137, 16135, 16137, 16141, 16138, 16137, 16140, 16144, 16142, 16143, 16145, 16149, 16146, 16144, 16144, 16147, 16143, 16141, 16143, 16146, 16143, 16142, 16144, 16149, 16147, 16147, 16149, 16153, 16150, 16148, 16149, 16152, 16148, 16147, 16149, 16152, 16150, 16149, 16151, 16156, 16154, 16154, 16157, 16161, 16158, 16156, 16156, 16159, 16155, 16154, 16155, 16159, 16155, 16155, 16157, 16161, 16159, 16159, 16161, 16165, 16162, 16160, 16161, 16163, 16160, 16159, 16160, 16164, 16161, 16161, 16163, 16167, 16166, 16166, 16169, 16173, 16170, 16168, 16169, 16172, 16168, 16167, 16169, 16173, 16170, 16169, 16171, 16176, 16174, 16174, 16177, 16181, 16178, 16176, 16177, 16180, 16176, 16175, 16176, 16180, 16177, 16177, 16179, 16184, 16182, 16182, 16185, 16189, 16186, 16184, 16185, 16188, 16185, 16183, 16185, 16189, 16186, 16185, 16188, 16192, 16190, 16191, 16193, 16197, 16194, 16192, 16192, 16195, 16191, 16189, 16191, 16194, 16191, 16190, 16192, 16196, 16195, 16195, 16197, 16201, 16198, 16196, 16197, 16200, 16196, 16195, 16197, 16200, 16198, 16197, 16199, 16204, 16202, 16202, 16205, 16209, 16206, 16204, 16204, 16207, 16203, 16202, 16203, 16207, 16203, 16203, 16204, 16209, 16207, 16207, 16209, 16213, 16210, 16208, 16209, 16211, 16208, 16207, 16208, 16212, 16209, 16209, 16211, 16215, 16214, 16214, 16217, 16221, 16218, 16216, 16217, 16220, 16216, 16215, 16217, 16220, 16218, 16217, 16219, 16224, 16222, 16222, 16225, 16229, 16226, 16224, 16225, 16228, 16225, 16223, 16225, 16229, 16226, 16225, 16228, 16232, 16230, 16230, 16233, 16237, 16234, 16232, 16232, 16235, 16231, 16229, 16231, 16234, 16231, 16230, 16232, 16236, 16235, 16235, 16237, 16241, 16238, 16236, 16237, 16240, 16236, 16235, 16237, 16240, 16238, 16237, 16239, 16244, 16242, 16242, 16245, 16249, 16246, 16244, 16244, 16247, 16243, 16242, 16243, 16247, 16243, 16243, 16244, 16249, 16247, 16247, 16249, 16253, 16250, 16248, 16249, 16251, 16248, 16246, 16248, 16252, 16249, 16249, 16251, 16255, 16254, 16254, 16257, 16261, 16258, 16256, 16257, 16260, 16256, 16255, 16257, 16261, 16258, 16257, 16259, 16264, 16262, 16262, 16265, 16269, 16266, 16264, 16265, 16268, 16264, 16263, 16264, 16268, 16265, 16265, 16267, 16272, 16270, 16270, 16273, 16277, 16274, 16272, 16273, 16276, 16273, 16271, 16273, 16277, 16274, 16273, 16276, 16280, 16278, 16278, 16281, 16285, 16282, 16280, 16280, 16283, 16279, 16277, 16279, 16282, 16279, 16278, 16280, 16284, 16282, 16283, 16285, 16289, 16286, 16284, 16285, 16288, 16284, 16283, 16285, 16288, 16286, 16285, 16287, 16292, 16290, 16290, 16293, 16297, 16294, 16292, 16292, 16295, 16291, 16290, 16291, 16294, 16291, 16290, 16292, 16297, 16295, 16295, 16297, 16301, 16298, 16296, 16297, 16299, 16296, 16294, 16296, 16300, 16297, 16297, 16299, 16303, 16302, 16302, 16305, 16309, 16306, 16304, 16305, 16308, 16304, 16303, 16305, 16308, 16306, 16305, 16307, 16312, 16310, 16310, 16313, 16317, 16314, 16312, 16313, 16316, 16312, 16311, 16313, 16317, 16314, 16313, 16316, 16320, 16318, 16318, 16321, 16325, 16322, 16320, 16320, 16323, 16319, 16317, 16319, 16322, 16319, 16318, 16320, 16324, 16322, 16322, 16325, 16329, 16326, 16324, 16325, 16328, 16324, 16323, 16324, 16328, 16326, 16325, 16327, 16332, 16330, 16330, 16333, 16337, 16334, 16332, 16332, 16335, 16331, 16330, 16331, 16334, 16331, 16330, 16332, 16337, 16335, 16335, 16337, 16341, 16338, 16336, 16337, 16339, 16336, 16334, 16336, 16340, 16337, 16336, 16339, 16343, 16342, 16342, 16345, 16349, 16346, 16344, 16345, 16348, 16344, 16343, 16345, 16349, 16346, 16345, 16347, 16352, 16350, 16350, 16353, 16357, 16354, 16352, 16353, 16355, 16352, 16351, 16352, 16356, 16353, 16353, 16355, 16359, 16358, 16358, 16361, 16365, 16362, 16360, 16361, 16364, 16361, 16360, 16362, 16366, 16363, 16363, 16366, 16370, 16369, 16369, 16372, 16377, 16374, 16373, 16374, 16377, 16374, 16373, 16375, 16379, 16376, 16376, 16379, 16383, 16381, 16381, 16383] + is_save: false + +auto_exposure: + is_enable: true + is_debug: true + center_illuminance: 90 + histogram_skewness: 0.9 + + +color_space_conversion: + conv_standard: 2 + # Bt.709 HD = 1 + # Bt.601/4407 = 2 + is_save: false + + +ldci: + is_enable: false + clip_limit: 1 + wind: 16 + is_save: false + +sharpen: + is_enable: true + sharpen_sigma: 5 + sharpen_strength: 1 + is_save: false + +2d_noise_reduction: + is_enable: false + # nlm + window_size: 21 + patch_size: 9 + wts: 10 + is_save: false + +rgb_conversion: + is_enable: true + is_save: false + +scale: + is_enable: false + is_debug: true + new_width: 1920 + new_height: 1080 + isHardware: true + # Nearest_Neighbor # Bilinear + Algo: "Nearest_Neighbor" + upscale_method: "Nearest_Neighbor" + downscale_method: "Bilinear" + is_save: false + +yuv_conversion_format: + # The conversion wont run if csc is false + is_enable: false + conv_type: '444' + is_save: false + +pre_gamma: + is_enable: false + is_save: false + +tone_mapping: + is_enable: false + is_save: false + +jpeg_conversion: + is_enable: false + is_save: false diff --git a/in_frames/normal/Outdoor4_2592x1536_12bit_RGGB.raw b/in_frames/normal/data/Outdoor4_2592x1536_12bit_RGGB.raw similarity index 100% rename from in_frames/normal/Outdoor4_2592x1536_12bit_RGGB.raw rename to in_frames/normal/data/Outdoor4_2592x1536_12bit_RGGB.raw diff --git a/infinite_isp.py b/infinite_isp.py new file mode 100644 index 0000000..14abae5 --- /dev/null +++ b/infinite_isp.py @@ -0,0 +1,441 @@ +""" +File: isp_pipeline.py +Description: Executes the complete pipeline +Code / Paper Reference: +Author: 10xEngineers Pvt Ltd +------------------------------------------------------------ +""" +import time +from pathlib import Path +import numpy as np +import yaml +import rawpy + +import util.utils as util + +from modules.crop.crop import Crop +from modules.dead_pixel_correction.dead_pixel_correction import ( + DeadPixelCorrection as DPC, +) +from modules.black_level_correction.black_level_correction import ( + BlackLevelCorrection as BLC, +) +from modules.oecf.oecf import OECF +from modules.digital_gain.digital_gain import DigitalGain as DG +from modules.lens_shading_correction.lens_shading_correction import ( + LensShadingCorrection as LSC, +) +from modules.bayer_noise_reduction.bayer_noise_reduction import ( + BayerNoiseReduction as BNR, +) +from modules.auto_white_balance.auto_white_balance import AutoWhiteBalance as AWB +from modules.white_balance.white_balance import WhiteBalance as WB +from modules.demosaic.demosaic import Demosaic +from modules.color_correction_matrix.color_correction_matrix import ( + ColorCorrectionMatrix as CCM, +) +from modules.gamma_correction.gamma_correction import GammaCorrection as GC +from modules.auto_exposure.auto_exposure import AutoExposure as AE +from modules.color_space_conversion.color_space_conversion import ( + ColorSpaceConversion as CSC, +) +from modules.ldci.ldci import LDCI +from modules.sharpen.sharpen import Sharpening as SHARP +from modules.noise_reduction_2d.noise_reduction_2d import NoiseReduction2d as NR2D +from modules.rgb_conversion.rgb_conversion import RGBConversion as RGBC +from modules.scale.scale import Scale +from modules.yuv_conv_format.yuv_conv_format import YUVConvFormat as YUV_C + + +class InfiniteISP: + """ + Infinite-ISP Pipeline + """ + + def __init__(self, data_path, config_path): + """ + Constructor: Initialize with config and raw file path + and Load configuration parameter from yaml file + """ + self.data_path = data_path + self.load_config(config_path) + + def load_config(self, config_path): + """ + Load config information to respective module parameters + """ + self.config_path = config_path + with open(config_path, "r", encoding="utf-8") as file: + c_yaml = yaml.safe_load(file) + + # Extract workspace info + self.platform = c_yaml["platform"] + self.raw_file = self.platform["filename"] + self.render_3a = self.platform["render_3a"] + + # Extract basic sensor info + self.sensor_info = c_yaml["sensor_info"] + + # Get isp module params + self.parm_dpc = c_yaml["dead_pixel_correction"] + self.parm_dga = c_yaml["digital_gain"] + self.parm_lsc = c_yaml["lens_shading_correction"] + self.parm_bnr = c_yaml["bayer_noise_reduction"] + self.parm_blc = c_yaml["black_level_correction"] + self.parm_oec = c_yaml["oecf"] + self.parm_wbc = c_yaml["white_balance"] + self.parm_awb = c_yaml["auto_white_balance"] + self.parm_dem = c_yaml["demosaic"] + self.parm_ae = c_yaml["auto_exposure"] + self.parm_ccm = c_yaml["color_correction_matrix"] + self.parm_gmc = c_yaml["gamma_correction"] + self.parm_csc = c_yaml["color_space_conversion"] + self.parm_ldci = c_yaml["ldci"] + self.parm_sha = c_yaml["sharpen"] + self.parm_2dn = c_yaml["2d_noise_reduction"] + self.parm_rgb = c_yaml["rgb_conversion"] + self.parm_sca = c_yaml["scale"] + self.parm_cro = c_yaml["crop"] + self.parm_yuv = c_yaml["yuv_conversion_format"] + self.c_yaml = c_yaml + + self.platform["rgb_output"] = self.parm_rgb["is_enable"] + + # add rgb_output_conversion module + + def load_raw(self): + """ + Load raw image from provided path + """ + # Load raw image file information + path_object = Path(self.data_path, self.raw_file) + raw_path = str(path_object.resolve()) + self.in_file = path_object.stem + self.out_file = "Out_" + self.in_file + + self.platform["in_file"] = self.in_file + self.platform["out_file"] = self.out_file + + width = self.sensor_info["width"] + height = self.sensor_info["height"] + bit_depth = self.sensor_info["bit_depth"] + + # Load Raw + if path_object.suffix == ".raw": + if bit_depth > 8: + self.raw = np.fromfile(raw_path, dtype=np.uint16).reshape( + (height, width) + ) + else: + self.raw = ( + np.fromfile(raw_path, dtype=np.uint8) + .reshape((height, width)) + .astype(np.uint16) + ) + else: + img = rawpy.imread(raw_path) + self.raw = img.raw_image + + def run_pipeline(self, visualize_output=True): + """ + Simulation of ISP-Pipeline + """ + + # ===================================================================== + # Cropping + crop = Crop(self.raw, self.platform, self.sensor_info, self.parm_cro) + cropped_img = crop.execute() + + # ===================================================================== + # Dead pixels correction + dpc = DPC(cropped_img, self.sensor_info, self.parm_dpc, self.platform) + dpc_raw = dpc.execute() + + # ===================================================================== + # Black level correction + blc = BLC(dpc_raw, self.platform, self.sensor_info, self.parm_blc) + blc_raw = blc.execute() + + # ===================================================================== + # OECF + oecf = OECF(blc_raw, self.platform, self.sensor_info, self.parm_oec) + oecf_raw = oecf.execute() + + # ===================================================================== + # Digital Gain + dga = DG(oecf_raw, self.platform, self.sensor_info, self.parm_dga) + dga_raw, self.dga_current_gain = dga.execute() + + # ===================================================================== + # Lens shading correction + lsc = LSC(dga_raw, self.platform, self.sensor_info, self.parm_lsc) + lsc_raw = lsc.execute() + + # ===================================================================== + # Bayer noise reduction + bnr = BNR(lsc_raw, self.sensor_info, self.parm_bnr, self.platform) + bnr_raw = bnr.execute() + + # ===================================================================== + # Auto White Balance + awb = AWB(bnr_raw, self.sensor_info, self.parm_awb) + self.awb_gains = awb.execute() + + # ===================================================================== + # White balancing + wbc = WB(bnr_raw, self.platform, self.sensor_info, self.parm_wbc) + wb_raw = wbc.execute() + + # ===================================================================== + # CFA demosaicing + cfa_inter = Demosaic(wb_raw, self.platform, self.sensor_info, self.parm_dem) + demos_img = cfa_inter.execute() + + # ===================================================================== + # Color correction matrix + ccm = CCM(demos_img, self.platform, self.sensor_info, self.parm_ccm) + ccm_img = ccm.execute() + + # ===================================================================== + # Gamma + gmc = GC(ccm_img, self.platform, self.sensor_info, self.parm_gmc) + gamma_raw = gmc.execute() + + # ===================================================================== + # Auto-Exposure + aef = AE(gamma_raw, self.sensor_info, self.parm_ae) + self.ae_feedback = aef.execute() + + # ===================================================================== + # Color space conversion + csc = CSC(gamma_raw, self.platform, self.sensor_info, self.parm_csc) + csc_img = csc.execute() + + # ===================================================================== + # Local Dynamic Contrast Improvement + ldci = LDCI( + csc_img, + self.platform, + self.sensor_info, + self.parm_ldci, + self.parm_csc["conv_standard"], + ) + ldci_img = ldci.execute() + + # ===================================================================== + # Sharpening + sharp = SHARP( + ldci_img, + self.platform, + self.sensor_info, + self.parm_sha, + self.parm_csc["conv_standard"], + ) + sharp_img = sharp.execute() + + # ===================================================================== + # 2d noise reduction + nr2d = NR2D( + sharp_img, + self.sensor_info, + self.parm_2dn, + self.platform, + self.parm_csc["conv_standard"], + ) + nr2d_img = nr2d.execute() + + # ===================================================================== + # RGB conversion + rgbc = RGBC( + nr2d_img, self.platform, self.sensor_info, self.parm_rgb, self.parm_csc + ) + rgbc_img = rgbc.execute() + + # ===================================================================== + # Scaling + scale = Scale( + rgbc_img, + self.platform, + self.sensor_info, + self.parm_sca, + self.parm_csc["conv_standard"], + ) + scaled_img = scale.execute() + + # ===================================================================== + # YUV saving format 444, 422 etc + yuv = YUV_C(scaled_img, self.platform, self.sensor_info, self.parm_yuv) + yuv_conv = yuv.execute() + + # only to view image if csc is off it does nothing + out_img = yuv_conv + out_dim = scaled_img.shape # dimensions of Output Image + + # Is not part of ISP-pipeline only assists in visualizing output results + if visualize_output: + + # There can be two out_img formats depending upon which modules are + # enabled 1. YUV 2. RGB + + if self.parm_yuv["is_enable"] is True: + + # YUV_C is enabled and RGB_C is disabled: Output is compressed YUV + # To display : Need to decompress it and convert it to RGB. + image_height, image_width, _ = out_dim + yuv_custom_format = self.parm_yuv["conv_type"] + + yuv_conv = util.get_image_from_yuv_format_conversion( + yuv_conv, image_height, image_width, yuv_custom_format + ) + + rgbc.yuv_img = yuv_conv + out_rgb = rgbc.yuv_to_rgb() + + elif self.parm_rgb["is_enable"] is False: + + # RGB_C is disabled: Output is 3D - YUV + # To display : Only convert it to RGB + rgbc.yuv_img = yuv_conv + out_rgb = rgbc.yuv_to_rgb() + + else: + # RGB_C is enabled: Output is RGB + # no further processing is needed for display + out_rgb = out_img + + # If both RGB_C and YUV_C are enabled. Infinite-ISP will generate + # an output but it will be an invalid image. + + util.save_pipeline_output(self.out_file, out_rgb, self.c_yaml) + + def execute(self, img_path=None): + """ + Start execution of Infinite-ISP + """ + if img_path is not None: + self.raw_file = img_path + self.c_yaml["platform"]["filename"] = self.raw_file + + self.load_raw() + + # Print Logs to mark start of pipeline Execution + print(50 * "-" + "\nLoading RAW Image Done......\n") + print("Filename: ", self.in_file) + + # Note Initial Time for Pipeline Execution + start = time.time() + + if not self.render_3a: + # Run ISP-Pipeline once + self.run_pipeline(visualize_output=True) + # Display 3A Statistics + else: + # Run ISP-Pipeline till Correct Exposure with AWB gains + self.execute_with_3a_statistics() + + util.display_ae_statistics(self.ae_feedback, self.awb_gains) + + # Print Logs to mark end of pipeline Execution + print(50 * "-" + "\n") + + # Calculate pipeline execution time + print(f"\nPipeline Elapsed Time: {time.time() - start:.3f}s") + + def load_3a_statistics(self, awb_on=True, ae_on=True): + """ + Update 3A Stats into WB and DG modules parameters + """ + # Update 3A in c_yaml too because it is output config + if awb_on is True and self.parm_dga["is_auto"] and self.parm_awb["is_enable"]: + self.parm_wbc["r_gain"] = self.c_yaml["white_balance"]["r_gain"] = float( + self.awb_gains[0] + ) + self.parm_wbc["b_gain"] = self.c_yaml["white_balance"]["b_gain"] = float( + self.awb_gains[1] + ) + if ae_on is True and self.parm_dga["is_auto"] and self.parm_ae["is_enable"]: + self.parm_dga["ae_feedback"] = self.c_yaml["digital_gain"][ + "ae_feedback" + ] = self.ae_feedback + self.parm_dga["current_gain"] = self.c_yaml["digital_gain"][ + "current_gain" + ] = self.dga_current_gain + + def execute_with_3a_statistics(self): + """ + Execute Infinite-ISP with AWB gains and correct exposure + """ + + # Maximum Iterations depend on total permissible gains + max_dg = len(self.parm_dga["gain_array"]) + + # Run ISP-Pipeline + self.run_pipeline(visualize_output=False) + self.load_3a_statistics() + while not ( + (self.ae_feedback == 0) + or (self.ae_feedback == -1 and self.dga_current_gain == max_dg) + or (self.ae_feedback == 1 and self.dga_current_gain == 0) + or self.ae_feedback is None + ): + self.run_pipeline(visualize_output=False) + self.load_3a_statistics() + + self.run_pipeline(visualize_output=True) + + def update_sensor_info(self, sensor_info, update_blc_wb=False): + """ + Update sensor_info in config files + """ + self.sensor_info["width"] = self.c_yaml["sensor_info"]["width"] = sensor_info[0] + + self.sensor_info["height"] = self.c_yaml["sensor_info"]["height"] = sensor_info[ + 1 + ] + + self.sensor_info["bit_depth"] = self.c_yaml["sensor_info"][ + "bit_depth" + ] = sensor_info[2] + + self.sensor_info["bayer_pattern"] = self.c_yaml["sensor_info"][ + "bayer_pattern" + ] = sensor_info[3] + + if update_blc_wb: + self.parm_blc["r_offset"] = self.c_yaml["black_level_correction"][ + "r_offset" + ] = sensor_info[4][0] + self.parm_blc["gr_offset"] = self.c_yaml["black_level_correction"][ + "gr_offset" + ] = sensor_info[4][1] + self.parm_blc["gb_offset"] = self.c_yaml["black_level_correction"][ + "gb_offset" + ] = sensor_info[4][2] + self.parm_blc["b_offset"] = self.c_yaml["black_level_correction"][ + "b_offset" + ] = sensor_info[4][3] + + self.parm_blc["r_sat"] = self.c_yaml["black_level_correction"][ + "r_sat" + ] = sensor_info[5] + self.parm_blc["gr_sat"] = self.c_yaml["black_level_correction"][ + "gr_sat" + ] = sensor_info[5] + self.parm_blc["gb_sat"] = self.c_yaml["black_level_correction"][ + "gb_sat" + ] = sensor_info[5] + self.parm_blc["b_sat"] = self.c_yaml["black_level_correction"][ + "b_sat" + ] = sensor_info[5] + + self.parm_wbc["r_gain"] = self.c_yaml["white_balance"][ + "r_gain" + ] = sensor_info[6][0] + self.parm_wbc["b_gain"] = self.c_yaml["white_balance"][ + "b_gain" + ] = sensor_info[6][2] + + # if sensor_info[7] is not None: + # self.parm_ccm["corrected_red"] = sensor_info[7][0,0:3] + # self.parm_ccm["corrected_green"] = sensor_info[7][1,0:3] + # self.parm_ccm["corrected_blue"] = sensor_info[7][2,0:3] diff --git a/isp_pipeline.py b/isp_pipeline.py index 952770d..2f92dc4 100644 --- a/isp_pipeline.py +++ b/isp_pipeline.py @@ -1,194 +1,20 @@ -# File: isp_pipeline.py -# Description: Executes the complete pipeline -# Code / Paper Reference: -# Author: xx-isp (ispinfinite@gmail.com) -#------------------------------------------------------------ +""" +File: isp_pipeline.py +Description: Executes the complete pipeline +Code / Paper Reference: +Author: 10xEngineers Pvt Ltd +------------------------------------------------------------ +""" -from matplotlib import pyplot as plt -import numpy as np -import yaml -import rawpy -from pathlib import Path -from datetime import datetime -from modules.dead_pixel_correction import DeadPixelCorrection as DPC -from modules.hdr_stitching import HdrStitching as HDRS -from modules.digital_gain import DigitalGain as DG -from modules.lens_shading_correction import LensShadingCorrection as LSC -from modules.bayer_noise_reduction import BayerNoiseReduction as BNR -from modules.black_level_correction import BlackLevelCorrection as BLC -from modules.oecf import OECF -from modules.white_balance import WhiteBalance as WB -from modules.auto_white_balance import AutoWhiteBalance as AWB -from modules.gamma_correction import GammaCorrection as GC -from modules.tone_mapping import ToneMapping as TM -from modules.demosaic import CFAInterpolation as CFA_I -from modules.color_correction_matrix import ColorCorrectionMatrix as CCM -from modules.color_space_conversion import ColorSpaceConv as CSC -from modules.ldci import LDCI as LDCI -from modules.yuv_conv_format import YUVConvFormat as YUV_C -from modules.noise_reduction_2d import NoiseReduction2d as NR2D -from modules.scale import Scale -from modules.crop import Crop -from modules.sharpen import Sharpening as SHARP -from modules.auto_exposure import AutoExposure as AE +from infinite_isp import InfiniteISP -#Path to configuration file -config_path = './config/configs.yml' +CONFIG_PATH = "./config/configs.yml" +RAW_DATA = "./in_frames/normal" +FILENAME = None -#not to jumble any tags -yaml.preserve_quotes = True +if __name__ == "__main__": -with open(config_path, 'r') as f: - c_yaml = yaml.safe_load(f) + infinite_isp = InfiniteISP(RAW_DATA, CONFIG_PATH) -# Extract workspace info -platform = c_yaml['platform'] -raw_file = platform['filename'] - -# Extract basic sensor info -sensor_info = c_yaml['sensor_info'] -range = sensor_info['range'] -bayer = sensor_info['bayer_pattern'] -width = sensor_info['width'] -height = sensor_info['height'] -bpp = sensor_info['bitdep'] - - -# Get isp module params -parm_dpc = c_yaml['dead_pixel_correction'] -parm_hdr = c_yaml['hdr_stitching'] -parm_dga = c_yaml['digital_gain'] -parm_lsc = c_yaml['lens_shading_correction'] -parm_bnr = c_yaml['bayer_noise_reduction'] -parm_blc = c_yaml['black_level_correction'] -parm_oec = c_yaml['OECF'] -parm_wbc = c_yaml['white_balance'] -parm_awb = c_yaml['auto_white_balance'] -parm_gmm = c_yaml['pre_gamma'] -parm_ae = c_yaml['auto_exposure'] -parm_tmp = c_yaml['tone_mapping'] -parm_dem = c_yaml['demosaic'] -parm_ccm = c_yaml['color_correction_matrix'] -parm_gmc = c_yaml['gamma_correction'] -parm_csc = c_yaml['color_space_conversion'] -parm_ldci = c_yaml['ldci'] -parm_2dn = c_yaml['2d_noise_reduction'] -parm_sca = c_yaml['scale'] -parm_cro = c_yaml['crop'] -parm_sha = c_yaml['sharpen'] -parm_jpg = c_yaml['jpeg_conversion'] -parm_yuv = c_yaml['yuv_conversion_format'] - -# Get the path to the inputfile -raw_folder = './in_frames/normal/' -path_object = Path(raw_folder, raw_file) -raw_path = str(path_object.resolve()) -inFile = path_object.stem -outFile = "Out_" + inFile - -# Load Raw -if path_object.suffix == '.raw': - raw = np.fromfile(raw_path, dtype=np.uint16).reshape((height, width)) - # raw = np.float32(raw) / np.power(2,16) -else: - img = rawpy.imread(raw_path) - raw = img.raw_image - -print(50*'-' + '\nLoading RAW Image Done......\n') - -# Cropping -crop = Crop(raw, sensor_info, parm_cro) -cropped_img = crop.execute() -c_yaml["sensor_info"] = sensor_info - -# Dead pixels correction -dpc = DPC(cropped_img, sensor_info, parm_dpc, platform) -dpc_raw = dpc.execute() - -# 2 HDR stitching -# TODO figure out where in pipeline HDR stitching will happen and fix this numbering accordingly -hdr_st = HDRS(dpc_raw, sensor_info, parm_hdr) -hdr_raw = hdr_st.execute() - -# 3 Black level correction -blc = BLC(hdr_raw, sensor_info, parm_blc) -blc_raw = blc.execute() - -# 4 OECF -oecf = OECF(blc_raw, sensor_info, parm_oec) -oecf_raw = oecf.execute() - -# 5 Digital Gain -dga = DG(oecf_raw, sensor_info, parm_dga) -dga_raw = dga.execute() - -# 6 Lens shading correction -lsc = LSC(dga_raw, sensor_info, parm_lsc) -lsc_raw = lsc.execute() - -# 7 Bayer noise reduction -bnr = BNR(lsc_raw, sensor_info, parm_bnr, platform) -bnr_raw = bnr.execute() - -# 8 White balancing -wb = WB(bnr_raw, sensor_info, parm_wbc) -wb_raw = wb.execute() - -# 9 CFA demosaicing -cfa_inter = CFA_I(wb_raw, sensor_info, parm_dem) -demos_img = cfa_inter.execute() - -# Auto White Balance -awb = AWB(demos_img, sensor_info, parm_wbc, parm_awb) -awb_img = awb.execute() - -# 10 Color correction matrix -ccm = CCM(awb_img, sensor_info, parm_ccm) -ccm_img = ccm.execute() - -# Gamma -gc = GC(ccm_img, sensor_info, parm_gmc) -gamma_raw = gc.execute() - -# Auto-Exposure -ae = AE(gamma_raw, sensor_info, parm_ae, oecf_raw, dga, lsc, bnr, wb, cfa_inter, awb, ccm, gc) -ae_img = ae.execute() - -# Color space conversion -csc = CSC(ae_img, sensor_info, parm_csc) -csc_img = csc.execute() - -# Local Dynamic Contrast Improvement -ldci = LDCI(csc_img, sensor_info, parm_ldci) -ldci_img = ldci.execute() - -# 14 Sharpening -sharp = SHARP(ldci_img, sensor_info, parm_sha) -sharp_img = sharp.execute() - -# 15 2d noise reduction -nr2d = NR2D(sharp_img, sensor_info, parm_2dn, platform) -nr2d_img = nr2d.execute() - -# Scaling -scale = Scale(nr2d_img, sensor_info, parm_sca) -scaled_img = scale.execute() - -# 16 YUV saving format 444, 422 etc -yuv = YUV_C(nr2d_img, sensor_info, parm_yuv, inFile, parm_csc) -yuv_conv = yuv.execute() - -#only to view image if csc is off it does nothing -out_img = csc.yuv_to_rgb(scaled_img) - -# plt.imshow(sharp_img) -# plt.show() - -print(50*'-' + '\n') -dt_string = datetime.now().strftime("_%Y%m%d_%H%M%S") - -#save config -with open("./out_frames/" + outFile + dt_string+'.yaml', 'w') as file: - yaml.dump(c_yaml, file, sort_keys= False) -#save image -plt.imsave("./out_frames/" + outFile + dt_string + ".png", out_img) \ No newline at end of file + # set generate_tv flag to false + infinite_isp.execute(img_path=FILENAME) diff --git a/isp_pipeline_mulitple_images.py b/isp_pipeline_mulitple_images.py new file mode 100644 index 0000000..8dbd6b5 --- /dev/null +++ b/isp_pipeline_mulitple_images.py @@ -0,0 +1,136 @@ +""" +This script is used to run isp_pipeline.py on a dataset placed in ./inframes/normal/data +It also fetches if a separate config of a raw image is present othewise uses the default config +""" + +import os +from pathlib import Path +from tqdm import tqdm +from infinite_isp import InfiniteISP + +from util.config_utils import parse_file_name, extract_raw_metadata + +DATASET_PATH = "./in_frames/normal/data/" +CONFIG_PATH = "./config/configs.yml" +VIDEO_MODE = False +EXTRACT_SENSOR_INFO = True +UPDATE_BLC_WB = True + + +def video_processing(): + """ + Processed Images in a folder [DATASET_PATH] like frames of an Image. + - All images are processed with same config file located at CONFIG_PATH + - 3A Stats calculated on a frame are applied on the next frame + """ + + raw_files = [f_name for f_name in os.listdir(DATASET_PATH) if ".raw" in f_name] + raw_files.sort() + + infinite_isp = InfiniteISP(DATASET_PATH, CONFIG_PATH) + + # set generate_tv flag to false + infinite_isp.c_yaml["platform"]["generate_tv"] = False + infinite_isp.c_yaml["platform"]["render_3a"] = False + + for file in tqdm(raw_files, disable=False, leave=True): + + infinite_isp.execute(file) + infinite_isp.load_3a_statistics() + + +def dataset_processing(): + """ + Processed each image as a single entity that may or may not have its config + - If config file in the dataset folder has format filename-configs.yml it will + be use to proocess the image otherwise default config is used. + - For 3a-rendered output - set 3a_render flag in config file to true. + """ + + # The path for default config + default_config = CONFIG_PATH + + # Get the list of all files in the DATASET_PATH + directory_content = os.listdir(DATASET_PATH) + + # Get the list of all raw images in the DATASET_PATH + raw_images = [ + x + for x in directory_content + if (Path(DATASET_PATH, x).suffix in [".raw", ".NEF", ".dng", ".nef"]) + ] + + infinite_isp = InfiniteISP(DATASET_PATH, default_config) + + # set generate_tv flag to false + infinite_isp.c_yaml["platform"]["generate_tv"] = False + + is_default_config = True + + for raw in tqdm(raw_images, ncols=100, leave=True): + + raw_path_object = Path(raw) + config_file = raw_path_object.stem + "-configs.yml" + + # check if the config file exists in the DATASET_PATH + if find_files(config_file, DATASET_PATH): + + print(f"Found {config_file}.") + + # use raw config file in dataset + infinite_isp.load_config(DATASET_PATH + config_file) + is_default_config = False + infinite_isp.execute() + + else: + print(f"Not Found {config_file}, Changing filename in default config file.") + + # copy default config file + if not is_default_config: + infinite_isp.load_config(default_config) + is_default_config = True + + if EXTRACT_SENSOR_INFO: + if raw_path_object.suffix == ".raw": + print( + raw_path_object.suffix + + " file, sensor_info will be extracted from filename." + ) + sensor_info = parse_file_name(raw) + if sensor_info: + infinite_isp.update_sensor_info(sensor_info) + print("updated sensor_info into config") + else: + print("No information in filename - sensor_info not updated") + else: + sensor_info = extract_raw_metadata(DATASET_PATH + raw) + if sensor_info: + infinite_isp.update_sensor_info(sensor_info, UPDATE_BLC_WB) + print("updated sensor_info into config") + else: + print( + "Not compatible file for metadata - sensor_info not updated" + ) + + infinite_isp.execute(raw) + + +def find_files(filename, search_path): + """ + This function is used to find the files in the search_path + """ + for _, _, files in os.walk(search_path): + if filename in files: + return True + return False + + +if __name__ == "__main__": + + if VIDEO_MODE: + print("PROCESSING VIDEO FRAMES ONE BY ONE IN SEQUENCE") + video_processing() + + else: + print("PROCESSING DATSET IMAGES ONE BY ONE") + dataset_processing() diff --git a/modules/auto_exposure.py b/modules/auto_exposure.py deleted file mode 100644 index a244a90..0000000 --- a/modules/auto_exposure.py +++ /dev/null @@ -1,192 +0,0 @@ -# File: auto_exposure.py -# Description: 3A-AE Runs the Auto exposure algorithm in a loop -# Code / Paper Reference: https://www.atlantis-press.com/article/25875811.pdf -# http://tomlr.free.fr/Math%E9matiques/Math%20Complete/Probability%20and%20statistics/CRC%20-%20standard%20probability%20and%20Statistics%20tables%20and%20formulae%20-%20DANIEL%20ZWILLINGER.pdf -# Author: xx-isp (ispinfinite@gmail.com) -#------------------------------------------------------------ - -import numpy as np -from scipy.stats import skew -import matplotlib.pyplot as plt - - -class AutoExposure: - 'Auto Exposure' - - def __init__(self, img, sensor_info, parm_ae, oecf_raw, dga, lsc, bnr, wb, cfa_inter, awb, ccm, gc): - self.img = img - self.enable = parm_ae['isEnable'] - self.debug = parm_ae['isDebug'] - self.center_illuminance = parm_ae['center_illuminance'] - self.histogram_skewness_range = parm_ae['histogram_skewness'] - self.sensor_info = sensor_info - self.param_ae = parm_ae - - # Pipeline modules included in AE Feedback Loop - self.dga = dga - self.lsc = lsc - self.bnr = bnr - self.wb = wb - self.cfa_inter = cfa_inter - self.awb = awb - self.ccm = ccm - self.gc = gc - self.oecf_raw = oecf_raw - self.ae_iterations = 0 - - - def get_correct_exposure(self): - - while (True): - - #calculate the exposure metric - correction = self.determine_exposure() - - # check if correction is needed - if correction == 0: - - #Check whether the input image was already correct - if self.ae_iterations > 0: - - #Go through the final pipeline - self.generate_final_image(correction) - - # No correction is needed image is already correct - return self.img - else: - self.apply_digital_gain(correction) - - - - def determine_exposure(self): - - # plt.imshow(self.img) - # plt.show() - - # For Luminance Histograms, Image is first converted into greyscale image - # Function also returns average luminance of image which is used as AE-Stat - grey_img, avg_luminance = self.get_greyscale_image(self.img) - - # Histogram skewness Calculation for AE Stats - skewness = self.get_luminance_histogram_skewness(grey_img) - - if self.debug: - # To Visulaize luminance Histogram of an Image. - # hist, bin_edges = np.histogram(grey_img, range=(0, 255), bins=255, density=True) - # plt.bar(bin_edges[:-1], hist, width = 1) - # plt.xlim(min(bin_edges), max(bin_edges)) - # plt.show() - print(' - AE - Histogram Skewness = ', skewness) - - #get the ranges - lower_limit = -1 * self.histogram_skewness_range - upper_limit = 1 * self.histogram_skewness_range - - # Cannot apply anymore gains so return 0 so that final image is generated - if(self.dga.current_gain >= len(self.dga.gains_array)-1): - print(' - DG gain limit reached') - return 0 - - #see if skewness is within range - if(skewness >= lower_limit): - return 0 - else: - return skewness - - - def apply_digital_gain(self, correction): - - # Digital Gain is applied at the start of ISP Pipline - # In order to calculate AE-Stats all processing between Digital Gain and Auto Exposure is done again. - - self.ae_iterations += 1 - self.dga.img = self.oecf_raw - dga_raw = self.dga.execute(correction) - - # White balancing - self.wb.img = dga_raw - wb_raw = self.wb.execute() - - # CFA demosaicing - self.cfa_inter.img = wb_raw - demos_img = self.cfa_inter.execute() - - # Auto WHite Balance - self.awb.img = demos_img - awb_img = self.awb.execute() - - # Color correction matrix - self.ccm.img = awb_img - ccm_img = self.ccm.execute() - - # Gamma - self.gc.img = ccm_img - self.img = self.gc.execute() - - def generate_final_image(self, correction): - - # Digital Gain is applied at the start of ISP Pipline - # In order to calculate AE-Stats all processing between Digital Gain and Auto Exposure is done again. - self.dga.img = self.oecf_raw - dga_raw = self.dga.execute(correction) - - # Lens shading correction - self.lsc.img = dga_raw - lsc_raw = self.lsc.execute() - - # Bayer noise reduction - self.bnr.img = lsc_raw - bnr_raw = self.bnr.execute() - - # White balancing - self.wb.img = bnr_raw - wb_raw = self.wb.execute() - - # CFA demosaicing - self.cfa_inter.img = wb_raw - demos_img = self.cfa_inter.execute() - - self.awb.img = demos_img - awb_img = self.awb.execute() - - # Color correction matrix - self.ccm.img = awb_img - ccm_img = self.ccm.execute() - - # Gamma - self.gc.img = ccm_img - self.img = self.gc.execute() - - - - - def get_greyscale_image(self, img): - - # Formula for Conversion of an Image into Greyscale Image. - grey_img = np.clip(np.dot(img[...,:3], [0.299, 0.587, 0.144]), 0, 255).astype(np.uint8) - return grey_img, np.average(grey_img, axis=(0,1)) - - def get_luminance_histogram_skewness(self, img): - - # Zwillinger, D. and Kokoska, S. (2000). CRC Standard Probability and Statistics Tables and Formulae. Chapman & Hall: New York. 2000. Section 2.2.24.1 - - # First subtract central luminance to calculate skewness around it - img = img-self.center_illuminance - - # The sample skewness is computed as the Fisher-Pearson coefficient of skewness, i.e. g1 = (m3 / m2**(3/2)) * G1 - # where m2 is 2nd moment (variance) and m3 is third moment skewness - img = (img.astype(np.float64)-np.average(img)) - N = img.size - m2 = np.sum(np.power(img,2))/N - m3 = np.sum(np.power(img,3))/N - - G1 = np.sqrt(N*(N-1))/(N-2) - return np.nan_to_num((m3/abs(m2)**(3/2))*G1) - - - def execute(self): - print('Auto Exposure= ' + str(self.enable)) - - if self.enable == False: - return self.img - return self.get_correct_exposure() diff --git a/modules/auto_exposure/auto_exposure.py b/modules/auto_exposure/auto_exposure.py new file mode 100644 index 0000000..10b667b --- /dev/null +++ b/modules/auto_exposure/auto_exposure.py @@ -0,0 +1,122 @@ +""" +File: auto_exposure.py +Description: 3A-AE Runs the Auto exposure algorithm in a loop +Code / Paper Reference: https://www.atlantis-press.com/article/25875811.pdf + http://tomlr.free.fr/Math%E9matiques/Math%20Complete/Probability%20and%20statistics/CRC%20-%20standard%20probability%20and%20Statistics%20tables%20and%20formulae%20-%20DANIEL%20ZWILLINGER.pdf +Author: 10xEngineers Pvt Ltd +------------------------------------------------------------ +""" +import time +import numpy as np + + +class AutoExposure: + """ + Auto Exposure Module + """ + + def __init__(self, img, sensor_info, parm_ae): + self.img = img + self.enable = parm_ae["is_enable"] + self.is_debug = parm_ae["is_debug"] + self.center_illuminance = parm_ae["center_illuminance"] + self.histogram_skewness_range = parm_ae["histogram_skewness"] + self.sensor_info = sensor_info + self.param_ae = parm_ae + self.bit_depth = sensor_info["bit_depth"] + + # Pipeline modules included in AE Feedback Loop + # (White Balance) wb module is renamed to wbc (white balance correction) + # gc (Gamma Correction) module is renamed to gcm (Gamma Correction Module) + + def get_exposure_feedback(self): + """ + Get Correct Exposure by Adjusting Digital Gain + """ + # Convert Image into 8-bit for AE Calculation + self.img = self.img >> (self.bit_depth - 8) + self.bit_depth = 8 + + # calculate the exposure metric + return self.determine_exposure() + + def determine_exposure(self): + """ + Image Exposure Estimation using Skewness Luminance of Histograms + """ + + # plt.imshow(self.img) + # plt.show() + + # For Luminance Histograms, Image is first converted into greyscale image + # Function also returns average luminance of image which is used as AE-Stat + grey_img, avg_lum = self.get_greyscale_image(self.img) + print("Average luminance is = ", avg_lum) + + # Histogram skewness Calculation for AE Stats + skewness = self.get_luminance_histogram_skewness(grey_img) + + # get the ranges + upper_limit = self.histogram_skewness_range + lower_limit = -1 * upper_limit + + if self.is_debug: + print(" - AE - Histogram Skewness Range = ", upper_limit) + + # see if skewness is within range + if skewness < lower_limit: + return -1 + elif skewness > upper_limit: + return 1 + else: + return 0 + + def get_greyscale_image(self, img): + """ + Conversion of an Image into Greyscale Image + """ + # Each RGB pixels with [0.299, 0.587, 0.144] to get its luminance + grey_img = np.clip( + np.dot(img[..., :3], [0.299, 0.587, 0.144]), 0, (2**self.bit_depth) + ).astype(np.uint16) + return grey_img, np.average(grey_img, axis=(0, 1)) + + def get_luminance_histogram_skewness(self, img): + """ + Skewness Calculation in reference to: + Zwillinger, D. and Kokoska, S. (2000). CRC Standard Probability and Statistics + Tables and Formulae. Chapman & Hall: New York. 2000. Section 2.2.24.1 + """ + + # First subtract central luminance to calculate skewness around it + img = img.astype(np.float64) - self.center_illuminance + + # The sample skewness is computed as the Fisher-Pearson coefficient of + # skewness, i.e. (m_3 / m_2**(3/2)) * g_1 + # where m_2 is 2nd moment (variance) and m_3 is third moment skewness + + img_size = img.size + m_2 = np.sum(np.power(img, 2)) / img_size + m_3 = np.sum(np.power(img, 3)) / img_size + + g_1 = np.sqrt(img_size * (img_size - 1)) / (img_size - 2) + skewness = np.nan_to_num((m_3 / abs(m_2) ** (3 / 2)) * g_1) + + if self.is_debug: + print(" - AE - Histogram Skewness = ", skewness) + + return skewness + + def execute(self): + """ + Execute Auto Exposure + """ + print("Auto Exposure= " + str(self.enable)) + + if self.enable is False: + return None + else: + start = time.time() + ae_feedback = self.get_exposure_feedback() + print(f" Execution time: {time.time()-start:.3f}s") + return ae_feedback diff --git a/modules/auto_white_balance.py b/modules/auto_white_balance.py deleted file mode 100644 index 2f3a977..0000000 --- a/modules/auto_white_balance.py +++ /dev/null @@ -1,123 +0,0 @@ -# File: auto_white_balance.py -# Description: 3A - AWB Runs the AWB algorithm based on selection from config file -# Code / Paper Reference: https://www.sciencedirect.com/science/article/abs/pii/0016003280900587 -# https://library.imaging.org/admin/apis/public/api/ist/website/downloadArticle/cic/12/1/art00008 -# https://opg.optica.org/josaa/viewmedia.cfm?uri=josaa-31-5-1049&seq=0 -# Author: xx-isp (ispinfinite@gmail.com) -#------------------------------------------------------------ - -import numpy as np - -class AutoWhiteBalance: - - def __init__(self, img, sensor_info, parm_wbc, parm_awb): - - self.img = img - self.enable = parm_wbc['isEnable'] - self.auto = parm_wbc['isAuto'] - self.sensor_info = sensor_info - self.parm_awb = parm_awb - self.algorithm = parm_awb['algorithm'] - self.is_debug = parm_awb['isDebug'] - - - def apply_gray_world(self): - 'Gray World White Balance' - # Gray world algorithm calculates white balance (G/R and G/B) - # by average values of RGB channels - - return np.mean(self.flatten_img, axis=0) - - def apply_norm_2_gray_world(self): - 'Norm 2 Gray World White Balance' - #Gray world algorithm calculates white balance (G/R and G/B) - # by average values of RGB channels. Average values for each channel - # are calculated by norm-2 - - return np.linalg.norm(self.flatten_img, axis=0) - - def apply_pca_illuminant_estimation(self, pixel_percentage): - 'PCA Illuminant Estimation' - - # This algorithm gets illuminant estimation directly from the color distribution - # The method that chooses bright and dark pixels using a projection distance in the color - # distribution and then applies principal component analysis to estimate the illumination direction - - - # Img flattened to Nx3 numpy array where N = heightxwidth to get only the color dist - flat_img = self.flatten_img #.flatten().reshape(-1,3) - size = len(flat_img) - - # mean_vector is the direction vector for mean RGB obtained by dividing mean RBG vector by its magnitude. - mean_rgb = np.mean(flat_img, axis=0) - mean_vector = mean_rgb / np.linalg.norm(mean_rgb) - - # To obtain dark and light pixels first distance projected of data on mean direction vector is calculated - data_p = np.sum(flat_img*mean_vector, axis=1) - - # Projected distance array is sorted in the ascending order to obtain light and dark pixels - sorted_data = np.argsort(data_p) - - # Number of dark and light pixels are calculated from pixel_percentage parameter - index = int(np.ceil(size*(pixel_percentage/100))) - - # Index of selective pixels (dark and light) is obtained - filtered_index = np.concatenate((sorted_data[0:index], sorted_data[-index: None])) - - # Selective pixels are retreived on the basis of index from 'data' array - filtered_data = flat_img[filtered_index,:].astype(np.float32) - - # For first PCA a dot product of selected pixels data matrix with itself is calculated and 3x3 matrix is obtained - sigma = np.dot(filtered_data.transpose(), filtered_data) - - # Eigenvalues and vectors of the 3x3 matrix (sigma) are calculated - eig_value, eig_vector = np.linalg.eig(sigma) - - # Eigenvector with maximum eigen value is the direction of iluminated estimation - eig_vector = eig_vector[:, np.argsort(eig_value)] - return np.abs(eig_vector[:,2]) - - - def apply_white_balance_gain(self): - - # Removed overexposed and underexposed pixels for wb gain calculation - x = np.sum(np.where((self.img<15)|(self.img>240), 1, 0), axis=2) - self.flatten_img = self.img[x==0] - - # estimated illuminant RBG is obtained from selected algorithm - if self.algorithm == 'norm_2': - rgb = self.apply_norm_2_gray_world() - elif self.algorithm == 'pca': - pixel_percentage = self.parm_awb['percentage'] - rgb = self.apply_pca_illuminant_estimation(pixel_percentage) - else: - rgb = self.apply_gray_world() - - self.img = np.float32(self.img) - # white balance gains G/R and G/B are calculated from RGB returned from AWB Algorithm - # 0 if nan is encountered - rgain = np.nan_to_num(rgb[1]/rgb[0]) - bgain = np.nan_to_num(rgb[1]/rgb[2]) - - #Check if r_gain and b_gain go out of bound - rgain = 1 if rgain <= 0 else rgain - bgain = 1 if bgain <= 0 else bgain - - self.img[:, :, 0] *= rgain - self.img[:, :, 2] *= bgain - - if self.is_debug: - print(' - AWB - RGain = ', rgain) - print(' - AWB - Bgain = ', bgain) - - return np.uint8(np.clip(self.img, 0, 255)) - - - def execute(self): - print('Auto White balancing = ' + str(self.enable)) - - # This module is enabled only when white balance 'enable' and 'auto' parameter both are true. - if self.enable and self.auto: - return self.apply_white_balance_gain() - - return self.img diff --git a/modules/auto_white_balance/auto_white_balance.py b/modules/auto_white_balance/auto_white_balance.py new file mode 100644 index 0000000..8fb8da3 --- /dev/null +++ b/modules/auto_white_balance/auto_white_balance.py @@ -0,0 +1,163 @@ +""" +File: auto_white_balance.py +Description: 3A - AWB Runs the AWB algorithm based on selection from config file +Code / Paper Reference: https://www.sciencedirect.com/science/article/abs/pii/0016003280900587 + https://library.imaging.org/admin/apis/public/api/ist/website/downloadArticle/cic/12/1/art00008 + https://opg.optica.org/josaa/viewmedia.cfm?uri=josaa-31-5-1049&seq=0 +Author: 10xEngineers Pvt Ltd +------------------------------------------------------------ +""" +import time +import numpy as np +from modules.auto_white_balance.gray_world import GrayWorld as GW +from modules.auto_white_balance.norm_gray_world import NormGrayWorld as NGW +from modules.auto_white_balance.pca import PCAIlluminEstimation as PCA + + +class AutoWhiteBalance: + """ + Auto White Balance Module + """ + + def __init__(self, raw, sensor_info, parm_awb): + + self.raw = raw + + self.sensor_info = sensor_info + self.parm_awb = parm_awb + self.enable = parm_awb["is_enable"] + self.bit_depth = sensor_info["bit_depth"] + self.is_debug = parm_awb["is_debug"] + self.underexposed_percentage = parm_awb["underexposed_percentage"] + self.overexposed_percentage = parm_awb["overexposed_percentage"] + self.flatten_img = None + self.bayer = self.sensor_info["bayer_pattern"] + # self.img = img + self.algorithm = parm_awb["algorithm"] + + def determine_white_balance_gain(self): + """ + Determine white balance gains calculated using AWB Algorithms to Raw Image + """ + + max_pixel_value = 2**self.bit_depth + approx_percentage = max_pixel_value / 100 + # Removed overexposed and underexposed pixels for wb gain calculation + overexposed_limit = ( + max_pixel_value - (self.overexposed_percentage) * approx_percentage + ) + underexposed_limit = (self.underexposed_percentage) * approx_percentage + + if self.is_debug: + print(" - AWB - Underexposed Pixel Limit = ", underexposed_limit) + print(" - AWB - Overexposed Pixel Limit = ", overexposed_limit) + + if self.bayer == "rggb": + + r_channel = self.raw[0::2, 0::2] + gr_channel = self.raw[0::2, 1::2] + gb_channel = self.raw[1::2, 0::2] + b_channel = self.raw[1::2, 1::2] + + elif self.bayer == "bggr": + b_channel = self.raw[0::2, 0::2] + gb_channel = self.raw[0::2, 1::2] + gr_channel = self.raw[1::2, 0::2] + r_channel = self.raw[1::2, 1::2] + + elif self.bayer == "grbg": + gr_channel = self.raw[0::2, 0::2] + r_channel = self.raw[0::2, 1::2] + b_channel = self.raw[1::2, 0::2] + gb_channel = self.raw[1::2, 1::2] + + elif self.bayer == "gbrg": + gb_channel = self.raw[0::2, 0::2] + b_channel = self.raw[0::2, 1::2] + r_channel = self.raw[1::2, 0::2] + gr_channel = self.raw[1::2, 1::2] + + g_channel = (gr_channel + gb_channel) / 2 + bayer_channels = np.dstack((r_channel, g_channel, b_channel)) + # print(bayer_channels.shape) + + bad_pixels = np.sum( + np.where( + (bayer_channels < underexposed_limit) + | (bayer_channels > overexposed_limit), + 1, + 0, + ), + axis=2, + ) + self.flatten_img = bayer_channels[bad_pixels == 0] + # print(self.flatten_raw.shape) + + if self.algorithm == "norm_2": + rgain, bgain = self.apply_norm_gray_world() + elif self.algorithm == "pca": + rgain, bgain = self.apply_pca_illuminant_estimation() + else: + rgain, bgain = self.apply_gray_world() + + # Check if r_gain and b_gain go out of bound + rgain = 1 if rgain <= 1 else rgain + bgain = 1 if bgain <= 1 else bgain + + if self.is_debug: + print(" - AWB Actual Gains: ") + print(" - AWB - RGain = ", rgain) + print(" - AWB - Bgain = ", bgain) + + return rgain, bgain + + def apply_gray_world(self): + """ + + Gray World White Balance: + Gray world algorithm calculates white balance (G/R and G/B) + by average values of RGB channels + """ + + gwa = GW(self.flatten_img) + return gwa.calculate_gains() + + def apply_norm_gray_world(self): + """ + Norm 2 Gray World White Balance: + + Gray world algorithm calculates white balance (G/R and G/B) + by average values of RGB channels. Average values for each channel + are calculated by norm-2 + """ + + ngw = NGW(self.flatten_img) + return ngw.calculate_gains() + + def apply_pca_illuminant_estimation(self): + """ + PCA Illuminant Estimation: + + This algorithm gets illuminant estimation directly from the color distribution + The method that chooses bright and dark pixels using a projection distance in + the color distribution and then applies principal component analysis to estimate + the illumination direction + """ + pixel_percentage = self.parm_awb["percentage"] + pca = PCA(self.flatten_img, pixel_percentage) + return pca.calculate_gains() + + def execute(self): + """ + Execute Auto White Balance Module + """ + print("Auto White balancing = " + str(self.enable)) + + # This module is enabled only when white balance 'enable' and 'auto' parameter both + # are true. + if self.enable is True: + start = time.time() + rgain, bgain = self.determine_white_balance_gain() + print(f" Execution time: {time.time() - start:.3f}s") + return np.array([rgain, bgain]) + return None diff --git a/modules/auto_white_balance/gray_world.py b/modules/auto_white_balance/gray_world.py new file mode 100644 index 0000000..14bca99 --- /dev/null +++ b/modules/auto_white_balance/gray_world.py @@ -0,0 +1,32 @@ +""" +File: gray_world.py +Description: Implementation of Gray_World - an AWB Algorithm +Code / Paper Reference: https://www.sciencedirect.com/science/article/abs/pii/0016003280900587 +Author: 10xEngineers + +""" +import numpy as np + + +class GrayWorld: + """ + Gray World White Balance: + Gray world algorithm calculates white balance (G/R and G/B) + by average values of RGB channels + """ + + def __init__(self, flatten_img): + self.flatten_img = flatten_img + + def calculate_gains(self): + """ + Calulate WB gains using average values of R, G and B channels + """ + avg_rgb = np.mean(self.flatten_img, axis=0) + + # white balance gains G/R and G/B are calculated from RGB returned from AWB Algorithm + # 0 if nan is encountered + rgain = np.nan_to_num(avg_rgb[1] / avg_rgb[0]) + bgain = np.nan_to_num(avg_rgb[1] / avg_rgb[2]) + + return rgain, bgain diff --git a/modules/auto_white_balance/norm_gray_world.py b/modules/auto_white_balance/norm_gray_world.py new file mode 100644 index 0000000..132a718 --- /dev/null +++ b/modules/auto_white_balance/norm_gray_world.py @@ -0,0 +1,34 @@ +""" +File: norm_2.py +Description: Implementation of Norm GrayWorld - an AWB Algorithm +Code / Paper Reference: https://www.sciencedirect.com/science/article/abs/pii/0016003280900587 +Author: 10xEngineers + +""" +import numpy as np + + +class NormGrayWorld: + """ + Norm 2 Gray World White Balance: + + Gray world algorithm calculates white balance (G/R and G/B) + by average values of RGB channels. Average values for each channel + are calculated by norm-2 + """ + + def __init__(self, flatten_img): + self.flatten_img = flatten_img + + def calculate_gains(self): + """ + Calulate WB gains using normed average values of R, G and B channels + """ + avg_rgb = np.linalg.norm(self.flatten_img, axis=0) + + # white balance gains G/R and G/B are calculated from RGB returned from AWB Algorithm + # 0 if nan is encountered + rgain = np.nan_to_num(avg_rgb[1] / avg_rgb[0]) + bgain = np.nan_to_num(avg_rgb[1] / avg_rgb[2]) + + return rgain, bgain diff --git a/modules/auto_white_balance/pca.py b/modules/auto_white_balance/pca.py new file mode 100644 index 0000000..286a9b6 --- /dev/null +++ b/modules/auto_white_balance/pca.py @@ -0,0 +1,71 @@ +""" +File: norm_2.py +Description: Implementation of Norm 2 GrayWorld - an AWB Algorithm +Code / Paper Reference: https://www.sciencedirect.com/science/article/abs/pii/0016003280900587 +Author: 10xEngineers + +""" +import numpy as np + + +class PCAIlluminEstimation: + """ + PCA Illuminant Estimation: + + This algorithm gets illuminant estimation directly from the color distribution + The method that chooses bright and dark pixels using a projection distance in + the color distribution and then applies principal component analysis to estimate + the illumination direction + """ + + def __init__(self, flatten_img, pixel_percentage): + self.flatten_img = flatten_img + self.pixel_percentage = pixel_percentage + + def calculate_gains(self): + """ + Calulate WB gains using normed average values of R, G and B channels + """ + + # Img flattened to Nx3 numpy array where N = heightxwidth to get only the color dist + flat_img = self.flatten_img # .flatten().reshape(-1,3) + size = len(flat_img) + + # mean_vector is the direction vector for mean RGB obtained by dividing mean RBG vector + # by its magnitude. + mean_rgb = np.mean(flat_img, axis=0) + mean_vector = mean_rgb / np.linalg.norm(mean_rgb) + + # To obtain dark and light pixels first distance projected of data on mean direction vector + # is calculated + data_p = np.sum(flat_img * mean_vector, axis=1) + + # Projected distance array is sorted in the ascending order to obtain light and dark pixels + sorted_data = np.argsort(data_p) + + # Number of dark and light pixels are calculated from pixel_percentage parameter + index = int(np.ceil(size * (self.pixel_percentage / 100))) + + # Index of selective pixels (dark and light) is obtained + filtered_index = np.concatenate( + (sorted_data[0:index], sorted_data[-index:None]) + ) + # Selective pixels are retreived on the basis of index from 'data' array + filtered_data = flat_img[filtered_index, :].astype(np.float32) + + # For first PCA a dot product of selected pixels data matrix with itself is calculated + # and 3x3 matrix is obtained + sigma = np.dot(filtered_data.transpose(), filtered_data) + + # Eigenvalues and vectors of the 3x3 matrix (sigma) are calculated + eig_value, eig_vector = np.linalg.eig(sigma) + + # Eigenvector with maximum eigen value is the direction of iluminated estimation + eig_vector = eig_vector[:, np.argsort(eig_value)] + avg_rgb = np.abs(eig_vector[:, 2]) + + # white balance gains G/R and G/B are calculated from RGB returned from AWB Algorithm + # # 0 if nan is encountered + rgain = np.nan_to_num(avg_rgb[1] / avg_rgb[0]) + bgain = np.nan_to_num(avg_rgb[1] / avg_rgb[2]) + return rgain, bgain diff --git a/modules/bayer_noise_reduction.py b/modules/bayer_noise_reduction.py deleted file mode 100644 index 0d0835f..0000000 --- a/modules/bayer_noise_reduction.py +++ /dev/null @@ -1,231 +0,0 @@ -# File: bayer_noise_reduction.py -# Description: Noise reduction in bayer domain -# Code / Paper Reference: https://www.researchgate.net/publication/261753644_Green_Channel_Guiding_Denoising_on_Bayer_Image -# Author: xx-isp (ispinfinite@gmail.com) -#------------------------------------------------------------ - -import numpy as np -from scipy import ndimage -import warnings -from tqdm import tqdm -class BayerNoiseReduction: - 'Noise Reduction in Bayer domain' - def __init__(self, img, sensor_info, parm_bnr, platform): - self.img = img - self.enable = parm_bnr['isEnable'] - self.sensor_info = sensor_info - self.parm_bnr = parm_bnr - self.is_progress = platform['disable_progress_bar'] - self.is_leave = platform['leave_pbar_string'] - - def gauss_kern_raw(self, N, stdDev, stride): - if N%2 == 0: - warnings.warn('kernel size (N) cannot be even, setting it as odd value') - N = N + 1 - - if N <= 0: - warnings.warn('kernel size (N) cannot be <= zero, setting it as 3') - N = 3 - - out_kern = np.zeros((N,N), dtype=np.float32) - - for i in range(0,N): - for j in range (0,N): - #stride is used to adjust the gaussian weights for neighbourhood pixel that are 'stride' spaces apart in a bayer image - out_kern[i,j] = np.exp(-1 * ((stride*(i - ((N-1)/2)))**2 + (stride*(j - ((N-1)/2)))**2) / (2 * (stdDev**2))) - - sum_kern = np.sum(out_kern) - out_kern[0:N:1, 0:N:1] = out_kern[0:N:1, 0:N:1] / sum_kern - - return out_kern - - def joint_bilateral_filter(self, in_img, guide_img, Ns, stddev_s, Nr, stddev_r, stride): - #check if filter window sizes Ns and Nr greater than zero and are odd - if Ns <= 0: - Ns = 3 - warnings.warn('spatial kernel size (Ns) cannot be <= zero, setting it as 3') - elif Ns%2 == 0: - warnings.warn('range kernel size (Ns) cannot be even, assigning it an odd value') - Ns = Ns+1 - - if Nr <= 0: - Nr = 3 - warnings.warn('range kernel size (Nr) cannot be <= zero, setting it as 3') - elif Nr%2 == 0: - warnings.warn('range kernel size (Nr) cannot be even, assigning it an odd value') - Nr = Nr+1 - - #check if Nr > Ns - if Nr > Ns: - warnings.warn('range kernel size (Nr) cannot be more than spatial kernel size (Ns)') - Nr = Ns - - #spawn a NxN gaussian kernel - s_kern = self.gauss_kern_raw(Ns, stddev_s, stride) - - #pad the image with half arm length of the kernel; - #padType='constant' => pad value = 0; 'reflect' is more suitable - pad_len = int((Ns-1)/2) - kern_arm = pad_len - in_img_ext = np.pad(in_img, ((pad_len, pad_len), (pad_len, pad_len)), 'reflect') - guide_img_ext = np.pad(guide_img, ((pad_len, pad_len), (pad_len, pad_len)), 'reflect') - - filt_out = np.zeros(in_img.shape, dtype=np.float32) - - for i in tqdm(range(kern_arm, np.size(in_img, 0) + kern_arm), disable=self.is_progress, leave=self.is_leave): - for j in range(kern_arm, np.size(in_img, 1) + kern_arm): - guide_img_ext_center_pix = guide_img_ext[i, j] - guide_img_ext_filt_window = guide_img_ext[i-kern_arm:i+kern_arm +1, j-kern_arm:j+kern_arm +1] - in_img_ext_filt_window = in_img_ext[i-kern_arm:i+kern_arm +1, j-kern_arm:j+kern_arm +1] - - #normalization fact of a filter window = sum(matrix multiplication of spatial kernel and range kernel weights) = sum of filter weights - norm_fact = np.sum(s_kern[0:Ns, 0:Ns] * np.exp(-1 * (guide_img_ext_center_pix - guide_img_ext_filt_window)**2 / (2*stddev_r**2))) - - #filter output for a window = sum(spatial kernel weights x range kernel weights x windowed input image) / normalization factor - filt_out[i - kern_arm, j-kern_arm] = np.sum(s_kern[0:Ns, 0:Ns] * np.exp(-1 * (guide_img_ext_center_pix - guide_img_ext_filt_window)**2 / (2*stddev_r**2)) * in_img_ext_filt_window ) - filt_out[i - kern_arm, j-kern_arm] = (filt_out[i - kern_arm, j-kern_arm] / norm_fact) - - return filt_out - - def execute(self): - print('Bayer Noise Reduction = ' + str(self.enable)) - """Applies BNR to input RAW image and returns the output image""" - - if self.enable == False: - #return the same image as input image - return self.img - else: - #apply bnr to the input image and return the output image - in_img = self.img - bayer_pattern = self.sensor_info["bayer_pattern"] - width, height = self.sensor_info["width"], self.sensor_info["height"] - bit_depth = self.sensor_info["bitdep"] - - #extract BNR parameters - filt_size = self.parm_bnr["filt_window"] - #s stands for spatial kernel parameters, r stands for range kernel parameters - stddev_s_red, stddev_r_red = self.parm_bnr["r_stdDevS"], self.parm_bnr["r_stdDevR"] - stddev_s_green, stddev_r_green = self.parm_bnr["g_stdDevS"], self.parm_bnr["g_stdDevR"] - stddev_s_blue, stddev_r_blue = self.parm_bnr["b_stdDevS"], self.parm_bnr["b_stdDevR"] - - #assuming image is in 12-bit range, converting to [0 1] range - in_img = np.float32(in_img) / (2**bit_depth - 1) - - interp_g = np.zeros((height, width), dtype=np.float32) - in_img_r = np.zeros((np.uint32(height/2), np.uint32(width/2)), dtype=np.float32) - in_img_b = np.zeros((np.uint32(height/2), np.uint32(width/2)), dtype=np.float32) - - #convert bayer image into sub-images for filtering each colour ch - in_img_raw = in_img.copy() - if bayer_pattern=="rggb": - in_img_r = in_img_raw[0:height:2, 0:width:2] - in_img_b = in_img_raw[1:height:2, 1:width:2] - elif bayer_pattern=="bggr": - in_img_r = in_img_raw[1:height:2, 1:width:2] - in_img_b = in_img_raw[0:height:2, 0:width:2] - elif bayer_pattern=="grbg": - in_img_r = in_img_raw[0:height:2, 1:width:2] - in_img_b = in_img_raw[1:height:2, 0:width:2] - elif bayer_pattern=="gbrg": - in_img_r = in_img_raw[1:height:2, 0:width:2] - in_img_b = in_img_raw[0:height:2, 1:width:2] - - #define the G interpolation kernel - interp_kern_g_at_r = np.array([ [0, 0, -1, 0, 0], \ - [0, 0, 2, 0, 0], \ - [-1, 2, 4, 2, -1], \ - [0, 0, 2, 0, 0], \ - [0, 0, -1, 0, 0]], dtype=np.float32) - - interp_kern_g_at_r = interp_kern_g_at_r / np.sum(interp_kern_g_at_r) - - interp_kern_g_at_b = np.array([ [0, 0, -1, 0, 0], \ - [0, 0, 2, 0, 0], \ - [-1, 2, 4, 2, -1], \ - [0, 0, 2, 0, 0], \ - [0, 0, -1, 0, 0]], dtype=np.float32) - - interp_kern_g_at_b = interp_kern_g_at_b / np.sum(interp_kern_g_at_b) - - #convolve the kernel with image and mask the result based on given bayer pattern - kern_filt_g_at_r = ndimage.convolve(in_img, interp_kern_g_at_r, mode='reflect') - kern_filt_g_at_b = ndimage.convolve(in_img, interp_kern_g_at_b, mode='reflect') - - #clip any interpolation overshoots to [0 1] range - kern_filt_g_at_r = np.clip(kern_filt_g_at_r, 0, 1) - kern_filt_g_at_b = np.clip(kern_filt_g_at_b, 0, 1) - - interp_g = in_img.copy() - interp_g_at_r = np.zeros((np.uint32(height/2), np.uint32(width/2)), dtype=np.float32) - interp_g_at_b = np.zeros((np.uint32(height/2), np.uint32(width/2)), dtype=np.float32) - - if bayer_pattern=="rggb": - #extract R and B location Green pixels to form interpG image - interp_g[0:height:2, 0:width:2] = kern_filt_g_at_r[0:height:2, 0:width:2] - interp_g[1:height:2, 1:width:2] = kern_filt_g_at_b[1:height:2, 1:width:2] - - #extract interpG ch sub-images for R sub-image and B sub-image guidance signals - interp_g_at_r = kern_filt_g_at_r[0:height:2, 0:width:2] - interp_g_at_b = kern_filt_g_at_b[1:height:2, 1:width:2] - - elif bayer_pattern=="bggr": - #extract R and B location Green pixels to form interpG image - interp_g[1:height:2, 1:width:2] = kern_filt_g_at_r[1:height:2, 1:width:2] - interp_g[0:height:2, 0:width:2] = kern_filt_g_at_b[0:height:2, 0:width:2] - - #extract interpG ch sub-images for R sub-image and B sub-image guidance signals - interp_g_at_r = kern_filt_g_at_r[1:height:2, 1:width:2] - interp_g_at_b = kern_filt_g_at_b[0:height:2, 0:width:2] - - elif bayer_pattern=="grbg": - #extract R and B location Green pixels to form interpG image - interp_g[0:height:2, 1:width:2] = kern_filt_g_at_r[0:height:2, 1:width:2] - interp_g[1:height:2, 0:width:2] = kern_filt_g_at_b[1:height:2, 0:width:2] - - #extract interpG ch sub-images for R sub-image and B sub-image guidance signals - interp_g_at_r = kern_filt_g_at_r[0:height:2, 1:width:2] - interp_g_at_b = kern_filt_g_at_b[1:height:2, 0:width:2] - - elif bayer_pattern=="gbrg": - #extract R and B location Green pixels to form interpG image - interp_g[1:height:2, 0:width:2] = kern_filt_g_at_r[1:height:2, 0:width:2] - interp_g[0:height:2, 1:width:2] = kern_filt_g_at_b[0:height:2, 1:width:2] - - #extract interpG ch sub-images for R sub-image and B sub-image guidance signals - interp_g_at_r = kern_filt_g_at_r[1:height:2, 0:width:2] - interp_g_at_b = kern_filt_g_at_b[0:height:2, 1:width:2] - - #BNR window / filter size will be the same for full image and smaller for sub-image - filt_size_g = filt_size - filt_size_r = int((filt_size + 1) /2) - filt_size_b = int((filt_size + 1) /2) - - #apply joint bilateral filter to the image with G channel as guidance signal - out_img_r = self.joint_bilateral_filter(in_img_r, interp_g_at_r, filt_size_r, stddev_s_red, filt_size_r, stddev_r_red, 2) - out_img_g = self.joint_bilateral_filter(interp_g, interp_g, filt_size_g, stddev_s_green, filt_size_g, stddev_r_green, 1) - out_img_b = self.joint_bilateral_filter(in_img_b, interp_g_at_b, filt_size_b, stddev_s_blue, filt_size_b, stddev_r_blue, 2) - - #join the colour pixel images back into the bayer image - bnr_out_img = np.zeros(in_img.shape) - bnr_out_img = out_img_g.copy() - - if bayer_pattern=="rggb": - bnr_out_img[0:height:2, 0:width:2] = out_img_r[0:np.size(out_img_r,0):1, 0:np.size(out_img_r,1):1] - bnr_out_img[1:height:2, 1:width:2] = out_img_b[0:np.size(out_img_b,0):1, 0:np.size(out_img_b,1):1] - - elif bayer_pattern=="bggr": - bnr_out_img[1:height:2, 1:width:2] = out_img_r[0:np.size(out_img_r,0):1, 0:np.size(out_img_r,1):1] - bnr_out_img[0:height:2, 0:width:2] = out_img_b[0:np.size(out_img_b,0):1, 0:np.size(out_img_b,1):1] - - elif bayer_pattern=="grbg": - bnr_out_img[0:height:2, 1:width:2] = out_img_r[0:np.size(out_img_r,0):1, 0:np.size(out_img_r,1):1] - bnr_out_img[1:height:2, 0:width:2] = out_img_b[0:np.size(out_img_b,0):1, 0:np.size(out_img_b,1):1] - - elif bayer_pattern=="gbrg": - bnr_out_img[1:height:2, 0:width:2] = out_img_r[0:np.size(out_img_r,0):1, 0:np.size(out_img_r,1):1] - bnr_out_img[0:height:2, 1:width:2] = out_img_b[0:np.size(out_img_b,0):1, 0:np.size(out_img_b,1):1] - - #convert normalized image to 12-bit range - bnr_out_img = np.uint16(np.clip(bnr_out_img, 0, 1)*((2**bit_depth) -1)) - - return bnr_out_img diff --git a/modules/bayer_noise_reduction/bayer_noise_reduction.py b/modules/bayer_noise_reduction/bayer_noise_reduction.py new file mode 100644 index 0000000..b777fae --- /dev/null +++ b/modules/bayer_noise_reduction/bayer_noise_reduction.py @@ -0,0 +1,64 @@ +""" +File: bayer_noise_reduction.py +Description: Noise reduction in bayer domain +Author: 10xEngineers +------------------------------------------------------------ +""" + + +import time +from modules.bayer_noise_reduction.joint_bf import JointBF as JBF +from util.utils import save_output_array + + +class BayerNoiseReduction: + """ + Noise Reduction in Bayer domain + """ + + def __init__(self, img, sensor_info, parm_bnr, platform): + self.img = img + self.enable = parm_bnr["is_enable"] + self.sensor_info = sensor_info + self.parm_bnr = parm_bnr + self.is_progress = platform["disable_progress_bar"] + self.is_leave = platform["leave_pbar_string"] + self.is_save = parm_bnr["is_save"] + self.platform = platform + + def apply_bnr(self): + """ + Apply bnr to the input image and return the output image + """ + jbf = JBF(self.img, self.sensor_info, self.parm_bnr, self.platform) + bnr_out_img = jbf.apply_jbf() + return bnr_out_img + + def save(self): + """ + Function to save module output + """ + if self.is_save: + save_output_array( + self.platform["in_file"], + self.img, + "Out_bayer_noise_reduction_", + self.platform, + self.sensor_info["bit_depth"], + self.sensor_info["bayer_pattern"], + ) + + def execute(self): + """ + Appling BNR to input RAW image and returns the output image + """ + print("Bayer Noise Reduction = " + str(self.enable)) + + if self.enable is True: + start = time.time() + bnr_out = self.apply_bnr() + print(f" Execution time: {time.time() - start:.3f}s") + self.img = bnr_out + + self.save() + return self.img diff --git a/modules/bayer_noise_reduction/joint_bf.py b/modules/bayer_noise_reduction/joint_bf.py new file mode 100644 index 0000000..34f72e1 --- /dev/null +++ b/modules/bayer_noise_reduction/joint_bf.py @@ -0,0 +1,434 @@ +""" +File: joint_bf.py +Description: Noise reduction in bayer domain uding joint bilateral filter +Code / Paper Reference: +https://www.researchgate.net/publication/261753644_Green_Channel_Guiding_Denoising_on_Bayer_Image +Author: 10xEngineers +------------------------------------------------------------ +""" + +import warnings +import numpy as np +from scipy import ndimage +from tqdm import tqdm + + +class JointBF: + """ + Bayer noise reduction using joint bilateral filer technique + """ + + def __init__(self, img, sensor_info, parm_bnr, platform): + self.img = img + self.enable = parm_bnr["is_enable"] + self.sensor_info = sensor_info + self.parm_bnr = parm_bnr + self.is_progress = platform["disable_progress_bar"] + self.is_leave = platform["leave_pbar_string"] + self.is_save = parm_bnr["is_save"] + self.platform = platform + + def apply_jbf(self): + """ + Apply bnr to the input image and return the output image + """ + in_img = self.img + bayer_pattern = self.sensor_info["bayer_pattern"] + width, height = self.sensor_info["width"], self.sensor_info["height"] + bit_depth = self.sensor_info["bit_depth"] + + # extract BNR parameters + filt_size = self.parm_bnr["filter_window"] + # s stands for spatial kernel parameters, r stands for range kernel parameters + stddev_s_red, stddev_r_red = ( + self.parm_bnr["r_std_dev_s"], + self.parm_bnr["r_std_dev_r"], + ) + stddev_s_green, stddev_r_green = ( + self.parm_bnr["g_std_dev_s"], + self.parm_bnr["g_std_dev_r"], + ) + stddev_s_blue, stddev_r_blue = ( + self.parm_bnr["b_std_dev_s"], + self.parm_bnr["b_std_dev_r"], + ) + + # assuming image is in 12-bit range, converting to [0 1] range + in_img = np.float32(in_img) / (2**bit_depth - 1) + + interp_g = np.zeros((height, width), dtype=np.float32) + in_img_r = np.zeros( + (np.uint32(height / 2), np.uint32(width / 2)), dtype=np.float32 + ) + in_img_b = np.zeros( + (np.uint32(height / 2), np.uint32(width / 2)), dtype=np.float32 + ) + + # convert bayer image into sub-images for filtering each colour ch + in_img_raw = in_img.copy() + if bayer_pattern == "rggb": + in_img_r = in_img_raw[0:height:2, 0:width:2] + in_img_b = in_img_raw[1:height:2, 1:width:2] + elif bayer_pattern == "bggr": + in_img_r = in_img_raw[1:height:2, 1:width:2] + in_img_b = in_img_raw[0:height:2, 0:width:2] + elif bayer_pattern == "grbg": + in_img_r = in_img_raw[0:height:2, 1:width:2] + in_img_b = in_img_raw[1:height:2, 0:width:2] + elif bayer_pattern == "gbrg": + in_img_r = in_img_raw[1:height:2, 0:width:2] + in_img_b = in_img_raw[0:height:2, 1:width:2] + + # define the G interpolation kernel + interp_kern_g_at_r = np.array( + [ + [0, 0, -1, 0, 0], + [0, 0, 2, 0, 0], + [-1, 2, 4, 2, -1], + [0, 0, 2, 0, 0], + [0, 0, -1, 0, 0], + ], + dtype=np.float32, + ) + + interp_kern_g_at_r = interp_kern_g_at_r / np.sum(interp_kern_g_at_r) + + interp_kern_g_at_b = np.array( + [ + [0, 0, -1, 0, 0], + [0, 0, 2, 0, 0], + [-1, 2, 4, 2, -1], + [0, 0, 2, 0, 0], + [0, 0, -1, 0, 0], + ], + dtype=np.float32, + ) + + interp_kern_g_at_b = interp_kern_g_at_b / np.sum(interp_kern_g_at_b) + + # convolve the kernel with image and mask the result based on given bayer pattern + kern_filt_g_at_r = ndimage.convolve(in_img, interp_kern_g_at_r, mode="reflect") + kern_filt_g_at_b = ndimage.convolve(in_img, interp_kern_g_at_b, mode="reflect") + + # clip any interpolation overshoots to [0 1] range + kern_filt_g_at_r = np.clip(kern_filt_g_at_r, 0, 1) + kern_filt_g_at_b = np.clip(kern_filt_g_at_b, 0, 1) + + interp_g = in_img.copy() + interp_g_at_r = np.zeros( + (np.uint32(height / 2), np.uint32(width / 2)), dtype=np.float32 + ) + interp_g_at_b = np.zeros( + (np.uint32(height / 2), np.uint32(width / 2)), dtype=np.float32 + ) + + if bayer_pattern == "rggb": + # extract R and B location Green pixels to form interpG image + interp_g[0:height:2, 0:width:2] = kern_filt_g_at_r[0:height:2, 0:width:2] + interp_g[1:height:2, 1:width:2] = kern_filt_g_at_b[1:height:2, 1:width:2] + + # extract interpG ch sub-images for R sub-image and B sub-image guidance signals + interp_g_at_r = kern_filt_g_at_r[0:height:2, 0:width:2] + interp_g_at_b = kern_filt_g_at_b[1:height:2, 1:width:2] + + elif bayer_pattern == "bggr": + # extract R and B location Green pixels to form interpG image + interp_g[1:height:2, 1:width:2] = kern_filt_g_at_r[1:height:2, 1:width:2] + interp_g[0:height:2, 0:width:2] = kern_filt_g_at_b[0:height:2, 0:width:2] + + # extract interpG ch sub-images for R sub-image and B sub-image guidance signals + interp_g_at_r = kern_filt_g_at_r[1:height:2, 1:width:2] + interp_g_at_b = kern_filt_g_at_b[0:height:2, 0:width:2] + + elif bayer_pattern == "grbg": + # extract R and B location Green pixels to form interpG image + interp_g[0:height:2, 1:width:2] = kern_filt_g_at_r[0:height:2, 1:width:2] + interp_g[1:height:2, 0:width:2] = kern_filt_g_at_b[1:height:2, 0:width:2] + + # extract interpG ch sub-images for R sub-image and B sub-image guidance signals + interp_g_at_r = kern_filt_g_at_r[0:height:2, 1:width:2] + interp_g_at_b = kern_filt_g_at_b[1:height:2, 0:width:2] + + elif bayer_pattern == "gbrg": + # extract R and B location Green pixels to form interpG image + interp_g[1:height:2, 0:width:2] = kern_filt_g_at_r[1:height:2, 0:width:2] + interp_g[0:height:2, 1:width:2] = kern_filt_g_at_b[0:height:2, 1:width:2] + + # extract interpG ch sub-images for R sub-image and B sub-image guidance signals + interp_g_at_r = kern_filt_g_at_r[1:height:2, 0:width:2] + interp_g_at_b = kern_filt_g_at_b[0:height:2, 1:width:2] + + # BNR window / filter size will be the same for full image and smaller for sub-image + filt_size_g = filt_size + filt_size_r = int((filt_size + 1) / 2) + filt_size_b = int((filt_size + 1) / 2) + + # apply joint bilateral filter to the image with G channel as guidance signal + out_img_r = self.fast_joint_bilateral_filter( + in_img_r, + interp_g_at_r, + filt_size_r, + stddev_s_red, + filt_size_r, + stddev_r_red, + 2, + ) + out_img_g = self.fast_joint_bilateral_filter( + interp_g, + interp_g, + filt_size_g, + stddev_s_green, + filt_size_g, + stddev_r_green, + 1, + ) + out_img_b = self.fast_joint_bilateral_filter( + in_img_b, + interp_g_at_b, + filt_size_b, + stddev_s_blue, + filt_size_b, + stddev_r_blue, + 2, + ) + + # join the colour pixel images back into the bayer image + bnr_out_img = np.zeros(in_img.shape) + bnr_out_img = out_img_g.copy() + + if bayer_pattern == "rggb": + bnr_out_img[0:height:2, 0:width:2] = out_img_r[ + 0 : np.size(out_img_r, 0) : 1, 0 : np.size(out_img_r, 1) : 1 + ] + bnr_out_img[1:height:2, 1:width:2] = out_img_b[ + 0 : np.size(out_img_b, 0) : 1, 0 : np.size(out_img_b, 1) : 1 + ] + + elif bayer_pattern == "bggr": + bnr_out_img[1:height:2, 1:width:2] = out_img_r[ + 0 : np.size(out_img_r, 0) : 1, 0 : np.size(out_img_r, 1) : 1 + ] + bnr_out_img[0:height:2, 0:width:2] = out_img_b[ + 0 : np.size(out_img_b, 0) : 1, 0 : np.size(out_img_b, 1) : 1 + ] + + elif bayer_pattern == "grbg": + bnr_out_img[0:height:2, 1:width:2] = out_img_r[ + 0 : np.size(out_img_r, 0) : 1, 0 : np.size(out_img_r, 1) : 1 + ] + bnr_out_img[1:height:2, 0:width:2] = out_img_b[ + 0 : np.size(out_img_b, 0) : 1, 0 : np.size(out_img_b, 1) : 1 + ] + + elif bayer_pattern == "gbrg": + bnr_out_img[1:height:2, 0:width:2] = out_img_r[ + 0 : np.size(out_img_r, 0) : 1, 0 : np.size(out_img_r, 1) : 1 + ] + bnr_out_img[0:height:2, 1:width:2] = out_img_b[ + 0 : np.size(out_img_b, 0) : 1, 0 : np.size(out_img_b, 1) : 1 + ] + + # convert normalized image to 12-bit range + bnr_out_img = np.uint16(np.clip(bnr_out_img, 0, 1) * ((2**bit_depth) - 1)) + return bnr_out_img + + def gauss_kern_raw(self, kern, std_dev, stride): + """ + Applying Gaussian Filter + """ + if kern % 2 == 0: + warnings.warn("kernel size (kern) cannot be even, setting it as odd value") + kern = kern + 1 + + if kern <= 0: + warnings.warn("kernel size (kern) cannot be <= zero, setting it as 3") + kern = 3 + + out_kern = np.zeros((kern, kern), dtype=np.float32) + + for i in range(0, kern): + for j in range(0, kern): + # stride is used to adjust the gaussian weights for neighbourhood + # pixel that are 'stride' spaces apart in a bayer image + out_kern[i, j] = np.exp( + -1 + * ( + (stride * (i - ((kern - 1) / 2))) ** 2 + + (stride * (j - ((kern - 1) / 2))) ** 2 + ) + / (2 * (std_dev**2)) + ) + + sum_kern = np.sum(out_kern) + out_kern[0:kern:1, 0:kern:1] = out_kern[0:kern:1, 0:kern:1] / sum_kern + + return out_kern + + def joint_bilateral_filter( + self, in_img, guide_img, spatial_kern, stddev_s, range_kern, stddev_r, stride + ): + """ + Applying Joint Bilateral Filter + """ + + # check if filter window sizes spatial_kern and range_kern greater + # than zero and are odd + if spatial_kern <= 0: + spatial_kern = 3 + warnings.warn( + "spatial kernel size (spatial_kern) cannot be <= zero, setting it as 3" + ) + elif spatial_kern % 2 == 0: + warnings.warn( + "range kernel size (spatial_kern) cannot be even, " + "assigning it an odd value" + ) + spatial_kern = spatial_kern + 1 + + # check if range_kern > spatial_kern + if range_kern > spatial_kern: + warnings.warn( + "range kernel size (range_kern) cannot be more " + "than spatial kernel size (spatial_kern)" + ) + range_kern = spatial_kern + + # spawn a NxN gaussian kernel + s_kern = self.gauss_kern_raw(spatial_kern, stddev_s, stride) + + # pad the image with half arm length of the kernel; + # padType='constant' => pad value = 0; 'reflect' is more suitable + pad_len = int((spatial_kern - 1) / 2) + kern_arm = pad_len + in_img_ext = np.pad(in_img, ((pad_len, pad_len), (pad_len, pad_len)), "reflect") + guide_img_ext = np.pad( + guide_img, ((pad_len, pad_len), (pad_len, pad_len)), "reflect" + ) + + filt_out = np.zeros(in_img.shape, dtype=np.float32) + + for i in tqdm( + range(kern_arm, np.size(in_img, 0) + kern_arm), + disable=self.is_progress, + leave=self.is_leave, + ): + for j in range(kern_arm, np.size(in_img, 1) + kern_arm): + guide_img_ext_center_pix = guide_img_ext[i, j] + guide_img_ext_filt_window = guide_img_ext[ + i - kern_arm : i + kern_arm + 1, j - kern_arm : j + kern_arm + 1 + ] + in_img_ext_filt_window = in_img_ext[ + i - kern_arm : i + kern_arm + 1, j - kern_arm : j + kern_arm + 1 + ] + + # normalization fact of a filter window = sum(matrix multiplication of + # spatial kernel and range kernel weights) = sum of filter weights + norm_fact = np.sum( + s_kern[0:spatial_kern, 0:spatial_kern] + * np.exp( + -1 + * (guide_img_ext_center_pix - guide_img_ext_filt_window) ** 2 + / (2 * stddev_r**2) + ) + ) + + # filter output for a window = sum(spatial kernel weights x range kernel weights x + # windowed input image) / normalization factor + filt_out[i - kern_arm, j - kern_arm] = np.sum( + s_kern[0:spatial_kern, 0:spatial_kern] + * np.exp( + -1 + * (guide_img_ext_center_pix - guide_img_ext_filt_window) ** 2 + / (2 * stddev_r**2) + ) + * in_img_ext_filt_window + ) + filt_out[i - kern_arm, j - kern_arm] = ( + filt_out[i - kern_arm, j - kern_arm] / norm_fact + ) + + return filt_out + + def fast_joint_bilateral_filter( + self, in_img, guide_img, spatial_kern, stddev_s, range_kern, stddev_r, stride + ): + """ + Applying Joint Bilateral Filter + """ + + # check if filter window sizes spatial_kern and range_kern greater than zero and are odd + if spatial_kern <= 0: + spatial_kern = 3 + warnings.warn( + "spatial kernel size (spatial_kern) cannot be <= zero, setting it as 3" + ) + elif spatial_kern % 2 == 0: + warnings.warn( + "range kernel size (spatial_kern) cannot be even, assigning it an odd value" + ) + spatial_kern = spatial_kern + 1 + + if range_kern <= 0: + range_kern = 3 + warnings.warn( + "range kernel size (range_kern) cannot be <= zero, setting it as 3" + ) + elif range_kern % 2 == 0: + warnings.warn( + "range kernel size (range_kern) cannot be even, assigning it an odd value" + ) + range_kern = range_kern + 1 + + # check if range_kern > spatial_kern + if range_kern > spatial_kern: + warnings.warn( + "range kernel size (range_kern) cannot be more than..." + "spatial kernel size (spatial_kern)" + ) + range_kern = spatial_kern + + # spawn a NxN gaussian kernel + s_kern = self.gauss_kern_raw(spatial_kern, stddev_s, stride) + + # pad the image with half arm length of the kernel; + # padType='constant' => pad value = 0; 'reflect' is more suitable + pad_len = int((spatial_kern - 1) / 2) + in_img_ext = np.pad(in_img, ((pad_len, pad_len), (pad_len, pad_len)), "reflect") + guide_img_ext = np.pad( + guide_img, ((pad_len, pad_len), (pad_len, pad_len)), "reflect" + ) + + filt_out = np.zeros(in_img.shape, dtype=np.float32) + norm_fact = np.zeros(in_img.shape) + sum_filt_out = np.zeros(in_img.shape) + + for i in range(spatial_kern): + for j in range(spatial_kern): + # Creating shifted arrays for processing each pixel in the window + in_img_ext_array = in_img_ext[ + i : i + in_img.shape[0], j : j + in_img.shape[1], ... + ] + guide_img_ext_array = guide_img_ext[ + i : i + in_img.shape[0], j : j + in_img.shape[1], ... + ] + + # Adding normalization factor for each pixel needed to average out the + # final result + norm_fact += s_kern[i, j] * np.exp( + -1 * (guide_img - guide_img_ext_array) ** 2 / (2 * stddev_r**2) + ) + + # Summing up the final result + sum_filt_out += ( + s_kern[i, j] + * np.exp( + -1 + * (guide_img - guide_img_ext_array) ** 2 + / (2 * stddev_r**2) + ) + * in_img_ext_array + ) + + filt_out = sum_filt_out / norm_fact + + return filt_out diff --git a/modules/black_level_correction.py b/modules/black_level_correction.py deleted file mode 100644 index cdc2fa2..0000000 --- a/modules/black_level_correction.py +++ /dev/null @@ -1,99 +0,0 @@ -# File: black_level_correction.py -# Description: Implements black level correction and image linearization based on config file params -# Code / Paper Reference: -# Author: xx-isp (ispinfinite@gmail.com) -#------------------------------------------------------------ - -import numpy as np - - -class BlackLevelCorrection: - 'Black Level Correction' - - def __init__(self, img, sensor_info, parm_blc): - self.img = img - self.enable = parm_blc['isEnable'] - self.sensor_info = sensor_info - self.param_blc = parm_blc - - def apply_blc_parameters(self): - - #get config parm - bayer = self.sensor_info['bayer_pattern'] - bpp = self.sensor_info['bitdep'] - r_offset = self.param_blc['r_offset'] - gb_offset = self.param_blc['gb_offset'] - gr_offset = self.param_blc['gr_offset'] - b_offset = self.param_blc['b_offset'] - - self.isLinearize = self.param_blc['isLinear'] - r_sat = self.param_blc['r_sat'] - gr_sat = self.param_blc['gr_sat'] - gb_sat = self.param_blc['gb_sat'] - b_sat = self.param_blc['b_sat'] - - - raw = np.float32(self.img) - - if bayer == 'rggb': - - #implementing this formula with condition - # ((img - blc) / (sat_level-blc)) * bitRange - - raw[0::2, 0::2] = raw[0::2, 0::2] - r_offset - raw[0::2, 1::2] = raw[0::2, 1::2] - gr_offset - raw[1::2, 0::2] = raw[1::2, 0::2] - gb_offset - raw[1::2, 1::2] = raw[1::2, 1::2] - b_offset - - if self.isLinearize == True: - raw[0::2, 0::2] = raw[0::2, 0::2] / (r_sat - r_offset) * ((2**bpp)-1) - raw[0::2, 1::2] = raw[0::2, 1::2] / (gr_sat - gr_offset) * ((2**bpp)-1) - raw[1::2, 0::2] = raw[1::2, 0::2] / (gb_sat - gb_offset) * ((2**bpp)-1) - raw[1::2, 1::2] = raw[1::2, 1::2] / (b_sat - b_offset) * ((2**bpp)-1) - - elif bayer == 'bggr': - raw[0::2, 0::2] = raw[0::2, 0::2] - b_offset - raw[0::2, 1::2] = raw[0::2, 1::2] - gb_offset - raw[1::2, 0::2] = raw[1::2, 0::2] - gr_offset - raw[1::2, 1::2] = raw[1::2, 1::2] - r_offset - - if self.isLinearize == True: - raw[0::2, 0::2] = raw[0::2, 0::2] / (b_sat - b_offset) * ((2**bpp)-1) - raw[0::2, 1::2] = raw[0::2, 1::2] / (gb_sat - gb_offset) * ((2**bpp)-1) - raw[1::2, 0::2] = raw[1::2, 0::2] / (gr_sat - gr_offset) * ((2**bpp)-1) - raw[1::2, 1::2] = raw[1::2, 1::2] / (r_sat - r_offset) * ((2**bpp)-1) - - elif bayer == 'grbg': - raw[0::2, 0::2] = raw[0::2, 0::2] - gr_offset - raw[0::2, 1::2] = raw[0::2, 1::2] - r_offset - raw[1::2, 0::2] = raw[1::2, 0::2] - b_offset - raw[1::2, 1::2] = raw[1::2, 1::2] - gb_offset - - if self.isLinearize == True: - raw[0::2, 0::2] = raw[0::2, 0::2] / (gr_sat - gr_offset) * ((2**bpp)-1) - raw[0::2, 1::2] = raw[0::2, 1::2] / (r_sat - r_offset) * ((2**bpp)-1) - raw[1::2, 0::2] = raw[1::2, 0::2] / (b_sat - b_offset) * ((2**bpp)-1) - raw[1::2, 1::2] = raw[1::2, 1::2] / (gb_sat - gb_offset) * ((2**bpp)-1) - - elif bayer == 'gbrg': - raw[0::2, 0::2] = raw[0::2, 0::2] - gb_offset - raw[0::2, 1::2] = raw[0::2, 1::2] - b_offset - raw[1::2, 0::2] = raw[1::2, 0::2] - r_offset - raw[1::2, 1::2] = raw[1::2, 1::2] - gr_offset - - if self.isLinearize == True: - raw[0::2, 0::2] = raw[0::2, 0::2] / (gb_sat - gb_offset) * ((2**bpp)-1) - raw[0::2, 1::2] = raw[0::2, 1::2] / (b_sat - b_offset) * ((2**bpp)-1) - raw[1::2, 0::2] = raw[1::2, 0::2] / (r_sat - r_offset) * ((2**bpp)-1) - raw[1::2, 1::2] = raw[1::2, 1::2] / (gr_sat - gr_offset) * ((2**bpp)-1) - - raw_blc = np.uint16(np.clip(raw, 0, (2**bpp)-1)) - return raw_blc - - def execute(self): - print('Black Level Correction = ' + str(self.enable)) - - if self.enable == False: - return self.img - else: - return self.apply_blc_parameters() diff --git a/modules/black_level_correction/black_level_correction.py b/modules/black_level_correction/black_level_correction.py new file mode 100644 index 0000000..7bad22e --- /dev/null +++ b/modules/black_level_correction/black_level_correction.py @@ -0,0 +1,161 @@ +""" +File: black_level_correction.py +Description: Implements black level correction and image linearization based on config file params +Code / Paper Reference: +Author: 10xEngineers Pvt Ltd +------------------------------------------------------------ +""" +import time +import numpy as np + +from util.utils import save_output_array + + +class BlackLevelCorrection: + """ + Black Level Correction + """ + + def __init__(self, img, platform, sensor_info, parm_blc): + self.img = img + self.enable = parm_blc["is_enable"] + self.sensor_info = sensor_info + self.param_blc = parm_blc + self.is_linearize = self.param_blc["is_linear"] + self.is_save = parm_blc["is_save"] + self.platform = platform + + def apply_blc_parameters(self): + """ + Apply BLC parameters provided in config file + """ + + # get config parm + bayer = self.sensor_info["bayer_pattern"] + bpp = self.sensor_info["bit_depth"] + r_offset = self.param_blc["r_offset"] + gb_offset = self.param_blc["gb_offset"] + gr_offset = self.param_blc["gr_offset"] + b_offset = self.param_blc["b_offset"] + + r_sat = self.param_blc["r_sat"] + gr_sat = self.param_blc["gr_sat"] + gb_sat = self.param_blc["gb_sat"] + b_sat = self.param_blc["b_sat"] + + raw = np.float32(self.img) + + if bayer == "rggb": + + # implementing this formula with condition + # ((img - blc) / (sat_level-blc)) * bitRange + + raw[0::2, 0::2] = raw[0::2, 0::2] - r_offset + raw[0::2, 1::2] = raw[0::2, 1::2] - gr_offset + raw[1::2, 0::2] = raw[1::2, 0::2] - gb_offset + raw[1::2, 1::2] = raw[1::2, 1::2] - b_offset + + if self.is_linearize is True: + raw[0::2, 0::2] = ( + raw[0::2, 0::2] / (r_sat - r_offset) * ((2**bpp) - 1) + ) + raw[0::2, 1::2] = ( + raw[0::2, 1::2] / (gr_sat - gr_offset) * ((2**bpp) - 1) + ) + raw[1::2, 0::2] = ( + raw[1::2, 0::2] / (gb_sat - gb_offset) * ((2**bpp) - 1) + ) + raw[1::2, 1::2] = ( + raw[1::2, 1::2] / (b_sat - b_offset) * ((2**bpp) - 1) + ) + + elif bayer == "bggr": + raw[0::2, 0::2] = raw[0::2, 0::2] - b_offset + raw[0::2, 1::2] = raw[0::2, 1::2] - gb_offset + raw[1::2, 0::2] = raw[1::2, 0::2] - gr_offset + raw[1::2, 1::2] = raw[1::2, 1::2] - r_offset + + if self.is_linearize is True: + raw[0::2, 0::2] = ( + raw[0::2, 0::2] / (b_sat - b_offset) * ((2**bpp) - 1) + ) + raw[0::2, 1::2] = ( + raw[0::2, 1::2] / (gb_sat - gb_offset) * ((2**bpp) - 1) + ) + raw[1::2, 0::2] = ( + raw[1::2, 0::2] / (gr_sat - gr_offset) * ((2**bpp) - 1) + ) + raw[1::2, 1::2] = ( + raw[1::2, 1::2] / (r_sat - r_offset) * ((2**bpp) - 1) + ) + + elif bayer == "grbg": + raw[0::2, 0::2] = raw[0::2, 0::2] - gr_offset + raw[0::2, 1::2] = raw[0::2, 1::2] - r_offset + raw[1::2, 0::2] = raw[1::2, 0::2] - b_offset + raw[1::2, 1::2] = raw[1::2, 1::2] - gb_offset + + if self.is_linearize is True: + raw[0::2, 0::2] = ( + raw[0::2, 0::2] / (gr_sat - gr_offset) * ((2**bpp) - 1) + ) + raw[0::2, 1::2] = ( + raw[0::2, 1::2] / (r_sat - r_offset) * ((2**bpp) - 1) + ) + raw[1::2, 0::2] = ( + raw[1::2, 0::2] / (b_sat - b_offset) * ((2**bpp) - 1) + ) + raw[1::2, 1::2] = ( + raw[1::2, 1::2] / (gb_sat - gb_offset) * ((2**bpp) - 1) + ) + + elif bayer == "gbrg": + raw[0::2, 0::2] = raw[0::2, 0::2] - gb_offset + raw[0::2, 1::2] = raw[0::2, 1::2] - b_offset + raw[1::2, 0::2] = raw[1::2, 0::2] - r_offset + raw[1::2, 1::2] = raw[1::2, 1::2] - gr_offset + + if self.is_linearize is True: + raw[0::2, 0::2] = ( + raw[0::2, 0::2] / (gb_sat - gb_offset) * ((2**bpp) - 1) + ) + raw[0::2, 1::2] = ( + raw[0::2, 1::2] / (b_sat - b_offset) * ((2**bpp) - 1) + ) + raw[1::2, 0::2] = ( + raw[1::2, 0::2] / (r_sat - r_offset) * ((2**bpp) - 1) + ) + raw[1::2, 1::2] = ( + raw[1::2, 1::2] / (gr_sat - gr_offset) * ((2**bpp) - 1) + ) + + raw_blc = np.uint16(np.clip(raw, 0, (2**bpp) - 1)) + return raw_blc + + def save(self): + """ + Function to save module output + """ + if self.is_save: + save_output_array( + self.platform["in_file"], + self.img, + "Out_black_level_correction_", + self.platform, + self.sensor_info["bit_depth"], + self.sensor_info["bayer_pattern"], + ) + + def execute(self): + """ + Black Level Correction + """ + print("Black Level Correction = " + str(self.enable)) + + if self.enable: + start = time.time() + blc_out = self.apply_blc_parameters() + print(f" Execution time: {time.time() - start:.3f}s") + self.img = blc_out + self.save() + return self.img diff --git a/modules/color_correction_matrix.py b/modules/color_correction_matrix.py deleted file mode 100644 index 4f441a7..0000000 --- a/modules/color_correction_matrix.py +++ /dev/null @@ -1,52 +0,0 @@ -# File: color_correction_matrix.py -# Description: Applies the 3x3 correction matrix on the image -# Code / Paper Reference: https://www.imatest.com/docs/colormatrix/ -# Author: xx-isp (ispinfinite@gmail.com) -#------------------------------------------------------------ - -import numpy as np - - -class ColorCorrectionMatrix: - 'Apply the color correction 3x3 matrix' - def __init__(self, img, sensor_info, parm_ccm): - self.img = img - self.enable = parm_ccm['isEnable'] - self.sensor_info = sensor_info - self.parm_ccm = parm_ccm - - def apply_ccm(self): - #get ccm parm - r1 = np.array(self.parm_ccm['corrected_red']) - r2 = np.array(self.parm_ccm['corrected_green']) - r3 = np.array(self.parm_ccm['corrected_blue']) - - ccm_mat = np.float32([r1, r2, r3]) - self.ccm_mat = ccm_mat - - #normalize 8bit to 0-1 img - self.img = np.float32(self.img) / 255.0 - - #convert to nx3 - img1 = self.img.reshape( - ((self.img.shape[0] * self.img.shape[1], 3))) - - #keeping imatest convention of colum sum to 1 mat. O*A => A = ccm - out = np.matmul(img1, self.ccm_mat.transpose()) - - #clipping after ccm is must to eliminate neg values - out = np.float32(np.clip(out, 0, 1)) - - #convert back - out = out.reshape(self.img.shape).astype(self.img.dtype) - out = np.uint8(out * 255) - - return out - - def execute(self): - print('Color Correction Matrix = ' + str(self.enable)) - - if self.enable == False: - return self.img - else: - return self.apply_ccm() diff --git a/modules/color_correction_matrix/color_correction_matrix.py b/modules/color_correction_matrix/color_correction_matrix.py new file mode 100644 index 0000000..f281fb3 --- /dev/null +++ b/modules/color_correction_matrix/color_correction_matrix.py @@ -0,0 +1,80 @@ +""" +File: color_correction_matrix.py +Description: Applies the 3x3 correction matrix on the image +Code / Paper Reference: https://www.imatest.com/docs/colormatrix/ +Author: 10xEngineers Pvt Ltd +------------------------------------------------------------ +""" +import time +import numpy as np + +from util.utils import save_output_array + + +class ColorCorrectionMatrix: + "Apply the color correction 3x3 matrix" + + def __init__(self, img, platform, sensor_info, parm_ccm): + self.img = img + self.enable = parm_ccm["is_enable"] + self.sensor_info = sensor_info + self.parm_ccm = parm_ccm + self.bit_depthth = sensor_info["bit_depth"] + self.ccm_mat = None + self.is_save = parm_ccm["is_save"] + self.platform = platform + + def apply_ccm(self): + """ + Apply CCM Params + """ + r_1 = np.array(self.parm_ccm["corrected_red"]) + r_2 = np.array(self.parm_ccm["corrected_green"]) + r_3 = np.array(self.parm_ccm["corrected_blue"]) + + self.ccm_mat = np.float32([r_1, r_2, r_3]) + + # normalize nbit to 0-1 img + self.img = np.float32(self.img) / (2**self.bit_depthth - 1) + + # convert to nx3 + img1 = self.img.reshape(((self.img.shape[0] * self.img.shape[1], 3))) + + # keeping imatest convention of colum sum to 1 mat. O*A => A = ccm + out = np.matmul(img1, self.ccm_mat.transpose()) + + # clipping after ccm is must to eliminate neg values + out = np.float32(np.clip(out, 0, 1)) + + # convert back + out = out.reshape(self.img.shape).astype(self.img.dtype) + out = np.uint16(out * (2**self.bit_depthth - 1)) + + return out + + def save(self): + """ + Function to save module output + """ + if self.is_save: + save_output_array( + self.platform["in_file"], + self.img, + "Out_color_correction_matrix_", + self.platform, + self.sensor_info["bit_depth"], + self.sensor_info["bayer_pattern"], + ) + + def execute(self): + """Execute ccm if enabled.""" + print("Color Correction Matrix = " + str(self.enable)) + + if self.enable: + start = time.time() + ccm_out = self.apply_ccm() + print(f" Execution time: {time.time() - start:.3f}s") + self.img = ccm_out + + self.save() + return self.img diff --git a/modules/color_space_conversion.py b/modules/color_space_conversion.py deleted file mode 100644 index 596127e..0000000 --- a/modules/color_space_conversion.py +++ /dev/null @@ -1,191 +0,0 @@ -# File: color_space_conversion.py -# Description: Converts RGB to YUV or YCbCr -# Code / Paper Reference: https://en.wikipedia.org/wiki/YCbCr#ITU-R_BT.709_conversion -# https://www.itu.int/rec/R-REC-BT.601/ -# https://www.itu.int/rec/R-REC-BT.709-6-201506-I/en -# https://learn.microsoft.com/en-us/windows/win32/medfound/recommended-8-bit-yuv-formats-for-video-rendering -# https://web.archive.org/web/20180423091842/http://www.equasys.de/colorconversion.html -# Author: xx-isp (ispinfinite@gmail.com) -#------------------------------------------------------------ - -from pickletools import uint8 -import numpy as np - - -class ColorSpaceConv: - - def __init__(self, img, sensor_info, parm_csc): - self.img = img - #self.enable = parm_csc['isEnable'] - self.sensor_info = sensor_info - self.parm_csc = parm_csc - self.conv_std = self.parm_csc['conv_standard'] - self.conv_type = self.parm_csc['conv_type'] - - def execute(self): - print('Color Space Conversion (default) = True' ) - - # if self.enable == False: - # return self.img - # else: - return self.rgb_to_yuv() - - def rgb_to_yuv(self): - - if self.conv_type == 2: - # digital - return self.rgb_to_yuv_8bit() - elif self.conv_type == 1: - #for analog conv - return self.rgb_to_yuv_analog() - else: - # if wrong value - return self.img - - def rgb_to_yuv_8bit(self): - - if self.conv_std == 1: - # for BT. 709 - self.rgb2yuv_mat = np.array( - [[47, 157, 16], - [-26, -86, 112], - [112, -102, -10]]) - else: - - # for BT.601/407 - self.rgb2yuv_mat = np.array( - [[65, 129, 25], - [-38, -74, 112], - [112, -94, -18]]) - - #normalize image to 0-1 - self.img = np.float32(self.img) / 255.0 - - #make nx3 2d matrix of image - mat_2d = self.img.reshape((self.img.shape[0] * self.img.shape[1], 3)) - - # convert to 3xn for matrix multiplication - mat2d_t = mat_2d.transpose() - - # convert to YUV - yuv_2d = np.matmul(self.rgb2yuv_mat, mat2d_t) - yuv_2d[0, :] = 16 + yuv_2d[0, :] - yuv_2d[1, :] = 128 + yuv_2d[1, :] - yuv_2d[2, :] = 128 + yuv_2d[2, :] - yuv_2d = np.round(yuv_2d) - - # reshape the image back - yuv2d_t = yuv_2d.transpose() - - yuv2d_t = np.clip(yuv2d_t, 0, 255) - - self.img = yuv2d_t.reshape(self.img.shape).astype(np.uint8) - return self.img - - def rgb_to_yuv_analog(self): - - if self.conv_std == 1: - # for BT.709 HDTV (HD resolution) analog - self.rgb2yuv_mat = np.array( - [[0.2126, 0.7152, 0.0722], - [-0.1147, -0.3854, 0.5], - [0.5, -0.4542, -0.0458]]) - else: - # for BT.601/407 analog - self.rgb2yuv_mat = np.array( - [[0.299, 0.587, 0.114], - [-0.1687, -0.3313, 0.5], - [0.5, -0.4187, -0.0813]]) - - #normalize image to 0-1 - self.img = np.float32(self.img) / 255.0 - - #make nx3 2d matrix of image - mat_2d = self.img.reshape((self.img.shape[0] * self.img.shape[1], 3)) - - # convert to 3xn for matrix multiplication - mat2d_t = mat_2d.transpose() - - # convert to YUV - yuv_2d = np.matmul(self.rgb2yuv_mat, mat2d_t) - - # reshape the image back - yuv2d_t = yuv_2d.transpose() - - self.img = yuv2d_t.reshape(self.img.shape).astype(np.float32) - return self.img - - - def yuv_to_rgb(self, yuv_img): - - #copy the input yuv image to class variable - self.yuv_img = yuv_img - - #do nothing if yuv module was off - #if self.enable == True: - - if self.conv_type == 2: - - # digital - return self.yuv_to_rgb_8bit() - - elif self.conv_type == 1: - - #for analog conv - return self.yuv_to_rgb_analog() - - # else: - # return self.yuv_img - - def yuv_to_rgb_8bit(self): - - #make nx3 2d matrix of image - mat_2d = self.yuv_img.reshape((self.yuv_img.shape[0] * self.yuv_img.shape[1], 3)) - - # convert to 3xn for matrix multiplication - mat2d_t = mat_2d.transpose() - - #subract the offsets - mat2d_t = mat2d_t - np.array([[16, 128, 128]]).transpose() - - # yuv_to_rgb mat generated by inv - self.yuv2rgb_mat = np.linalg.inv(self.rgb2yuv_mat) - - # convert to RGB - rgb_2d = np.matmul(self.yuv2rgb_mat, mat2d_t) - - # reshape the image back - rgb2d_t = rgb_2d.transpose() - self.yuv_img = rgb2d_t.reshape(self.yuv_img.shape).astype(np.float32) - - #clip the resultant img as it can have neg rgb values for small Y' - self.yuv_img = np.float32(np.clip(self.yuv_img, 0, 1)) - - # convert the image to [0-255] - self.yuv_img = np.uint8(255*self.yuv_img) - return self.yuv_img - - def yuv_to_rgb_analog(self): - - #make nx3 2d matrix of image - mat_2d = self.yuv_img.reshape((self.yuv_img.shape[0] * self.yuv_img.shape[1], 3)) - - # convert to 3xn for matrix multiplication - mat2d_t = mat_2d.transpose() - - # yuv_to_rgb mat generated by inv - self.yuv2rgb_mat = np.linalg.inv(self.rgb2yuv_mat) - - # convert to RGB - rgb_2d = np.matmul(self.yuv2rgb_mat, mat2d_t) - - # reshape the image back - rgb2d_t = rgb_2d.transpose() - self.yuv_img = rgb2d_t.reshape(self.yuv_img.shape).astype(self.yuv_img.dtype) - - #clip the resultant img as it can have neg rgb values for small Y' - self.yuv_img = np.float32(np.clip(self.yuv_img, 0, 1)) - - # convert the image to [0-255] - self.yuv_img = np.uint8(255*self.yuv_img) - return self.yuv_img diff --git a/modules/color_space_conversion/color_space_conversion.py b/modules/color_space_conversion/color_space_conversion.py new file mode 100644 index 0000000..ed45959 --- /dev/null +++ b/modules/color_space_conversion/color_space_conversion.py @@ -0,0 +1,113 @@ +""" +File: color_space_conversion.py +Description: Converts RGB to YUV or YCbCr +Code / Paper Reference: https://en.wikipedia.org/wiki/YCbCr#ITU-R_BT.709_conversion + https://www.itu.int/rec/R-REC-BT.601/ + https://www.itu.int/rec/R-REC-BT.709-6-201506-I/en + https://learn.microsoft.com/en-us/windows/win32/medfound/recommended- + 8-bit-yuv-formats-for-video-rendering + https://web.archive.org/web/20180423091842/http://www.equasys.de/ + colorconversion.html + Author: 10xEngineers Pvt Ltd +------------------------------------------------------------------------------ +""" + +import time +import numpy as np + +from util.utils import save_output_array_yuv + + +class ColorSpaceConversion: + """ + Color Space Conversion + """ + + def __init__(self, img, platform, sensor_info, parm_csc): + self.img = img.copy() + self.is_save = parm_csc["is_save"] + self.platform = platform + self.sensor_info = sensor_info + self.parm_csc = parm_csc + self.bit_depth = sensor_info["bit_depth"] + self.conv_std = self.parm_csc["conv_standard"] + self.rgb2yuv_mat = None + self.yuv_img = None + + def rgb_to_yuv_8bit(self): + """ + RGB-to-YUV Colorspace conversion 8bit + """ + + if self.conv_std == 1: + # for BT. 709 + self.rgb2yuv_mat = np.array( + [[47, 157, 16], [-26, -86, 112], [112, -102, -10]] + ) + else: + + # for BT.601/407 + # conversion metrix with 8bit integer co-efficients - m=8 + self.rgb2yuv_mat = np.array( + [[77, 150, 29], [131, -110, -21], [-44, -87, 138]] + ) + + # make nx3 2d matrix of image + mat_2d = self.img.reshape((self.img.shape[0] * self.img.shape[1], 3)) + + # convert to 3xn for matrix multiplication + mat2d_t = mat_2d.transpose() + + # convert to YUV + yuv_2d = np.matmul(self.rgb2yuv_mat, mat2d_t) + + # convert image with its provided bit_depth + yuv_2d = np.float64(yuv_2d) / (2**8) + yuv_2d = np.where(yuv_2d >= 0, np.floor(yuv_2d + 0.5), np.ceil(yuv_2d - 0.5)) + + # black-level/DC offset added to YUV values + yuv_2d[0, :] = 2 ** (self.bit_depth / 2) + yuv_2d[0, :] + yuv_2d[1, :] = 2 ** (self.bit_depth - 1) + yuv_2d[1, :] + yuv_2d[2, :] = 2 ** (self.bit_depth - 1) + yuv_2d[2, :] + + # reshape the image back + yuv2d_t = yuv_2d.transpose() + + yuv2d_t = np.clip(yuv2d_t, 0, (2**self.bit_depth) - 1) + + # Modules after CSC need 8-bit YUV so converting it into 8-bit after Normalizing. + yuv2d_t = yuv2d_t / (2 ** (self.bit_depth - 8)) + yuv2d_t = np.where( + yuv2d_t >= 0, np.floor(yuv2d_t + 0.5), np.ceil(yuv2d_t - 0.5) + ) + + yuv2d_t = np.clip(yuv2d_t, 0, 255) + + self.img = yuv2d_t.reshape(self.img.shape).astype(np.uint8) + return self.img + + def save(self): + """ + Function to save module output + """ + if self.is_save: + save_output_array_yuv( + self.platform["in_file"], + self.img, + "Out_color_space_conversion_", + self.platform, + self.conv_std, + ) + + def execute(self): + """ + Execute Color Space Conversion + """ + print("Color Space Conversion (default) = True") + + start = time.time() + csc_out = self.rgb_to_yuv_8bit() + print(f" Execution time: {time.time() - start:.3f}s") + self.img = csc_out + self.save() + return self.img diff --git a/modules/crop.py b/modules/crop.py deleted file mode 100644 index f98fd90..0000000 --- a/modules/crop.py +++ /dev/null @@ -1,90 +0,0 @@ -# File: crop.py -# Description: Crops the bayer image keeping cfa pattern intact -# Code / Paper Reference: -# Author: xx-isp (ispinfinite@gmail.com) -#------------------------------------------------------------ - -import numpy as np - -class Crop: - """ - Parameters: - ---------- - img: 2D array - new_size: 2-tuple with required height and width. - - Return: - ------ - cropped_img: Generated coloured image of required size with same dtype - as the input image. - """ - def __init__(self, img, sensor_info, parm_cro): - self.img = img - self.old_size = (sensor_info["height"], sensor_info["width"]) - self.new_size = (parm_cro["new_height"], parm_cro["new_width"]) - self.enable = parm_cro["isEnable"] - self.is_debug = parm_cro["isDebug"] - self.update_sensor_info(sensor_info) - - def update_sensor_info(self, dict): - if self.enable: - if dict["height"]!= self.new_size[0] or dict["width"]!=self.new_size[1]: - dict["height"] = self.new_size[0] - dict["width"] = self.new_size[1] - dict["orig_size"]= str(self.img.T.shape) - - def crop(self, img, rows_to_crop=0, cols_to_crop=0): - - """ - Crop 2D array. - Parameter: - --------- - img: image (2D array) to be cropped. - rows_to_crop: Number of rows to crop. If it is an even integer, - equal number of rows are cropped from either side of the image. - Otherwise the image is cropped from the extreme right/bottom. - cols_to_crop: Number of columns to crop. Works exactly as rows_to_crop. - - Output: cropped image - """ - - if rows_to_crop or cols_to_crop: - if rows_to_crop%4==0 and cols_to_crop%4==0: - img = img[rows_to_crop//2:-rows_to_crop//2, cols_to_crop//2:-cols_to_crop//2] - else: - print(" - Input/Output heights are not compatible." \ - " Bayer pattern will be disturbed if cropped!") - return img - - def apply_cropping(self): - if self.old_size==self.new_size: - print(' - Output size is the same as input size.') - return self.img - - if self.old_size[0] thresh): - corrected_pv_count+=1 - - # Compute gradients - vertical_grad = abs( - 2 * center_pixel - top_mid - bottom_mid) - horizontal_grad = abs( - 2 * center_pixel - left_of_center_pixel - right_of_center_pixel) - left_diagonal_grad = abs( - 2 * center_pixel - top_left - bottom_left) - right_diagonal_grad = abs( - 2 * center_pixel - top_right - bottom_right) - - min_grad = min(vertical_grad, horizontal_grad, - left_diagonal_grad, right_diagonal_grad) - - # Correct value is computed using neighbors in the direction of minimum gradient. - if (min_grad == vertical_grad): - center_pixel = (top_mid + bottom_mid) / 2 - elif (min_grad == horizontal_grad): - center_pixel = ( - left_of_center_pixel + right_of_center_pixel) / 2 - elif (min_grad == left_diagonal_grad): - center_pixel = (top_left + bottom_left) / 2 - else: - center_pixel = (top_right + bottom_right) / 2 - - # Corrected pixels are placed in non-padded image. - dpc_img[y, x] = center_pixel - self.img = np.uint16(np.clip(dpc_img, 0, (2**self.bpp)-1)) - if self.is_debug: - print(' - Number of corrected pixels = ', corrected_pv_count) - print(' - Threshold = ', self.threshold) - return self.img - - def execute(self): - print('Dead Pixel Correction = ' + str(self.enable)) - - if self.enable == False: - return self.img - else: - return self.apply_dead_pixel_correction() diff --git a/modules/dead_pixel_correction/dead_pixel_correction.py b/modules/dead_pixel_correction/dead_pixel_correction.py new file mode 100644 index 0000000..8b45832 --- /dev/null +++ b/modules/dead_pixel_correction/dead_pixel_correction.py @@ -0,0 +1,71 @@ +""" +File: dead_pixel_correction.py +Description: Corrects the hot or dead pixels +Code / Paper Reference: https://ieeexplore.ieee.org/document/9194921 +Implementation inspired from: (OpenISP) https://github.com/cruxopen/openISP +Author: 10xEngineers Pvt Ltd +------------------------------------------------------------ +""" +import time +import numpy as np + +from util.utils import save_output_array +from modules.dead_pixel_correction.dynamic_dpc import DynamicDPC as DynDPC + + + +class DeadPixelCorrection: + "Dead Pixel Correction" + + def __init__(self, img, sensor_info, parm_dpc, platform): + self.img = img + self.enable = parm_dpc["is_enable"] + self.sensor_info = sensor_info + self.parm_dpc = parm_dpc + self.is_progress = platform["disable_progress_bar"] + self.is_leave = platform["leave_pbar_string"] + self.bpp = self.sensor_info["bit_depth"] + self.threshold = self.parm_dpc["dp_threshold"] + self.is_debug = self.parm_dpc["is_debug"] + self.is_save = parm_dpc["is_save"] + self.platform = platform + + def padding(self): + """Return a mirror padded copy of image.""" + + img_pad = np.pad(self.img, (2, 2), "reflect") + return img_pad + + def apply_dynamic_dpc(self): + """Apply DPC""" + dpc = DynDPC(self.img, self.sensor_info, self.parm_dpc) + return dpc.dynamic_dpc() + + def save(self): + """ + Function to save module output + """ + if self.is_save: + save_output_array( + self.platform["in_file"], + self.img, + "Out_dead_pixel_correction_", + self.platform, + self.bpp, + self.sensor_info["bayer_pattern"], + ) + + def execute(self): + """Execute DPC Module""" + + print("Dead Pixel Correction = " + str(self.enable)) + + if self.enable: + start = time.time() + self.img = np.float32(self.img) + dpc_out = self.apply_dynamic_dpc() + print(f" Execution time: {time.time() - start:.3f}s") + self.img = dpc_out + + self.save() + return self.img diff --git a/modules/dead_pixel_correction/dynamic_dpc.py b/modules/dead_pixel_correction/dynamic_dpc.py new file mode 100644 index 0000000..26041bd --- /dev/null +++ b/modules/dead_pixel_correction/dynamic_dpc.py @@ -0,0 +1,318 @@ +""" +File: dead_pixel_correction.py +Description: Corrects the hot or dead pixels +Code / Paper Reference: https://ieeexplore.ieee.org/document/9194921 +Implementation inspired from: (OpenISP) https://github.com/cruxopen/openISP +Author: 10xEngineers Pvt Ltd +------------------------------------------------------------ +""" + +import numpy as np +from scipy.ndimage import maximum_filter, minimum_filter, correlate + + +class DynamicDPC: + """ + Dynamic dead pixel correction scans the entire image for potential + dead pixels and apply correction using the neighboring pixels. + """ + + def __init__(self, img, sensor_info, parm_dpc): + self.img = img + self.sensor_info = sensor_info + self.bpp = self.sensor_info["bit_depth"] + self.threshold = parm_dpc["dp_threshold"] + self.is_debug = parm_dpc["is_debug"] + + def dynamic_dpc(self): + """This function detects and corrects Dead pixels using numpy + array opertaions.""" + + height, width = self.sensor_info["height"], self.sensor_info["width"] + + dpc_img = np.empty((height, width), np.float32) + + # Get 3x3 neighbourhood of each pixel. + # 5x5 matrix is defined as this window is extarcted from raw image. + window = np.array( + [ + [1, 0, 1, 0, 1], + [0, 0, 0, 0, 0], + [1, 0, 0, 0, 1], + [0, 0, 0, 0, 0], + [1, 0, 1, 0, 1], + ] + ) + + # The maximum and minimum filters automatically pad the input image internally, + # eliminating the need for manual padding. + max_value = maximum_filter(self.img, footprint=window, mode="mirror") + min_value = minimum_filter(self.img, footprint=window, mode="mirror") + + # Condition 1: center_pixel needs to be corrected if it lies outside the + # interval(min_value,max) of the 3x3 neighbourhood. + # min_value < center_pixel < max_value--> no correction needed + mask_cond1 = ( + np.where((min_value > self.img) | (self.img > max_value), True, False) + ).astype("int32") + + # Condition 2: + # center_pixel is corrected only if the difference of center_pixel and every + # neighboring pixel is greater than the specified threshold. + # The two if conditions are used in combination to reduce False positives. + + # Kernels to compute the difference between center pixel and + # each of the 8 neighbours. + ker_top_left = np.array( + [ + [-1, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 1, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + ] + ) + ker_top_mid = np.array( + [ + [0, 0, -1, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 1, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + ] + ) + ker_top_right = np.array( + [ + [0, 0, 0, 0, -1], + [0, 0, 0, 0, 0], + [0, 0, 1, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + ] + ) + ker_mid_left = np.array( + [ + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [-1, 0, 1, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + ] + ) + ker_mid_right = np.array( + [ + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 1, 0, -1], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + ] + ) + ker_bottom_left = np.array( + [ + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 1, 0, 0], + [0, 0, 0, 0, 0], + [-1, 0, 0, 0, 0], + ] + ) + ker_bottom_mid = np.array( + [ + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 1, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, -1, 0, 0], + ] + ) + ker_bottom_right = np.array( + [ + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 1, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, -1], + ] + ) + + # convolve each kernel over image to compute differences + # The correlate function automatically pads the input image internally, + # eliminating the need for manual padding. + + diff_top_left = np.abs(correlate(self.img, ker_top_left, mode="mirror")) + diff_top_mid = np.abs(correlate(self.img, ker_top_mid, mode="mirror")) + diff_top_right = np.abs(correlate(self.img, ker_top_right, mode="mirror")) + diff_mid_left = np.abs(correlate(self.img, ker_mid_left, mode="mirror")) + diff_mid_right = np.abs(correlate(self.img, ker_mid_right, mode="mirror")) + diff_bottom_left = np.abs(correlate(self.img, ker_bottom_left, mode="mirror")) + diff_bottom_mid = np.abs(correlate(self.img, ker_bottom_mid, mode="mirror")) + diff_bottom_right = np.abs(correlate(self.img, ker_bottom_right, mode="mirror")) + + del ( + ker_top_left, + ker_top_mid, + ker_top_right, + ker_mid_left, + ker_mid_right, + ker_bottom_left, + ker_bottom_mid, + ker_bottom_right, + ) + + # Stack all arrays + diff_array = np.stack( + [ + diff_top_left, + diff_top_mid, + diff_top_right, + diff_mid_left, + diff_mid_right, + diff_bottom_left, + diff_bottom_mid, + diff_bottom_right, + ], + axis=2, + ) + + del ( + diff_top_left, + diff_top_mid, + diff_top_right, + diff_mid_left, + diff_mid_right, + diff_bottom_left, + diff_bottom_mid, + diff_bottom_right, + ) + + # all gradients must be greater than the threshold for a pixel to be a DP. + mask_cond2 = np.all(np.where(diff_array > self.threshold, True, False), axis=2) + + # mask with 1 for DPs and 0 for good pixels (dead pixels are the ones for which + # both conditions are true) + detection_mask = mask_cond1 * mask_cond2 + + # Compute gradients + ker_v = np.array([[-1, 0, 2, 0, -1]]).T + ker_h = np.array([[-1, 0, 2, 0, -1]]) + ker_left_dia = np.array( + [ + [0, 0, 0, 0, -1], + [0, 0, 0, 0, 0], + [0, 0, 2, 0, 0], + [0, 0, 0, 0, 0], + [-1, 0, 0, 0, 0], + ] + ) + ker_right_dia = np.array( + [ + [-1, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 2, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, -1], + ] + ) + + # Convole the kernels to compute respective gradients + vertical_grad = np.abs(correlate(self.img, ker_v, mode="mirror")) + horizontal_grad = np.abs(correlate(self.img, ker_h, mode="mirror")) + left_diagonal_grad = np.abs(correlate(self.img, ker_left_dia, mode="mirror")) + right_diagonal_grad = np.abs(correlate(self.img, ker_right_dia, mode="mirror")) + + # Delete temporary variables + del ker_v, ker_h, ker_left_dia, ker_right_dia + + # compute the direction of the minimum gradient + min_grad = np.min( + np.stack( + [ + vertical_grad, + horizontal_grad, + left_diagonal_grad, + right_diagonal_grad, + ], + axis=2, + ), + axis=2, + ) + + # corrected value is computed as the mean of the neighbours + # in the direction of min_value gadient. + ker_mean_v = np.array([[1, 0, 0, 0, 1]]).T / 2 + ker_mean_h = np.array([[1, 0, 0, 0, 1]]) / 2 + ker_mean_ldia = ( + np.array( + [ + [0, 0, 0, 0, 1], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [1, 0, 0, 0, 0], + ] + ) + / 2 + ) + ker_mean_rdia = ( + np.array( + [ + [1, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 1], + ] + ) + / 2 + ) + + # Convolve kernels to compute mean for each direction + mean_v = correlate(self.img, ker_mean_v, mode="mirror") + mean_h = correlate(self.img, ker_mean_h, mode="mirror") + mean_ldia = correlate(self.img, ker_mean_ldia, mode="mirror") + mean_rdia = correlate(self.img, ker_mean_rdia, mode="mirror") + + del ker_mean_v, ker_mean_h, ker_mean_ldia, ker_mean_rdia + + # Corrected image has the corrected pixel values in place of a detected dead pixel + # and 0 elsewhere + corrected_img = np.zeros(self.img.shape) + + # compile all pixels that can be corrected using the neighbors in the same direction + corrected_v = np.where(min_grad == vertical_grad, mean_v, 0) * detection_mask + corrected_h = np.where(min_grad == horizontal_grad, mean_h, 0) * detection_mask + corrected_ldia = ( + np.where(min_grad == left_diagonal_grad, mean_ldia, 0) * detection_mask + ) + corrected_rdia = ( + np.where(min_grad == right_diagonal_grad, mean_rdia, 0) * detection_mask + ) + + # In most cases, the corrected masks created above will not overlap, as each pixel will + # have a unique gradient direction. However, in rare cases where two or more directions + # have the same gradient magnitude, it is necessary to specify which neighboring pixels + # should be used to calculate the corrected value. To resolve this issue, the next block + # of code ensures that each pixel is only corrected once, giving priority to the vertical + # direction, then horizontal, left diagonal, and finally the right diagonal. + corrected_img = corrected_img + corrected_v + corrected_img = np.where(corrected_img == 0, corrected_h, corrected_img) + corrected_img = np.where(corrected_img == 0, corrected_ldia, corrected_img) + corrected_img = np.where(corrected_img == 0, corrected_rdia, corrected_img) + + del mean_h, mean_v, mean_ldia, mean_rdia + del corrected_v, corrected_h, corrected_ldia, corrected_rdia + + # Insert correct value of the detected dead pixels + dpc_img = np.where(detection_mask, corrected_img, self.img) + + # Remove padding + self.img = np.uint16(np.clip(dpc_img, 0, (2**self.bpp) - 1)) + + if self.is_debug: + print( + " - Number of corrected pixels = ", + np.count_nonzero(detection_mask), + ) + print(" - Threshold = ", self.threshold) + return self.img diff --git a/modules/demosaic.py b/modules/demosaic.py deleted file mode 100644 index 05a7f68..0000000 --- a/modules/demosaic.py +++ /dev/null @@ -1,139 +0,0 @@ -# File: demosaic.py -# Description: Implements the cfa interpolation -# Code / Paper Reference: https://www.ipol.im/pub/art/2011/g_mhcd/article.pdf -# Author: xx-isp (ispinfinite@gmail.com) -#------------------------------------------------------------ - -import numpy as np -from scipy.signal import correlate2d - - -class CFAInterpolation: - 'CFA Interpolation' - - def __init__(self, img, sensor_info, parm_dem): - self.img = img - #self.enable = parm_dem['isEnable'] - self.bayer = sensor_info['bayer_pattern'] - self.bitdepth = sensor_info['bitdep'] - - def masks_CFA_Bayer(self): - # ----generating masks for the given bayer pattern----- - - pattern = self.bayer - # dict will be creating 3 channel boolean type array of given shape with the name - # tag like 'r': [False False ....] , 'g': [False False ....] , 'b': [False False ....] - channels = dict((channel, np.zeros(self.img.shape, dtype=bool)) - for channel in 'rgb') - - # Following comment will create boolean masks for each channel r, g and b - for channel, (y, x) in zip(pattern, [(0, 0), (0, 1), (1, 0), (1, 1)]): - channels[channel][y::2, x::2] = True - - # tuple will return 3 channel boolean pattern for r,g and b with True at corresponding value - # For example in rggb pattern, the r mask would then be - # [ [ True, False, True, False], [ False, False, False, False]] - return tuple(channels[c] for c in 'rgb') - - def apply_cfa(self): - # ----demosaicing the given raw image----- - - # 3D masks accoridng to the given bayer - mask_r, mask_g, mask_b = self.masks_CFA_Bayer() - raw_in = np.float32(self.img) - - # Declaring 3D Demosaiced image - demos_out = np.empty((raw_in.shape[0], raw_in.shape[1], 3)) - - # 5x5 2D Filter coefficients for linear interpolation of r,g and b channels - # These filters helps to retain corresponding pixels information using laplacian while interpolation - - # g at r & b location, - g_at_r_and_b = np.float32( - [[0, 0, -1, 0, 0], - [0, 0, 2, 0, 0], - [-1, 2, 4, 2, -1], - [0, 0, 2, 0, 0], - [0, 0, -1, 0, 0]]) * 0.125 - - # r at green in r row & b column -- b at green in b row & r column - r_at_Gr_and_b_at_Gb = np.float32( - [[0, 0, 0.5, 0, 0], - [0, -1, 0, -1, 0], - [-1, 4, 5, 4, - 1], - [0, -1, 0, -1, 0], - [0, 0, 0.5, 0, 0]]) * 0.125 - - # r at green in b row & r column -- b at green in r row & b column - r_at_Gb_and_b_at_Gr = np.transpose(r_at_Gr_and_b_at_Gb) - - # r at blue in b row & b column -- b at red in r row & r column - r_at_B_and_b_at_R = np.float32( - [[0, 0, -1.5, 0, 0], - [0, 2, 0, 2, 0], - [-1.5, 0, 6, 0, -1.5], - [0, 2, 0, 2, 0], - [0, 0, -1.5, 0, 0]]) * 0.125 - - # Creating r, g & b channels from raw_in - r = raw_in * mask_r - g = raw_in * mask_g - b = raw_in * mask_b - - # Creating g channel first after applying g_at_r_and_b filter - g = np.where(np.logical_or(mask_r == 1, mask_b == 1), correlate2d(raw_in, g_at_r_and_b, mode='same', boundary='symm'), - g) - - # Applying other linear filters - rb_at_g_rbbr = correlate2d(raw_in, r_at_Gr_and_b_at_Gb, mode='same', boundary='symm') - rb_at_g_brrb = correlate2d(raw_in, r_at_Gb_and_b_at_Gr, mode='same', boundary='symm') - rb_at_gr_bbrr = correlate2d(raw_in, r_at_B_and_b_at_R, mode='same', boundary='symm') - - # After convolving the input raw image with rest of the filters, now we have the respective - # interpolated data, now we just have to extract the updated pixels values according to the - # position they are meant to be updated - - # Extracting Red rows. - r_rows = np.transpose(np.any(mask_r == 1, axis=1)[np.newaxis]) * np.ones(r.shape, dtype=np.float32) - - # Extracting Red columns. - r_col = np.any(mask_r == 1, axis=0)[np.newaxis] * np.ones(r.shape, dtype=np.float32) - - # Extracting Blue rows. - b_rows = np.transpose(np.any(mask_b == 1, axis=1)[np.newaxis]) * np.ones(b.shape, dtype=np.float32) - - # Extracting Blue columns - b_col = np.any(mask_b == 1, axis=0)[np.newaxis] * np.ones(b.shape, dtype=np.float32) - - # For R channel we have to update pixels at [r rows and b cols] & at [b rows and r cols] - # 3 pixels need to be updated near one given r - r = np.where(np.logical_and(r_rows == 1, b_col == 1), rb_at_g_rbbr, r) - r = np.where(np.logical_and(b_rows == 1, r_col == 1), rb_at_g_brrb, r) - - # Similarly for B channel we have to update pixels at [r rows and b cols] & at [b rows and r cols] - # 3 pixels need to be updated near one given b - b = np.where(np.logical_and(b_rows == 1, r_col == 1), rb_at_g_rbbr, b) - b = np.where(np.logical_and(r_rows == 1, b_col == 1), rb_at_g_brrb, b) - - # Final r & b channels - r = np.where(np.logical_and(b_rows == 1, b_col == 1), rb_at_gr_bbrr, r) - b = np.where(np.logical_and(r_rows == 1, r_col == 1), rb_at_gr_bbrr, b) - - demos_out[:, :, 0] = r - demos_out[:, :, 1] = g - demos_out[:, :, 2] = b - - # Clipping the pixels values within the bit range - demos_out = np.clip(demos_out, 0, 2 ** self.bitdepth - 1) - demos_out = demos_out/(2**self.bitdepth) - - demos_out = np.uint8(demos_out*255) - return demos_out - - def execute(self): - print('CFA interpolation (default) = True') - - # if self.enable == False: - # return self.img - # elif self.enable == True: - return self.apply_cfa() \ No newline at end of file diff --git a/modules/demosaic/demosaic.py b/modules/demosaic/demosaic.py new file mode 100644 index 0000000..4e8a33d --- /dev/null +++ b/modules/demosaic/demosaic.py @@ -0,0 +1,87 @@ +""" +File: demosaic.py +Description: Implements the cfa interpolation algorithms +Author: 10xEngineers +------------------------------------------------------------ +""" +import time +import numpy as np +from util.utils import save_output_array +from modules.demosaic.malvar_he_cutler import Malvar as MAL + + +class Demosaic: + "CFA Interpolation" + + def __init__(self, img, platform, sensor_info, parm_dga): + self.img = img + self.bayer = sensor_info["bayer_pattern"] + self.bit_depth = sensor_info["bit_depth"] + self.is_save = parm_dga["is_save"] + self.sensor_info = sensor_info + self.platform = platform + + def masks_cfa_bayer(self): + """ + Generating masks for the given bayer pattern + """ + pattern = self.bayer + # dict will be creating 3 channel boolean type array of given shape with the name + # tag like 'r_channel': [False False ....] , 'g_channel': [False False ....] , + # 'b_channel': [False False ....] + channels = dict( + (channel, np.zeros(self.img.shape, dtype=bool)) for channel in "rgb" + ) + + # Following comment will create boolean masks for each channel r_channel, + # g_channel and b_channel + for channel, (y_channel, x_channel) in zip( + pattern, [(0, 0), (0, 1), (1, 0), (1, 1)] + ): + channels[channel][y_channel::2, x_channel::2] = True + + # tuple will return 3 channel boolean pattern for r_channel, + # g_channel and b_channel with True at corresponding value + # For example in rggb pattern, the r_channel mask would then be + # [ [ True, False, True, False], [ False, False, False, False]] + return tuple(channels[c] for c in "rgb") + + def apply_cfa(self): + """ + Demosaicing the given raw image using given algorithm + """ + # 3D masks according to the given bayer + masks = self.masks_cfa_bayer() + mal = MAL(self.img, masks) + demos_out = mal.apply_malvar() + + # Clipping the pixels values within the bit range + demos_out = np.clip(demos_out, 0, 2**self.bit_depth - 1) + demos_out = np.uint16(demos_out) + return demos_out + + def save(self): + """ + Function to save module output + """ + if self.is_save: + save_output_array( + self.platform["in_file"], + self.img, + "Out_demosaic_", + self.platform, + self.sensor_info["bit_depth"], + self.sensor_info["bayer_pattern"], + ) + + def execute(self): + """ + Applying demosaicing to bayer image + """ + print("CFA interpolation (default) = True") + start = time.time() + cfa_out = self.apply_cfa() + print(f" Execution time: {time.time() - start:.3f}s") + self.img = cfa_out + self.save() + return self.img diff --git a/modules/demosaic/malvar_he_cutler.py b/modules/demosaic/malvar_he_cutler.py new file mode 100644 index 0000000..8668aa4 --- /dev/null +++ b/modules/demosaic/malvar_he_cutler.py @@ -0,0 +1,166 @@ +""" +File: malvar_he_cutler.py +Description: Implements the Malvar-He-Cutler algorithm for cfa interpolation +Code / Paper Reference: https://www.ipol.im/pub/art/2011/g_mhcd/article.pdf +Author: 10xEngineers +------------------------------------------------------------ +""" +import numpy as np +from scipy.signal import correlate2d + + +class Malvar: + """ + CFA interpolation or Demosaicing + """ + + def __init__(self, raw_in, masks): + self.img = raw_in + self.masks = masks + + def apply_malvar(self): + """ + Demosaicing the given raw image using Malvar-He-Cutler + """ + # 3D masks accoridng to the given bayer + mask_r, mask_g, mask_b = self.masks + raw_in = np.float32(self.img) + + # Declaring 3D Demosaiced image + demos_out = np.empty((raw_in.shape[0], raw_in.shape[1], 3)) + + # 5x5 2D Filter coefficients for linear interpolation of + # r_channel,g_channel and b_channel channels + # These filters helps to retain corresponding pixels information using + # laplacian while interpolation + + # g_channel at r_channel & b_channel location, + g_at_r_and_b = ( + np.float32( + [ + [0, 0, -1, 0, 0], + [0, 0, 2, 0, 0], + [-1, 2, 4, 2, -1], + [0, 0, 2, 0, 0], + [0, 0, -1, 0, 0], + ] + ) + * 0.125 + ) + + # r_channel at green in r_channel row & b_channel column -- + # b_channel at green in b_channel row & r_channel column + r_at_gr_and_b_at_gb = ( + np.float32( + [ + [0, 0, 0.5, 0, 0], + [0, -1, 0, -1, 0], + [-1, 4, 5, 4, -1], + [0, -1, 0, -1, 0], + [0, 0, 0.5, 0, 0], + ] + ) + * 0.125 + ) + + # r_channel at green in b_channel row & r_channel column -- + # b_channel at green in r_channel row & b_channel column + r_at_gb_and_b_at_gr = np.transpose(r_at_gr_and_b_at_gb) + + # r_channel at blue in b_channel row & b_channel column -- + # b_channel at red in r_channel row & r_channel column + r_at_b_and_b_at_r = ( + np.float32( + [ + [0, 0, -1.5, 0, 0], + [0, 2, 0, 2, 0], + [-1.5, 0, 6, 0, -1.5], + [0, 2, 0, 2, 0], + [0, 0, -1.5, 0, 0], + ] + ) + * 0.125 + ) + + # Creating r_channel, g_channel & b_channel channels from raw_in + r_channel = raw_in * mask_r + g_channel = raw_in * mask_g + b_channel = raw_in * mask_b + + # Creating g_channel channel first after applying g_at_r_and_b filter + g_channel = np.where( + np.logical_or(mask_r == 1, mask_b == 1), + correlate2d(raw_in, g_at_r_and_b, mode="same", boundary="symm"), + g_channel, + ) + + # Applying other linear filters + rb_at_g_rbbr = correlate2d( + raw_in, r_at_gr_and_b_at_gb, mode="same", boundary="symm" + ) + rb_at_g_brrb = correlate2d( + raw_in, r_at_gb_and_b_at_gr, mode="same", boundary="symm" + ) + rb_at_gr_bbrr = correlate2d( + raw_in, r_at_b_and_b_at_r, mode="same", boundary="symm" + ) + + # After convolving the input raw image with rest of the filters, + # now we have the respective interpolated data, now we just have + # to extract the updated pixels values according to the + # position they are meant to be updated + + # Extracting Red rows. + r_rows = np.transpose(np.any(mask_r == 1, axis=1)[np.newaxis]) * np.ones( + r_channel.shape, dtype=np.float32 + ) + + # Extracting Red columns. + r_col = np.any(mask_r == 1, axis=0)[np.newaxis] * np.ones( + r_channel.shape, dtype=np.float32 + ) + + # Extracting Blue rows. + b_rows = np.transpose(np.any(mask_b == 1, axis=1)[np.newaxis]) * np.ones( + b_channel.shape, dtype=np.float32 + ) + + # Extracting Blue columns + b_col = np.any(mask_b == 1, axis=0)[np.newaxis] * np.ones( + b_channel.shape, dtype=np.float32 + ) + + # For R channel we have to update pixels at [r_channel rows + # and b_channel cols] & at [b_channel rows and r_channel cols] + # 3 pixels need to be updated near one given r_channel + r_channel = np.where( + np.logical_and(r_rows == 1, b_col == 1), rb_at_g_rbbr, r_channel + ) + r_channel = np.where( + np.logical_and(b_rows == 1, r_col == 1), rb_at_g_brrb, r_channel + ) + + # Similarly for B channel we have to update pixels at + # [r_channel rows and b_channel cols] + # & at [b_channel rows and r_channel cols] 3 pixels need + # to be updated near one given b_channel + b_channel = np.where( + np.logical_and(b_rows == 1, r_col == 1), rb_at_g_rbbr, b_channel + ) + b_channel = np.where( + np.logical_and(r_rows == 1, b_col == 1), rb_at_g_brrb, b_channel + ) + + # Final r_channel & b_channel channels + r_channel = np.where( + np.logical_and(b_rows == 1, b_col == 1), rb_at_gr_bbrr, r_channel + ) + b_channel = np.where( + np.logical_and(r_rows == 1, r_col == 1), rb_at_gr_bbrr, b_channel + ) + + demos_out[:, :, 0] = r_channel + demos_out[:, :, 1] = g_channel + demos_out[:, :, 2] = b_channel + + return demos_out diff --git a/modules/digital_gain.py b/modules/digital_gain.py deleted file mode 100644 index cccdc62..0000000 --- a/modules/digital_gain.py +++ /dev/null @@ -1,59 +0,0 @@ -# File: digital_gain.py -# Description: Applies the digital gain based on config file also interacts with AE when adjusting exposure -# Code / Paper Reference: -# Author: xx-isp (ispinfinite@gmail.com) -#------------------------------------------------------------ - -import numpy as np - - -class DigitalGain: - 'Digital Gain' - - def __init__(self, img, sensor_info, parm_dga): - self.img = img - #self.enable = parm_dga['isEnable'] - self.debug = parm_dga['isDebug'] - self.gains_array = parm_dga['gain_array'] - self.current_gain = parm_dga['current_gain'] - self.sensor_info = sensor_info - self.param_dga = parm_dga - - - - def apply_digitalGain(self, ae_correction): - - # get desired param from config - bpp = self.sensor_info['bitdep'] - # dg = self.param_dga['dg_gain'] - - #converting to float image - self.img = np.float32(self.img) - - # Gains are applied on the basis of AE-Feedback. - # 'ae_correction == 0' - Default Gain is applied before AE feedback - # 'ae_correction > 0' - Image is overexposed (No action required) - # 'ae_correction < 0' - Image is underexposed - - if ae_correction < 0: - # max/min functions is applied to not allow digital gains exceed the defined limits - self.current_gain = min(len(self.gains_array)-1, self.current_gain+1) - - # Gain_Array is an array of pre-defined digital gains for ISP - self.img = self.gains_array[self.current_gain] * self.img - if self.debug: - print(' - DG - Applied Gain = ', self.gains_array[self.current_gain]) - - #np.uint16 bit to contain the bpp bit raw - self.img = np.uint16(np.clip(self.img, 0, ((2**bpp)-1))) - return self.img - - def execute(self, ae_correction = 0): - print('Digital Gain (default) = True ' ) - - # # If digital gain is disabled return image as it is. - # if self.enable == False: - # return self.img - - # ae_coorection indicated if the gain is default digital gain or AE-correction gain. - return self.apply_digitalGain(ae_correction) diff --git a/modules/digital_gain/digital_gain.py b/modules/digital_gain/digital_gain.py new file mode 100644 index 0000000..05b5757 --- /dev/null +++ b/modules/digital_gain/digital_gain.py @@ -0,0 +1,97 @@ +""" +File: digital_gain.py +Description: Applies the digital gain based on config file also interacts with AE +when adjusting exposure +Code / Paper Reference: +Author: 10xEngineers Pvt Ltd +------------------------------------------------------------ +""" +import time +import numpy as np + +from util.utils import save_output_array + + +class DigitalGain: + """ + Digital Gain + """ + + def __init__(self, img, platform, sensor_info, parm_dga): + self.img = img.copy() + self.is_save = parm_dga["is_save"] + self.is_debug = parm_dga["is_debug"] + self.is_auto = parm_dga["is_auto"] + self.gains_array = parm_dga["gain_array"] + self.current_gain = parm_dga["current_gain"] + self.ae_feedback = parm_dga["ae_feedback"] + self.sensor_info = sensor_info + self.platform = platform + self.param_dga = parm_dga + + def apply_digital_gain(self): + """ + Apply Digital Gain - Provided in config file or + according to AE Feedback + """ + + # get desired param from config + bpp = self.sensor_info["bit_depth"] + # dg = self.param_dga['dg_gain'] + + # converting to float image + self.img = np.float32(self.img) + + # Gains are applied on the basis of AE-Feedback. + # 'ae_correction == 0' - Default Gain is applied before AE feedback + # 'ae_correction > 0' - Image is overexposed + # 'ae_correction < 0' - Image is underexposed + + if self.is_auto: + + if self.ae_feedback < 0: + # max/min functions is applied to not allow digital gains exceed the defined limits + self.current_gain = min( + len(self.gains_array) - 1, self.current_gain + 1 + ) + + elif self.ae_feedback > 0: + self.current_gain = max(0, self.current_gain - 1) + + # Gain_Array is an array of pre-defined digital gains for ISP + self.img = self.gains_array[self.current_gain] * self.img + + if self.is_debug: + print(" - DG - Applied Gain = ", self.gains_array[self.current_gain]) + + # np.uint16 bit to contain the bpp bit raw + self.img = np.uint16(np.clip(self.img, 0, ((2**bpp) - 1))) + return self.img + + def save(self): + """ + Function to save module output + """ + if self.is_save: + save_output_array( + self.platform["in_file"], + self.img, + "Out_digital_gain_", + self.platform, + self.sensor_info["bit_depth"], + self.sensor_info["bayer_pattern"], + ) + + def execute(self): + """ + Execute Digital Gain Module + """ + print("Digital Gain (default) = True ") + + # ae_correction indicated if the gain is default digital gain or AE-correction gain. + start = time.time() + dg_out = self.apply_digital_gain() + print(f" Execution time: {time.time() - start:.3f}s") + self.img = dg_out + self.save() + return self.img, self.current_gain diff --git a/modules/gamma_correction.py b/modules/gamma_correction.py deleted file mode 100644 index 4c355b4..0000000 --- a/modules/gamma_correction.py +++ /dev/null @@ -1,38 +0,0 @@ -# File: gamma_correction.py -# Description: Implements the gamma look up table provided in the config file -# Code / Paper Reference: -# Author: xx-isp (ispinfinite@gmail.com) -#------------------------------------------------------------ - -import numpy as np - - -class GammaCorrection: - 'Gamma Correction' - - def __init__(self, img, sensor_info, parm_gmm): - self.img = img - self.enable = parm_gmm['isEnable'] - self.sensor_info = sensor_info - self.parm_gmm = parm_gmm - - def generate_gamma8bit_LUT(self): - lut = np.linspace(0, 255, 256) - lut = np.uint8(np.round(255 * ((lut/255) ** (1/2.2)))) - return lut - - def apply_gamma(self): - # load gamma uint8 table - lut = np.uint8(np.array(self.parm_gmm['gammaLut'])) - - #apply LUT - gamma_img = lut[self.img] - return gamma_img - - def execute(self): - print('Gamma Correction = ' + str(self.enable)) - - if self.enable == False: - return self.img - else: - return self.apply_gamma() diff --git a/modules/gamma_correction/gamma_correction.py b/modules/gamma_correction/gamma_correction.py new file mode 100644 index 0000000..37375a8 --- /dev/null +++ b/modules/gamma_correction/gamma_correction.py @@ -0,0 +1,82 @@ +""" +File: gamma_correction.py +Description: Implements the gamma look up table provided in the config file +Code / Paper Reference: +Author: 10xEngineers Pvt Ltd +------------------------------------------------------------ +""" +import time +import numpy as np + +from util.utils import save_output_array + + +class GammaCorrection: + """ + Gamma Correction + """ + + def __init__(self, img, platform, sensor_info, parm_gmm): + self.img = img + self.enable = parm_gmm["is_enable"] + self.sensor_info = sensor_info + self.bit_depth = sensor_info["bit_depth"] + self.parm_gmm = parm_gmm + self.is_save = parm_gmm["is_save"] + self.platform = platform + + def generate_gamma_8bit_lut(self): + """ + Generates Gamma LUT for 8bit Image + """ + lut = np.linspace(0, 255, 256) + lut = np.uint8(np.round(255 * ((lut / 255) ** (1 / 2.2)))) + return lut + + def apply_gamma(self): + """ + Apply Gamma LUT on n-bit Image + """ + # load gamma table + if self.bit_depth == 8: + lut = np.uint16(np.array(self.parm_gmm["gamma_lut_8"])) + elif self.bit_depth == 10: + lut = np.uint16(np.array(self.parm_gmm["gamma_lut_10"])) + elif self.bit_depth == 12: + lut = np.uint16(np.array(self.parm_gmm["gamma_lut_12"])) + elif self.bit_depth == 14: + lut = np.uint16(np.array(self.parm_gmm["gamma_lut_14"])) + else: + print("LUT is not available for the given bit depth.") + + # apply LUT + gamma_img = lut[self.img] + return gamma_img + + def save(self): + """ + Function to save module output + """ + if self.is_save: + save_output_array( + self.platform["in_file"], + self.img, + "Out_gamma_correction_", + self.platform, + self.sensor_info["bit_depth"], + self.sensor_info["bayer_pattern"], + ) + + def execute(self): + """ + Exceute Gamma Correction + """ + print("Gamma Correction = " + str(self.enable)) + if self.enable is True: + start = time.time() + gc_out = self.apply_gamma() + print(f" Execution time: {time.time() - start:.3f}s") + self.img = gc_out + + self.save() + return self.img diff --git a/modules/hdr_stitching.py b/modules/hdr_stitching.py deleted file mode 100644 index 82d27a0..0000000 --- a/modules/hdr_stitching.py +++ /dev/null @@ -1,26 +0,0 @@ -# File: hdr_stitching.py -# Description: -# Code / Paper Reference: -# Author: xx-isp (ispinfinite@gmail.com) -#------------------------------------------------------------ - -import numpy as np - -class HdrStitching: - 'HDR Stitching' - def __init__(self, img, sensor_info, parm_hdr): - self.img = img - self.enable = parm_hdr['isEnable'] - self.sensor_info = sensor_info - self.parm_hdr = parm_hdr - - def execute(self): - print('HDR Stitching = ' + str(self.enable)) - - if self.enable == False: - - return self.img - else: - - # Write here - return self.img \ No newline at end of file diff --git a/modules/ldci.py b/modules/ldci.py deleted file mode 100644 index 4be89db..0000000 --- a/modules/ldci.py +++ /dev/null @@ -1,260 +0,0 @@ -# File: ldci.py -# Description: Implements the contrast adjustment in the YUV domain -# Code / Paper Reference: https://arxiv.org/ftp/arxiv/papers/2108/2108.12818.pdf#:~:text=The%20technique%20to%20equalize%20the,a%20linear%20trend%20(CDF). -# Implementation inspired from: MATLAB & -# Fast Open ISP Author: Qiu Jueqin (qiujueqin@gmail.com) -# Author: xx-isp (ispinfinite@gmail.com) -#------------------------------------------------------------ - -import numpy as np -import math - -class LDCI: - 'Local Dynamic Contrast Enhancement' - - def __init__(self, YUV, sensor_info, parm_ldci): - self.YUV = YUV - self.enable = parm_ldci['isEnable'] - self.sensor_info = sensor_info - self.wind = parm_ldci['wind'] - self.clip_limit = parm_ldci['clip_limit'] - - def pad_array(self, array, pads, mode='reflect'): - - # -------Pad an array with the given margins on left, right, top and bottom-------- - if isinstance(pads, (list, tuple, np.ndarray)): - if len(pads) == 2: - pads = ((pads[0], pads[0]), (pads[1], pads[1])) + ((0, 0),) * (array.ndim - 2) - elif len(pads) == 4: - pads = ((pads[0], pads[1]), (pads[2], pads[3])) + ((0, 0),) * (array.ndim - 2) - else: - raise NotImplementedError - - return np.pad(array, pads, mode) - - def crop(self, array, crops): - - # ---------crop an array within the given margins----------- - if isinstance(crops, (list, tuple, np.ndarray)): - if len(crops) == 2: - top_crop = bottom_crop = crops[0] - left_crop = right_crop = crops[1] - elif len(crops) == 4: - top_crop, bottom_crop, left_crop, right_crop = crops - else: - raise NotImplementedError - else: - top_crop = bottom_crop = left_crop = right_crop = crops - - height, width = array.shape[:2] - return array[top_crop: height - bottom_crop, left_crop: width - right_crop, ...] - - def get_tile_lut(self, tiled_array): - - # ---------generating LUT using histogram equalization---- - - # Computing histograms--hist will have bincounts - hist, bins = np.histogram(tiled_array, bins=256, range=(0, 255)) - clip_limit = self.clip_limit - - # Clipping each bin counts within the range of window size to avoid artifacts - # Applying a check to keep the clipping limit within the appropriate range - if clip_limit >= self.wind: - clip_limit = 0.08*self.wind - - clipped_hist = np.clip(hist, 0, clip_limit) - num_clipped_pixels = (hist - clipped_hist).sum() - - # Adding clipped pixels to each bin and getting its sum for normalization - hist = clipped_hist + num_clipped_pixels / 256 + 1 - pdf = hist / hist.sum() - cdf = np.cumsum(pdf) - - # Computing cdf and getting the LUT for the array - LUT = (cdf * 255).astype(np.uint8) - - return LUT - - def interp_blocks(self, weights, block, first_block_lut, second_block_lut): - - # alpha blending = weights - first = weights * first_block_lut[block].astype(np.int32) - second = (1024 - weights) * second_block_lut[block].astype(np.int32) - - # Interpolating both the LUTs - return np.right_shift(first + second, 10).astype(np.uint8) - - def interp_top_bottom_block(self, left_lut_weights, block, left_lut, current_lut): - - # ---------interpolating blocks present at top and bottom of the arrays----- - return self.interp_blocks(left_lut_weights, block, left_lut, current_lut ) - - - def interp_left_right_block(self, top_lut_weights, block, top_lut, current_lut): - - return self.interp_blocks(top_lut_weights, block, top_lut, current_lut ) - - - def interp_neighbor_block(self, left_lut_weights, top_lut_weights, block, tl_lut, top_lut, left_lut, current_lut): - - # ---------interpolating blocks present in the middle of the arrays----- - interp_top_blocks = self.interp_blocks(left_lut_weights, block, tl_lut, top_lut) - interp_current_blocks = self.interp_blocks(left_lut_weights, block, left_lut, current_lut) - - interp_final = np.right_shift(top_lut_weights * interp_top_blocks + (1024 - top_lut_weights) * interp_current_blocks, 10).astype(np.uint8) - return interp_final - - - def is_corner_block(self, x_tiles, y_tiles, i_col, i_row): - - #----Checking if the current image block is locating in a corner region """ - return ((i_row == 0 and i_col == 0) or - (i_row == 0 and i_col == x_tiles) or - (i_row == y_tiles and i_col == 0) or - (i_row == y_tiles and i_col == x_tiles)) - - def is_top_or_bottom_block(self, x_tiles, y_tiles, i_col, i_row): - - #------Checking if the current image block is locating in teh top or bottom region - return (i_row == 0 or i_row == y_tiles) and not self.is_corner_block(x_tiles, y_tiles, i_col, i_row) - - def is_left_or_right_block(self, x_tiles, y_tiles, i_col, i_row): - - # ----- Checking if the current image block is locating in the left or right region - return (i_col == 0 or i_col == x_tiles) and not self.is_corner_block(x_tiles, y_tiles, i_col, i_row) - - def apply_ldci(self): - - # ----------applying LDCI module to the given image------- - w = self.wind - in_YUV = self.YUV - - # Extracting Luminance channel from YUV as LDCI will be applied to Y channel only - - YUV = in_YUV[:, :, 0] - img_height, img_width = YUV.shape - - # pipeline specific: if input is in analog yuv - if(in_YUV.dtype == 'float32'): - YUV = np.round(255*YUV).astype(np.uint8) - - # output clipped equalized histogram - out_CEH = np.empty(shape=(img_height, img_width, 3), dtype=np.uint8) - - # computing number of tiles (tiles = block = window). - vert_tiles = math.ceil(img_height / w) - horiz_tiles = math.ceil(img_width / w) - tile_height = w - tile_width = w - - # Computing number of columns and rows to be padded in the image for getting proper block/tile - row_pads = tile_height * vert_tiles - img_height - col_pads = tile_width * horiz_tiles - img_width - pads = (row_pads // 2, row_pads - row_pads // 2, col_pads // 2, col_pads - col_pads // 2) - - # Assigning linearized LUT weights to top and left blocks - left_lut_weights = np.linspace(1024, 0, tile_width, dtype=np.int32).reshape((1, -1)) - top_lut_weights = np.linspace(1024, 0, tile_height, dtype=np.int32).reshape((-1, 1)) - - # Declaring an empty 3D (x,y,z) array of LUTs for each tile, where x,y are - # the coordinates of the tile and z a linear array of 256 - luts = np.empty(shape=(vert_tiles, horiz_tiles, 256), dtype=np.uint8) - - # Creating a copy of YUV image - Y_padded = YUV - Y_padded = self.pad_array(Y_padded, pads=pads) - - # for loops for getting LUT for each tile (row wise iterations) - for rows in range(vert_tiles): - for colm in range(horiz_tiles): - # Extracting tile - start_row = rows * tile_height - end_row = (rows + 1) * tile_height - start_col = colm * tile_width - end_col = (colm + 1) * tile_width - - # Extracting each tile - Y_tile = Y_padded[start_row : end_row , start_col : end_col] - - # Getting LUT for each tile using HE - luts[rows, colm] = self.get_tile_lut(Y_tile) - - # Declaring an empty array for output array after padding is done - Y_ceh = np.empty_like(Y_padded) - - # For loops for processing image array tile by tile - for i_row in range(vert_tiles + 1): - for i_col in range(horiz_tiles + 1): - - # Extracting tile/block - start_row_index = i_row * tile_height - tile_height // 2 - end_row_index = min(start_row_index + tile_height, Y_padded.shape[0]) - start_col_index = i_col * tile_width - tile_width // 2 - end_col_index = min(start_col_index + tile_width, Y_padded.shape[1]) - start_row_index = max(start_row_index, 0) - start_col_index = max(start_col_index, 0) - - # Extracting the tile for processing - y_block = (Y_padded[start_row_index:end_row_index, start_col_index:end_col_index]).astype(np.uint8) # tile/block - - # checking the position of the block and applying interpolation accordingly - if self.is_corner_block(horiz_tiles, vert_tiles, i_col, i_row): - - # if the block is present at the corner, no need of interpolation, just apply the LUT - lut_y_idx = 0 if i_row == 0 else vert_tiles - 1 - lut_x_idx = 0 if i_col == 0 else horiz_tiles - 1 - lut = luts[lut_y_idx, lut_x_idx] - Y_ceh[start_row_index:end_row_index, start_col_index:end_col_index] = (lut[y_block]).astype(np.float32) - - elif self.is_top_or_bottom_block(horiz_tiles, vert_tiles, i_col, i_row): - - # if the block is present at the top or bottom region, current block is updated after - # interpolating with its left block - lut_y_idx = 0 if i_row == 0 else vert_tiles - 1 - left_lut = luts[lut_y_idx, i_col - 1] - current_lut = luts[lut_y_idx, i_col] - Y_ceh[start_row_index:end_row_index, start_col_index:end_col_index] = ((self.interp_top_bottom_block(left_lut_weights, y_block, left_lut, - current_lut))).astype(np.float32) - - elif self.is_left_or_right_block(horiz_tiles, vert_tiles, i_col, i_row): - - # if the block is present at the left or right region, current block is updated after - # interpolating with its top block - lut_x_idx = 0 if i_col == 0 else horiz_tiles - 1 - top_lut = luts[i_row - 1, lut_x_idx] - current_lut = luts[i_row, lut_x_idx] - Y_ceh[start_row_index:end_row_index, start_col_index:end_col_index] = ( - (self.interp_left_right_block(top_lut_weights, y_block, top_lut, current_lut))).astype( - np.float32) - - else: - # check to see if the block is present in the middle region of the image - # the block needs to be updated after getting interpolated with its neighboring blocks - tl_lut = luts[i_row - 1, i_col - 1] - top_lut = luts[i_row - 1, i_col] - left_lut = luts[i_row, i_col - 1] - current_lut = luts[i_row, i_col] - Y_ceh[start_row_index:end_row_index, start_col_index:end_col_index] = ( - (self.interp_neighbor_block(left_lut_weights, top_lut_weights, y_block, tl_lut, - top_lut, left_lut, current_lut))).astype(np.float32) - - Y_padded = self.crop(Y_ceh, pads) - - # pipeline specific: if input is in analog yuv - if(in_YUV.dtype == 'float32'): - Y_padded = np.float32((Y_padded) / 255.0) - out_CEH = out_CEH.astype('float32') - - out_CEH[:, :, 0] = Y_padded - out_CEH[:, :, 1] = in_YUV[:, :, 1] - out_CEH[:, :, 2] = in_YUV[:, :, 2] - - return out_CEH - - def execute(self): - print('LDCI = ' + str(self.enable)) - - if self.enable == False: - return self.YUV - else: - return self.apply_ldci() \ No newline at end of file diff --git a/modules/ldci/clahe.py b/modules/ldci/clahe.py new file mode 100644 index 0000000..9f9752f --- /dev/null +++ b/modules/ldci/clahe.py @@ -0,0 +1,345 @@ +""" +File: clahe.py +Description: Implements the contrast adjustment using contrast limited adaptive +histogram equalization (CLAHE) approach. +Code / Paper Reference: +https://arxiv.org/ftp/arxiv/papers/2108/2108.12818.pdf#:~:text +=The%20technique%20to%20equalize%20the,a%20linear%20trend%20(CDF). +Implementation inspired from: MATLAB & +Fast Open ISP Author: Qiu Jueqin (qiujueqin@gmail.com) +Author: x10xEngineers +------------------------------------------------------------ +""" +import math +import numpy as np + + +class CLAHE: + """ + Contrast Limited Adaptive Histogram Equalization + """ + + def __init__(self, yuv, platform, sensor_info, parm_ldci): + self.yuv = yuv + self.img = yuv + self.enable = parm_ldci["is_enable"] + self.sensor_info = sensor_info + self.wind = parm_ldci["wind"] + self.clip_limit = parm_ldci["clip_limit"] + self.is_save = parm_ldci["is_save"] + self.platform = platform + + def pad_array(self, array, pads, mode="reflect"): + """ + Pad an array with the given margins on left, right, top and bottom + """ + if isinstance(pads, (list, tuple, np.ndarray)): + if len(pads) == 2: + pads = ((pads[0], pads[0]), (pads[1], pads[1])) + ((0, 0),) * ( + array.ndim - 2 + ) + elif len(pads) == 4: + pads = ((pads[0], pads[1]), (pads[2], pads[3])) + ((0, 0),) * ( + array.ndim - 2 + ) + else: + raise NotImplementedError + + return np.pad(array, pads, mode) + + def crop(self, array, crops): + """ + Crop an array within the given margins + """ + if isinstance(crops, (list, tuple, np.ndarray)): + if len(crops) == 2: + top_crop = bottom_crop = crops[0] + left_crop = right_crop = crops[1] + elif len(crops) == 4: + top_crop, bottom_crop, left_crop, right_crop = crops + else: + raise NotImplementedError + else: + top_crop = bottom_crop = left_crop = right_crop = crops + + height, width = array.shape[:2] + return array[ + top_crop : height - bottom_crop, left_crop : width - right_crop, ... + ] + + def get_tile_lut(self, tiled_array): + """ + Generating LUT using histogram equalization + """ + # Computing histograms--hist will have bincounts + hist, _ = np.histogram(tiled_array, bins=256, range=(0, 255)) + clip_limit = self.clip_limit + + # Clipping each bin counts within the range of window size to avoid artifacts + # Applying a check to keep the clipping limit within the appropriate range + if clip_limit >= self.wind: + clip_limit = 0.08 * self.wind + + clipped_hist = np.clip(hist, 0, clip_limit) + num_clipped_pixels = (hist - clipped_hist).sum() + + # Adding clipped pixels to each bin and getting its sum for normalization + hist = clipped_hist + num_clipped_pixels / 256 + 1 + pdf = hist / hist.sum() + cdf = np.cumsum(pdf) + + # Computing cdf and getting the LUT for the array + look_up_table = (cdf * 255).astype(np.uint8) + + return look_up_table + + def interp_blocks(self, weights, block, first_block_lut, second_block_lut): + """ + Interpolating blocks using alpha blending weights + """ + # alpha blending = weights + first = weights * first_block_lut[block].astype(np.int32) + second = (1024 - weights) * second_block_lut[block].astype(np.int32) + + # Interpolating both the LUTs + return np.right_shift(first + second, 10).astype(np.uint8) + + def interp_top_bottom_block(self, left_lut_weights, block, left_lut, current_lut): + """ + Interpolating blocks present at top and bottom of the arrays + """ + return self.interp_blocks(left_lut_weights, block, left_lut, current_lut) + + def interp_left_right_block(self, top_lut_weights, block, top_lut, current_lut): + """ + Interpolating blocks present at left and right of the arrays + """ + return self.interp_blocks(top_lut_weights, block, top_lut, current_lut) + + def interp_neighbor_block( + self, + left_lut_weights, + top_lut_weights, + block, + tl_lut, + top_lut, + left_lut, + current_lut, + ): + """ + Interpolating blocks present in the middle of the arrays + """ + interp_top_blocks = self.interp_blocks(left_lut_weights, block, tl_lut, top_lut) + interp_current_blocks = self.interp_blocks( + left_lut_weights, block, left_lut, current_lut + ) + + interp_final = np.right_shift( + top_lut_weights * interp_top_blocks + + (1024 - top_lut_weights) * interp_current_blocks, + 10, + ).astype(np.uint8) + return interp_final + + def is_corner_block(self, x_tiles, y_tiles, i_col, i_row): + """ + Checking if the current image block is locating in a corner region + """ + return ( + (i_row == 0 and i_col == 0) + or (i_row == 0 and i_col == x_tiles) + or (i_row == y_tiles and i_col == 0) + or (i_row == y_tiles and i_col == x_tiles) + ) + + def is_top_or_bottom_block(self, x_tiles, y_tiles, i_col, i_row): + """ + Checking if the current image block is locating in teh top or bottom region + """ + return (i_row == 0 or i_row == y_tiles) and not self.is_corner_block( + x_tiles, y_tiles, i_col, i_row + ) + + def is_left_or_right_block(self, x_tiles, y_tiles, i_col, i_row): + """ + Checking if the current image block is locating in the left or right region + """ + return (i_col == 0 or i_col == x_tiles) and not self.is_corner_block( + x_tiles, y_tiles, i_col, i_row + ) + + def apply_clahe(self): + """ + Applying clahe algorithm for contrast enhancement + """ + wind = self.wind + in_yuv = self.yuv + + # Extracting Luminance channel from yuv as LDCI will be applied to Y channel only + + yuv = in_yuv[:, :, 0] + img_height, img_width = yuv.shape + + # pipeline specific: if input is in analog yuv + if in_yuv.dtype == "float32": + yuv = np.round(255 * yuv).astype(np.uint8) + + # output clipped equalized histogram + out_ceh = np.empty(shape=(img_height, img_width, 3), dtype=np.uint8) + + # computing number of tiles (tiles = block = window). + vert_tiles = math.ceil(img_height / wind) + horiz_tiles = math.ceil(img_width / wind) + tile_height = wind + tile_width = wind + + # Computing number of columns and rows to be padded in the image + # for getting proper block/tile + row_pads = tile_height * vert_tiles - img_height + col_pads = tile_width * horiz_tiles - img_width + pads = ( + row_pads // 2, + row_pads - row_pads // 2, + col_pads // 2, + col_pads - col_pads // 2, + ) + + # Assigning linearized LUT weights to top and left blocks + left_lut_weights = np.linspace(1024, 0, tile_width, dtype=np.int32).reshape( + (1, -1) + ) + top_lut_weights = np.linspace(1024, 0, tile_height, dtype=np.int32).reshape( + (-1, 1) + ) + + # Declaring an empty 3D (x,y,z) array of LUTs for each tile, where x,y are + # the coordinates of the tile and z a linear array of 256 + luts = np.empty(shape=(vert_tiles, horiz_tiles, 256), dtype=np.uint8) + + # Creating a copy of yuv image + y_padded = yuv + y_padded = self.pad_array(y_padded, pads=pads) + + # for loops for getting LUT for each tile (row wise iterations) + for rows in range(vert_tiles): + for colm in range(horiz_tiles): + # Extracting tile + start_row = rows * tile_height + end_row = (rows + 1) * tile_height + start_col = colm * tile_width + end_col = (colm + 1) * tile_width + + # Extracting each tile + y_tile = y_padded[start_row:end_row, start_col:end_col] + + # Getting LUT for each tile using HE + luts[rows, colm] = self.get_tile_lut(y_tile) + + # Declaring an empty array for output array after padding is done + y_ceh = np.empty_like(y_padded) + + # For loops for processing image array tile by tile + for i_row in range(vert_tiles + 1): + for i_col in range(horiz_tiles + 1): + # Extracting tile/block + start_row_index = i_row * tile_height - tile_height // 2 + end_row_index = min(start_row_index + tile_height, y_padded.shape[0]) + start_col_index = i_col * tile_width - tile_width // 2 + end_col_index = min(start_col_index + tile_width, y_padded.shape[1]) + start_row_index = max(start_row_index, 0) + start_col_index = max(start_col_index, 0) + + # Extracting the tile for processing + y_block = ( + y_padded[ + start_row_index:end_row_index, start_col_index:end_col_index + ] + ).astype( + np.uint8 + ) # tile/block + + # checking the position of the block and applying interpolation accordingly + if self.is_corner_block(horiz_tiles, vert_tiles, i_col, i_row): + # if the block is present at the corner, no need of interpolation, + # just apply the LUT + lut_y_idx = 0 if i_row == 0 else vert_tiles - 1 + lut_x_idx = 0 if i_col == 0 else horiz_tiles - 1 + lut = luts[lut_y_idx, lut_x_idx] + y_ceh[ + start_row_index:end_row_index, start_col_index:end_col_index + ] = (lut[y_block]).astype(np.float32) + + elif self.is_top_or_bottom_block(horiz_tiles, vert_tiles, i_col, i_row): + # if the block is present at the top or bottom region, + # current block is updated after interpolating with its left block + lut_y_idx = 0 if i_row == 0 else vert_tiles - 1 + left_lut = luts[lut_y_idx, i_col - 1] + current_lut = luts[lut_y_idx, i_col] + y_ceh[ + start_row_index:end_row_index, start_col_index:end_col_index + ] = ( + ( + self.interp_top_bottom_block( + left_lut_weights, y_block, left_lut, current_lut + ) + ) + ).astype( + np.float32 + ) + + elif self.is_left_or_right_block(horiz_tiles, vert_tiles, i_col, i_row): + # if the block is present at the left or right region, current block is + # updated after interpolating with its top block + lut_x_idx = 0 if i_col == 0 else horiz_tiles - 1 + top_lut = luts[i_row - 1, lut_x_idx] + current_lut = luts[i_row, lut_x_idx] + y_ceh[ + start_row_index:end_row_index, start_col_index:end_col_index + ] = ( + ( + self.interp_left_right_block( + top_lut_weights, y_block, top_lut, current_lut + ) + ) + ).astype( + np.float32 + ) + + else: + # check to see if the block is present in the middle region of the image + # the block needs to be updated after getting interpolated with its + # neighboring blocks + tl_lut = luts[i_row - 1, i_col - 1] + top_lut = luts[i_row - 1, i_col] + left_lut = luts[i_row, i_col - 1] + current_lut = luts[i_row, i_col] + y_ceh[ + start_row_index:end_row_index, start_col_index:end_col_index + ] = ( + ( + self.interp_neighbor_block( + left_lut_weights, + top_lut_weights, + y_block, + tl_lut, + top_lut, + left_lut, + current_lut, + ) + ) + ).astype( + np.float32 + ) + + y_padded = self.crop(y_ceh, pads) + + # pipeline specific: if input is in analog yuv + if in_yuv.dtype == "float32": + y_padded = np.float32((y_padded) / 255.0) + out_ceh = out_ceh.astype("float32") + + out_ceh[:, :, 0] = y_padded + out_ceh[:, :, 1] = in_yuv[:, :, 1] + out_ceh[:, :, 2] = in_yuv[:, :, 2] + + return out_ceh diff --git a/modules/ldci/ldci.py b/modules/ldci/ldci.py new file mode 100644 index 0000000..6b61b17 --- /dev/null +++ b/modules/ldci/ldci.py @@ -0,0 +1,62 @@ +""" +File: ldci.py +Description: Implements the contrast adjustment in the yuv domain +Author: 10xEngineers +------------------------------------------------------------ +""" +import time +from util.utils import save_output_array_yuv +from modules.ldci.clahe import CLAHE + + +class LDCI: + """ + Local Dynamic Contrast Enhancement + """ + + def __init__(self, yuv, platform, sensor_info, parm_ldci, conv_std): + self.yuv = yuv + self.img = yuv + self.enable = parm_ldci["is_enable"] + self.sensor_info = sensor_info + self.parm_ldci = parm_ldci + self.is_save = parm_ldci["is_save"] + self.platform = platform + self.conv_std = conv_std + + def apply_ldci(self): + """ + Applying LDCI module to the given image + """ + clahe = CLAHE(self.yuv, self.platform, self.sensor_info, self.parm_ldci) + out_ceh = clahe.apply_clahe() + + return out_ceh + + def save(self): + """ + Function to save module output + """ + if self.is_save: + save_output_array_yuv( + self.platform["in_file"], + self.img, + "Out_ldci_", + self.platform, + self.conv_std, + ) + + def execute(self): + """ + Executing LDCI module according to user choice + """ + print("LDCI = " + str(self.enable)) + + if self.enable is True: + start = time.time() + s_out = self.apply_ldci() + print(f" Execution time: {time.time() - start:.3f}s") + self.img = s_out + + self.save() + return self.img diff --git a/modules/lens_shading_correction.py b/modules/lens_shading_correction.py deleted file mode 100644 index bcec7fd..0000000 --- a/modules/lens_shading_correction.py +++ /dev/null @@ -1,25 +0,0 @@ -# File: lens_shading_correction.py -# Description: -# Code / Paper Reference: -# Author: xx-isp (ispinfinite@gmail.com) -#------------------------------------------------------------ - -import numpy as np - - -class LensShadingCorrection: - 'Lens Shading Correction' - - def __init__(self, img, sensor_info, parm_lsc): - self.img = img - self.enable = parm_lsc['isEnable'] - self.sensor_info = sensor_info - self.parm_lsc = parm_lsc - - def execute(self): - print('Lens Shading Correction = ' + str(self.enable)) - - if self.enable == False: - return self.img - else: - return self.img diff --git a/modules/lens_shading_correction/lens_shading_correction.py b/modules/lens_shading_correction/lens_shading_correction.py new file mode 100644 index 0000000..9af9a93 --- /dev/null +++ b/modules/lens_shading_correction/lens_shading_correction.py @@ -0,0 +1,31 @@ +""" +File: lens_shading_correction.py +Description: +Code / Paper Reference: +Author: 10xEngineers Pvt Ltd +------------------------------------------------------------ +""" + + +class LensShadingCorrection: + """ + Lens Shading Correction + """ + + def __init__(self, img, platform, sensor_info, parm_lsc): + self.img = img + self.enable = parm_lsc["is_enable"] + self.sensor_info = sensor_info + self.parm_lsc = parm_lsc + self.platform = platform + + def execute(self): + """ + Execute Lens Shading Correction + """ + print("Lens Shading Correction = " + str(self.enable)) + + if self.enable: + return self.img + else: + return self.img diff --git a/modules/noise_reduction_2d.py b/modules/noise_reduction_2d.py deleted file mode 100644 index c946783..0000000 --- a/modules/noise_reduction_2d.py +++ /dev/null @@ -1,122 +0,0 @@ -# File: noise_reduction_2d.py -# Description: -# Code / Paper Reference: https://www.ipol.im/pub/art/2011/bcm_nlm/article.pdf -# Implementation inspired from: -# Fast Open ISP Author: Qiu Jueqin (qiujueqin@gmail.com) -# & scikit-image (nl_means_denoising) -# Author: xx-isp (ispinfinite@gmail.com) -#------------------------------------------------------------ - -import numpy as np -from tqdm import tqdm - -class NoiseReduction2d: - def __init__(self, img, sensor_info, parm_2dnr, platform): - self.img = img - self.enable = parm_2dnr['isEnable'] - self.sensor_info = sensor_info - self.parm_2dnr = parm_2dnr - self.is_progress = platform['disable_progress_bar'] - self.is_leave = platform['leave_pbar_string'] - - def get_weights(self): - # h is the strength parameter to assign weights to the similar pixels in the image - h = self.parm_2dnr['h'] - - # Avoiding division by zero - if h <= 0: - h = 1 - - # The similarity between pixels is compared on the bases of the Euclidean distance between them - distance = np.arange(255 ** 2) - lut = np.exp(-distance / h ** 2) * 1024 - - return lut.astype(np.int32) - - def apply_2DNR(self): - # Input YUV image - in_image = self.img - - # Search window and patch sizes - window_size = self.parm_2dnr['window_size'] - patch_size = self.parm_2dnr['patch_size'] - - # Patch size should be odd - if patch_size % 2 == 0: - patch_size = patch_size+1 - print(' -Making patch size odd: ', patch_size) - - # Extracting Y channel to apply the 2DNR module - Y_in = in_image[:, :, 0] - - if (in_image.dtype == 'float32'): - Y_in = np.round(255 * Y_in).astype(np.uint8) - - # Declaring empty array for output image after denoising - denoised_out = np.empty(in_image.shape, dtype=np.uint8) - - # Padding the Y_in - pads = window_size // 2 - padded_Y_in = np.pad(Y_in, pads, mode='reflect') - - # Decalaration of denoised Y channel and weights - denoised_Y_channel = np.zeros(Y_in.shape) - final_weights = np.zeros(Y_in.shape) - - # Generating LUT weighs based on euclidean distance between intensities - # Assigning weights to similar pixels in descending order (most similar will have the largest weight_for_each_shifted_array) - weights_LUT = self.get_weights() - - - for i in tqdm(range(window_size), disable=self.is_progress, leave=self.is_leave ): - for j in range(window_size): - # Creating arrays starting from pixels according to the search window -- - # There will N = search_window*search_window stacked arrays of input image size - array_for_each_pixel_in_sw = np.int32(padded_Y_in[i:i + Y_in.shape[0], j:j + Y_in.shape[1], ...]) - - # Finding euclidean distance between pixels based on their intensities & applying mean filter - euc_distance = (Y_in - array_for_each_pixel_in_sw) ** 2 - distance = self.apply_mean_filter(euc_distance, patch_size=patch_size) - - # Assigning weights to the pixels based on their distance (most similar will have largest weight) - weight_for_each_shifted_array = weights_LUT[distance] - - # Adding up all the weighted similar pixels - denoised_Y_channel += array_for_each_pixel_in_sw * weight_for_each_shifted_array - - # Adding up all the weights for final mean values at each pixel location - final_weights += weight_for_each_shifted_array - - # Averaging out all the pixel - denoised_Y_channel = denoised_Y_channel / final_weights - - if(in_image.dtype == 'float32'): - denoised_Y_channel = np.float32((denoised_Y_channel) / 255.0) - denoised_out = denoised_out.astype('float32') - - # Reconstructing the final output - denoised_out[:, :, 0] = denoised_Y_channel - denoised_out[:, :, 1] = in_image[:, :, 1] - denoised_out[:, :, 2] = in_image[:, :, 2] - - return denoised_out - - def apply_mean_filter(self, array, patch_size): - # Applying mean filter on the given array - padded_array = np.pad(array, patch_size // 2, mode='reflect') - summed_up_arrays = np.zeros([array.shape[0], array.shape[1]]) - - for i in range(patch_size): - for j in range(patch_size): - summed_up_arrays += np.int32(padded_array[i:i + array.shape[0], j:j + array.shape[1], ...]) - - output_mean_filtered = ((summed_up_arrays) / patch_size ** 2).astype(array.dtype) - return output_mean_filtered - - def execute(self): - print('Noise Reduction 2d = ' + str(self.enable)) - - if self.enable == False: - return self.img - else: - return self.apply_2DNR() diff --git a/modules/noise_reduction_2d/noise_reduction_2d.py b/modules/noise_reduction_2d/noise_reduction_2d.py new file mode 100644 index 0000000..9ab8b1c --- /dev/null +++ b/modules/noise_reduction_2d/noise_reduction_2d.py @@ -0,0 +1,61 @@ +""" +File: noise_reduction_2d.py +Description: Apply denoising algorithms on luminance channel +Author: 10xEngineers +------------------------------------------------------------ +""" +import time +from util.utils import save_output_array_yuv +from modules.noise_reduction_2d.non_local_means import NLM + + +class NoiseReduction2d: + """ + 2D Noise Reduction + """ + + def __init__(self, img, sensor_info, parm_2dnr, platform, conv_std): + self.img = img + self.enable = parm_2dnr["is_enable"] + self.sensor_info = sensor_info + self.parm_2dnr = parm_2dnr + self.conv_std = conv_std + self.is_progress = platform["disable_progress_bar"] + self.is_leave = platform["leave_pbar_string"] + self.is_save = parm_2dnr["is_save"] + self.platform = platform + + def apply_2dnr(self): + """ + Applying noise reduction algorithms (EBF, NLM, Mean, BF) + """ + nlm = NLM(self.img, self.sensor_info, self.parm_2dnr, self.platform) + return nlm.apply_nlm() + + def save(self): + """ + Function to save module output + """ + if self.is_save: + save_output_array_yuv( + self.platform["in_file"], + self.img, + "Out_2d_noise_reduction_", + self.platform, + self.conv_std, + ) + + def execute(self): + """ + Executing 2D noise reduction module + """ + print("Noise Reduction 2d = " + str(self.enable)) + + if self.enable is True: + start = time.time() + s_out = self.apply_2dnr() + print(f" Execution time: {time.time() - start:.3f}s") + self.img = s_out + + self.save() + return self.img diff --git a/modules/noise_reduction_2d/non_local_means.py b/modules/noise_reduction_2d/non_local_means.py new file mode 100644 index 0000000..0c3185d --- /dev/null +++ b/modules/noise_reduction_2d/non_local_means.py @@ -0,0 +1,145 @@ +""" +File: non_local_,means.py +Description: Denoise the image usi9ng non local means filter +Code / Paper Reference: https://www.ipol.im/pub/art/2011/bcm_nlm/article.pdf +Implementation inspired from: +Fast Open ISP Author: Qiu Jueqin (qiujueqin@gmail.com) +& scikit-image (nl_means_denoising) +Author: 10xEngineers +------------------------------------------------------------ +""" +import numpy as np +from tqdm import tqdm + + +class NLM: + """ + Non local means filter for noise reduction + """ + + def __init__(self, img, sensor_info, parm_2dnr, platform): + self.img = img + self.sensor_info = sensor_info + self.parm_2dnr = parm_2dnr + self.platform = platform + self.is_progress = platform["disable_progress_bar"] + self.is_leave = platform["leave_pbar_string"] + + def get_weights(self): + """ + Applying weights + """ + # wts is the strength parameter to assign weights to the similar + # pixels in the image + wts = self.parm_2dnr["wts"] + + # Avoiding division by zero + if wts <= 0: + wts = 1 + + # The similarity between pixels is compared on the bases of the + # Euclidean distance between them + distance = np.arange(255**2) + lut = np.exp(-distance / wts**2) * 1024 + + return lut.astype(np.int32) + + def apply_nlm(self): + """ + Applying Non-local Means Filter + """ + # Input YUV image + in_image = self.img + + # Search window and patch sizes + window_size = self.parm_2dnr["window_size"] + patch_size = self.parm_2dnr["patch_size"] + + # Patch size should be odd + if patch_size % 2 == 0: + patch_size = patch_size + 1 + print(" -Making patch size odd: ", patch_size) + + # Extracting Y channel to apply the 2DNR module + input_image = in_image[:, :, 0] + + if in_image.dtype == "float32": + input_image = np.round(255 * input_image).astype(np.uint8) + + # Declaring empty array for output image after denoising + denoised_out = np.empty(in_image.shape, dtype=np.uint8) + + # Padding the input_image + pads = window_size // 2 + wtspadded_y_in = np.pad(input_image, pads, mode="reflect") + + # Decalaration of denoised Y channel and weights + denoised_y_channel = np.zeros(input_image.shape) + final_weights = np.zeros(input_image.shape) + + # Generating LUT weighs based on euclidean distance between intensities + # Assigning weights to similar pixels in descending order (most similar + # will have the largest weight_for_each_shifted_array) + weights_lut = self.get_weights() + + for i in tqdm( + range(window_size), disable=self.is_progress, leave=self.is_leave + ): + for j in range(window_size): + # Creating arrays starting from pixels according to the search window -- + # There will N = search_window*search_window stacked arrays of input + # image size + array_for_each_pixel_in_sw = np.int32( + wtspadded_y_in[ + i : i + input_image.shape[0], j : j + input_image.shape[1], ... + ] + ) + + # Finding euclidean distance between pixels based on their intensities + # & applying mean filter + euc_distance = (input_image - array_for_each_pixel_in_sw) ** 2 + distance = self.apply_mean_filter(euc_distance, patch_size=patch_size) + + # Assigning weights to the pixels based on their distance (most similar + # will have largest weight) + weight_for_each_shifted_array = weights_lut[distance] + + # Adding up all the weighted similar pixels + denoised_y_channel += ( + array_for_each_pixel_in_sw * weight_for_each_shifted_array + ) + + # Adding up all the weights for final mean values at each pixel location + final_weights += weight_for_each_shifted_array + + # Averaging out all the pixel + denoised_y_channel = denoised_y_channel / final_weights + + if in_image.dtype == "float32": + denoised_y_channel = np.float32((denoised_y_channel) / 255.0) + denoised_out = denoised_out.astype("float32") + + # Reconstructing the final output + denoised_out[:, :, 0] = denoised_y_channel + denoised_out[:, :, 1] = in_image[:, :, 1] + denoised_out[:, :, 2] = in_image[:, :, 2] + + return denoised_out + + def apply_mean_filter(self, array, patch_size): + """ + Applying Mean Filter + """ + padded_array = np.pad(array, patch_size // 2, mode="reflect") + summed_up_arrays = np.zeros([array.shape[0], array.shape[1]]) + + for i in range(patch_size): + for j in range(patch_size): + summed_up_arrays += np.int32( + padded_array[i : i + array.shape[0], j : j + array.shape[1], ...] + ) + + output_mean_filtered = ((summed_up_arrays) / patch_size**2).astype( + array.dtype + ) + return output_mean_filtered diff --git a/modules/oecf.py b/modules/oecf.py deleted file mode 100644 index 19b6c93..0000000 --- a/modules/oecf.py +++ /dev/null @@ -1,68 +0,0 @@ -# File: oecf.py -# Description: Implements the opto electronic conversion function as a LUT -# Code / Paper Reference: -# Author: xx-isp (ispinfinite@gmail.com) -#------------------------------------------------------------ - -import numpy as np - -class OECF: - 'Optical Electronic Conversion Function - correction' - def __init__(self, img, sensor_info, parm_oecf): - self.img = img - self.enable = parm_oecf['isEnable'] - self.sensor_info = sensor_info - self.parm_oecf = parm_oecf - - def execute(self): - print('Optical Electronic Conversion Function = ' + str(self.enable)) - - if self.enable == False: - return self.img - else: - return self.apply_OECF() - - def apply_OECF(self): - - raw = self.img - - #get config parm - bayer = self.sensor_info['bayer_pattern'] - bpp = self.sensor_info['bitdep'] - - # duplicating r_lut here - when correcting add LUTs for each channel in config.yml and load here - rd_lut = np.uint16(np.array(self.parm_oecf['r_lut'])) - gr_lut = np.uint16(np.array(self.parm_oecf['r_lut'])) - gb_lut = np.uint16(np.array(self.parm_oecf['r_lut'])) - bl_lut = np.uint16(np.array(self.parm_oecf['r_lut'])) - - raw_oecf = np.zeros(raw.shape) - - if bayer == 'rggb': - - raw_oecf[0::2, 0::2] = rd_lut[raw[0::2, 0::2]] - raw_oecf[0::2, 1::2] = gr_lut[raw[0::2, 1::2]] - raw_oecf[1::2, 0::2] = gb_lut[raw[1::2, 0::2]] - raw_oecf[1::2, 1::2] = bl_lut[raw[1::2, 1::2]] - - elif bayer == 'bggr': - raw_oecf[0::2, 0::2] = bl_lut[raw[0::2, 0::2]] - raw_oecf[0::2, 1::2] = gb_lut[raw[0::2, 1::2]] - raw_oecf[1::2, 0::2] = gr_lut[raw[1::2, 0::2]] - raw_oecf[1::2, 1::2] = rd_lut[raw[1::2, 1::2]] - - elif bayer == 'grbg': - raw_oecf[0::2, 0::2] = gr_lut[raw[0::2, 0::2]] - raw_oecf[0::2, 1::2] = rd_lut[raw[0::2, 1::2]] - raw_oecf[1::2, 0::2] = bl_lut[raw[1::2, 0::2]] - raw_oecf[1::2, 1::2] = gb_lut[raw[1::2, 1::2]] - - elif bayer == 'gbrg': - raw_oecf[0::2, 0::2] = gb_lut[raw[0::2, 0::2]] - raw_oecf[0::2, 1::2] = bl_lut[raw[0::2, 1::2]] - raw_oecf[1::2, 0::2] = rd_lut[raw[1::2, 0::2]] - raw_oecf[1::2, 1::2] = gr_lut[raw[1::2, 1::2]] - - raw_oecf = np.uint16(np.clip(raw_oecf, 0, (2**bpp)-1)) - return raw_oecf - diff --git a/modules/oecf/oecf.py b/modules/oecf/oecf.py new file mode 100644 index 0000000..b138f97 --- /dev/null +++ b/modules/oecf/oecf.py @@ -0,0 +1,94 @@ +""" +File: oecf.py +Description: Implements the opto electronic conversion function as a LUT +Code / Paper Reference: +Author: 10xEngineers Pvt Ltd +------------------------------------------------------------ +""" +import time +import numpy as np + +from util.utils import save_output_array + + +class OECF: + "Optical Electronic Conversion Function - correction" + + def __init__(self, img, platform, sensor_info, parm_oecf): + self.img = img + self.enable = parm_oecf["is_enable"] + self.sensor_info = sensor_info + self.parm_oecf = parm_oecf + self.is_save = parm_oecf["is_save"] + self.platform = platform + + def apply_oecf(self): + """Execute OECF.""" + raw = self.img + + # get config parm + bayer = self.sensor_info["bayer_pattern"] + bpp = self.sensor_info["bit_depth"] + + # duplicating r_lut here - when correcting add LUTs for each channel + # in config.yml and load here + rd_lut = np.uint16(np.array(self.parm_oecf["r_lut"])) + gr_lut = np.uint16(np.array(self.parm_oecf["r_lut"])) + gb_lut = np.uint16(np.array(self.parm_oecf["r_lut"])) + bl_lut = np.uint16(np.array(self.parm_oecf["r_lut"])) + + raw_oecf = np.zeros(raw.shape) + + if bayer == "rggb": + + raw_oecf[0::2, 0::2] = rd_lut[raw[0::2, 0::2]] + raw_oecf[0::2, 1::2] = gr_lut[raw[0::2, 1::2]] + raw_oecf[1::2, 0::2] = gb_lut[raw[1::2, 0::2]] + raw_oecf[1::2, 1::2] = bl_lut[raw[1::2, 1::2]] + + elif bayer == "bggr": + raw_oecf[0::2, 0::2] = bl_lut[raw[0::2, 0::2]] + raw_oecf[0::2, 1::2] = gb_lut[raw[0::2, 1::2]] + raw_oecf[1::2, 0::2] = gr_lut[raw[1::2, 0::2]] + raw_oecf[1::2, 1::2] = rd_lut[raw[1::2, 1::2]] + + elif bayer == "grbg": + raw_oecf[0::2, 0::2] = gr_lut[raw[0::2, 0::2]] + raw_oecf[0::2, 1::2] = rd_lut[raw[0::2, 1::2]] + raw_oecf[1::2, 0::2] = bl_lut[raw[1::2, 0::2]] + raw_oecf[1::2, 1::2] = gb_lut[raw[1::2, 1::2]] + + elif bayer == "gbrg": + raw_oecf[0::2, 0::2] = gb_lut[raw[0::2, 0::2]] + raw_oecf[0::2, 1::2] = bl_lut[raw[0::2, 1::2]] + raw_oecf[1::2, 0::2] = rd_lut[raw[1::2, 0::2]] + raw_oecf[1::2, 1::2] = gr_lut[raw[1::2, 1::2]] + + raw_oecf = np.uint16(np.clip(raw_oecf, 0, (2**bpp) - 1)) + return raw_oecf + + def save(self): + """ + Function to save module output + """ + if self.is_save: + save_output_array( + self.platform["in_file"], + self.img, + "Out_oecf_", + self.platform, + self.sensor_info["bit_depth"], + self.sensor_info["bayer_pattern"], + ) + + def execute(self): + """Execute OECF if enabled.""" + print("Optical Electronic Conversion Function = " + str(self.enable)) + + if self.enable: + start = time.time() + oecf_out = self.apply_oecf() + print(f" Execution time: {time.time() - start:.3f}s") + self.img = oecf_out + self.save() + return self.img diff --git a/modules/rgb_conversion/rgb_conversion.py b/modules/rgb_conversion/rgb_conversion.py new file mode 100644 index 0000000..2359378 --- /dev/null +++ b/modules/rgb_conversion/rgb_conversion.py @@ -0,0 +1,110 @@ +""" +File: color_space_conversion.py +Description: Converts RGB to YUV or YCbCr +Code / Paper Reference: https://en.wikipedia.org/wiki/YCbCr#ITU-R_BT.709_conversion + https://www.itu.int/rec/R-REC-BT.601/ + https://www.itu.int/rec/R-REC-BT.709-6-201506-I/en + https://learn.microsoft.com/en-us/windows/win32/medfound/recommended- + 8-bit-yuv-formats-for-video-rendering + https://web.archive.org/web/20180423091842/http://www.equasys.de/ + colorconversion.html + Author: 10xEngineers Pvt Ltd +------------------------------------------------------------------------------ +""" + +import time +import numpy as np +from util.utils import save_output_array_yuv, save_output_array + + +class RGBConversion: + """ + YUV to RGB Conversion + """ + + def __init__(self, img, platform, sensor_info, parm_rgb, parm_csc): + self.img = img.copy() + self.platform = platform + self.sensor_info = sensor_info + self.parm_rgb = parm_rgb + self.enable = self.parm_rgb["is_enable"] + self.is_save = self.parm_rgb["is_save"] + self.bit_depth = sensor_info["bit_depth"] + self.conv_std = parm_csc["conv_standard"] + self.yuv_img = img + self.yuv2rgb_mat = None + + def yuv_to_rgb(self): + """ + YUV-to-RGB Colorspace conversion 8bit + """ + + # make nx3 2d matrix of image + mat_2d = self.yuv_img.reshape( + (self.yuv_img.shape[0] * self.yuv_img.shape[1], 3) + ) + + # convert to 3xn for matrix multiplication + mat2d_t = mat_2d.transpose() + + # subract the offsets + mat2d_t = mat2d_t - np.array([[16, 128, 128]]).transpose() + + if self.conv_std == 1: + # for BT. 709 + self.yuv2rgb_mat = np.array([[74, 0, 114], [74, -13, -34], [74, 135, 0]]) + else: + # for BT.601/407 + # conversion metrix with 8bit integer co-efficients - m=8 + self.yuv2rgb_mat = np.array([[64, 87, 0], [64, -44, -20], [61, 0, 105]]) + + # convert to RGB + rgb_2d = np.matmul(self.yuv2rgb_mat, mat2d_t) + rgb_2d = rgb_2d >> 6 + + # reshape the image back + rgb2d_t = rgb_2d.transpose() + self.yuv_img = rgb2d_t.reshape(self.yuv_img.shape).astype(np.float32) + + # clip the resultant img as it can have neg rgb values for small Y' + self.yuv_img = np.float32(np.clip(self.yuv_img, 0, 255)) + + # convert the image to [0-255] + self.yuv_img = np.uint8(self.yuv_img) + return self.yuv_img + + def save(self): + """ + Function to save module output + """ + if self.is_save: + if self.enable: + save_output_array( + self.platform["in_file"], + self.img, + "Out_rgb_conversion_", + self.platform, + self.bit_depth, + self.sensor_info["bayer_pattern"], + ) + else: + save_output_array_yuv( + self.platform["in_file"], + self.img, + "Out_rgb_conversion_", + self.platform, + self.conv_std, + ) + + def execute(self): + """ + Execute RGB Conversion + """ + print("RGB Conversion" + " = " + str(self.enable)) + if self.enable: + start = time.time() + rgb_out = self.yuv_to_rgb() + print(f" Execution time: {time.time() - start:.3f}s") + self.img = rgb_out + self.save() + return self.img diff --git a/modules/scale.py b/modules/scale.py deleted file mode 100644 index 54db78f..0000000 --- a/modules/scale.py +++ /dev/null @@ -1,420 +0,0 @@ -# File: scale.py -# Description: Implements both hardware friendly and non hardware freindly scaling -# Code / Paper Reference: https://patentimages.storage.googleapis.com/f9/11/65/a2b66f52c6dbd4/US8538199.pdf -# Author: xx-isp (ispinfinite@gmail.com) -#------------------------------------------------------------ - -import numpy as np -from modules.crop import Crop -import util.utils as utils - -class Scale: - - def __init__(self, img, sensor_info, parm_sca): - self.img = img - self.enable = parm_sca['isEnable'] - self.sensor_info = sensor_info - self.parm_sca = parm_sca - - def execute(self): - - print('Scale = ' + str(self.enable)) - - if self.enable: - scaled_img = self.apply_scaling() - return scaled_img - else: - return self.img - - def apply_scaling(self): - - #get params - self.get_scaling_params() - - #check if no change in size - if self.old_size==self.new_size: - print(' - Output size is the same as input size.') if self.is_debug else None - return self.img - - if self.img.dtype == "float32": - scaled_img = np.empty((self.new_size[0], self.new_size[1], 3), dtype="float32") - else: - scaled_img = np.empty((self.new_size[0], self.new_size[1], 3), dtype="uint8") - - #Loop over each channel to resize the image - for i in range(3): - - ch_arr = self.img[:,:,i] - scale_2d = Scale_2D(ch_arr, self.sensor_info, self.parm_sca) - scaled_ch = scale_2d.execute() - - # If input size is invalid, the Scale_2D class returns the original image. - if scaled_ch.shape==self.old_size: - return self.img - else: - scaled_img[:,:,i] = scaled_ch - - # Because each channel is scaled in the same way, the isDeug flag is turned - # off after the first channel has been scaled. - self.parm_sca["isDebug"]= False - - # convert uint16 img to uint8 - # if self.img.dtype == "float32": - # NotImplemented - # #scaled_img = np.float32(np.clip(scaled_img, 0, 1)) - # else: - # scaled_img = np.uint8(np.clip(scaled_img, 0, (2**8)-1)) - return scaled_img - - def get_scaling_params(self): - self.is_debug = self.parm_sca["isDebug"] - self.old_size = (self.sensor_info["height"], self.sensor_info["width"]) - self.new_size = (self.parm_sca["new_height"], self.parm_sca["new_width"]) - -################################################################################ -class Scale_2D: - def __init__(self, single_channel, sensor_info, parm_sca): - self.single_channel = np.float32(single_channel) - self.sensor_info = sensor_info - self.parm_sca = parm_sca - - def downscale_nearest_neighbor(self, new_size): - - """Down scale by an integer factor using NN method using convolution.""" - # print("Downscaling with Nearest Neighbor.") - - old_height, old_width = self.single_channel.shape[0], self.single_channel.shape[1] - new_height, new_width = new_size[0], new_size[1] - - # As new_size is less than old_size, scale factor is defined s.t it is >1 for downscaling - scale_height , scale_width = old_height/new_height, old_width/new_width - - kernel = np.zeros((int(scale_height), int(scale_width))) - kernel[0,0] = 1 - - scaled_img = utils.stride_convolve2d(self.single_channel, kernel) - return scaled_img.astype("float32") - - def scale_nearest_neighbor(self, new_size): - - """ - Upscale/Downscale 2D array by any scale factor using Nearest Neighbor (NN) algorithm. - """ - - old_height, old_width = self.single_channel.shape[0], self.single_channel.shape[1] - new_height, new_width = new_size[0], new_size[1] - scale_height , scale_width = new_height/old_height, new_width/old_width - - scaled_img = np.zeros((new_height, new_width), dtype = "float32") - - for y in range(new_height): - for x in range(new_width): - y_nearest = int(np.floor(y/scale_height)) - x_nearest = int(np.floor(x/scale_width)) - scaled_img[y,x] = self.single_channel[y_nearest, x_nearest] - return scaled_img - - def bilinear_interpolation(self, new_size): - - """ - Upscale/Downscale 2D array by any scale factor using Bilinear method. - """ - - old_height, old_width = self.single_channel.shape[0], self.single_channel.shape[1] - new_height, new_width = new_size[0], new_size[1] - scale_height , scale_width = new_height/old_height, new_width/old_width - - scaled_img = np.zeros((new_height, new_width), dtype = "float32") - old_coor = lambda a, scale_fact: (a+0.5)/scale_fact - 0.5 - - for y in range(new_height): - for x in range(new_width): - - # Coordinates in old image - old_y, old_x = old_coor(y, scale_height), old_coor(x, scale_width) - - x1 = 0 if np.floor(old_x)<0 else min(int(np.floor(old_x)), old_width-1) - y1 = 0 if np.floor(old_y)<0 else min(int(np.floor(old_y)), old_height-1) - x2 = 0 if np.ceil(old_x)<0 else min(int(np.ceil(old_x)), old_width-1) - y2 = 0 if np.ceil(old_y)<0 else min(int(np.ceil(old_y)), old_height-1) - - # Get four neghboring pixels - Q11 = self.single_channel[y1, x1] - Q12 = self.single_channel[y1, x2] - Q21 = self.single_channel[y2, x1] - Q22 = self.single_channel[y2, x2] - - # Interpolating P1 and P2 - weight_right = old_x- np.floor(old_x) - weight_left = 1-weight_right - P1 = weight_left*Q11 + weight_right*Q12 - P2 = weight_left*Q21 + weight_right*Q22 - - # The case where the new pixel lies between two pixels - if x1 == x2: - P1 = Q11 - P2 = Q22 - - # Interpolating P - weight_bottom = old_y - np.floor(old_y) - weight_top = 1-weight_bottom - P = weight_top*P1 + weight_bottom*P2 - - scaled_img[y,x] = P - return scaled_img.astype("float32") - - def resize_by_non_int_fact(self, red_fact, method): - - """" - Resize 2D array by non-integer factor n/d. - Firstly, the array is upsacled n times then downscaled d times. - Parameter: - --------- - red_fact: list of tuples with scale factors for height (at index 0) and width (at index 1). - method: list with algorithms used for upscaling(at index 0) and downscaling(at index 1). - Output: scaled img - """ - - for i in range(2): - if bool(red_fact[i]): - - # reduction factor = n/d ---> Upscale the cropped image n times then downscale d times - upscale_fact = red_fact[i][0] - downscale_fact = red_fact[i][1] - - upscale_to_size = (upscale_fact*self.single_channel.shape[0], self.single_channel.shape[1]) if i==0 else \ - (self.single_channel.shape[0], upscale_fact*self.single_channel.shape[1]) - if method[0]=="Nearest_Neighbor": - self.single_channel = self.scale_nearest_neighbor(upscale_to_size) - elif method[0]=="Bilinear": - self.single_channel = self.bilinear_interpolation(upscale_to_size) - else: - print(" - Invalid scale method. \n - UpScaling with default Nearest Neaghibor method...") if i==0 else None - self.single_channel = self.scale_nearest_neighbor(upscale_to_size) - downscale_to_size = (int(np.round(self.single_channel.shape[0]/downscale_fact)), self.single_channel.shape[1]) if i==0 else \ - (self.single_channel.shape[0], int(np.round(self.single_channel.shape[1]//downscale_fact))) - - if method[1]=="Nearest_Neighbor": - self.single_channel = self.downscale_nearest_neighbor(downscale_to_size) - elif method[1]=="Bilinear": - self.single_channel = self.downscale_by_int_factor(downscale_to_size) - else: - print(" - Invalid scale method. \n - DownScaling with default Nearest Neaghibor method...") if i==0 else None - self.single_channel = self.downscale_nearest_neighbor(downscale_to_size) - return self.single_channel - - def downscale_by_int_factor(self, new_size): - - """ - Downscale a 2D array by an integer scale factor using Bilinear method with 2D convolution. - - Parameters - ---------- - new_size: Required output size. - Output: 16 bit scaled image in which each pixel is an average of box nxm - determined by the scale factors. - """ - - scale_height = new_size[0]/self.single_channel.shape[0] - scale_width = new_size[1]/self.single_channel.shape[1] - - box_height = int(np.ceil(1/scale_height)) - box_width = int(np.ceil(1/scale_width)) - - scaled_img = np.zeros((new_size[0], new_size[1]), dtype = "float32") - kernel = np.ones((box_height, box_width))/(box_height*box_width) - - scaled_img = utils.stride_convolve2d(self.single_channel, kernel) - return scaled_img.astype("float32") - - def hardware_dep_scaling(self): - # check and set the flow of the algorithm - scale_info = self.validate_input_output() - - # apply scaling according to the flow - return self.apply_algo(scale_info, ([self.upscale_method, self.downscale_method])) - - def apply_algo(self, scale_info, method): - - """ - Scale 2D array using hardware friendly approach comprising of 3 steps: - 1. Downscale with int factor - 2. Crop - 3. Scale with non-integer-factor """ - - # check if input size is valid - if scale_info == [[None,None,None], [None,None,None]]: - print(" - Invalid input size. It must be one of the following:\n"\ - " - 1920x1080\n" - " - 2592x1536\n" - " - 2592x1944") - return self.single_channel - - # check if output size is valid - if scale_info == [[1,0,None], [1,0,None]]: - print(" - Invalid output size.") - return self.single_channel - else: - # step 1: Downscale by int fcator - if scale_info[0][0]>1 or scale_info[1][0]>1: - self.single_channel = self.downscale_by_int_factor((self.old_size[0]//scale_info[0][0], - self.old_size[1]//scale_info[1][0])) - - print(" - Shape after downscaling by integer factor {}: {}".format((scale_info[0][0],\ - scale_info[1][0]),self.single_channel.shape)) if self.is_debug else None - - # step 2: crop - if scale_info[0][1]>0 or scale_info[1][1]>0: - self.single_channel = utils.crop(self.single_channel, scale_info[0][1], scale_info[1][1]) - - print(" - Shape after cropping {}: {}".format((scale_info[0][1],\ - scale_info[1][1]), self.single_channel.shape)) if self.is_debug else None - - # step 3: Scale with non-int factor - if bool(scale_info[0][2])==True or bool(scale_info[1][2])==True: - self.single_channel = self.resize_by_non_int_fact((scale_info[0][2], - scale_info[1][2]), method) - print(" - Shape after scaling by non-integer factor {}: {}".format((scale_info[0][2],\ - scale_info[1][2]),self.single_channel.shape)) if self.is_debug else None - return self.single_channel - - def validate_input_output(self): - - valid_size = [(1080,1920), (1536,2592), (1944,2592)] - sizes = [OUT_1080x1920, OUT_1536x2592, OUT_1944x2592] - - # Check if input size is valid - if self.old_size not in valid_size: - scale_info = [[None,None,None],[None,None,None]] - return scale_info - - idx = valid_size.index(self.old_size) - size_obj = sizes[idx](self.new_size) - scale_info = size_obj.scale_list - return scale_info - - def execute(self): - - self.get_scaling_params() - - if self.is_hardware: - self.single_channel = self.hardware_dep_scaling() - else: - - self.single_channel = self.hardware_indp_scaling() - - print(" - Shape of scaled image for a single channel = ", self.single_channel.shape) if self.is_debug else None - return self.single_channel - - def hardware_indp_scaling(self): - - if self.algo=="Nearest_Neighbor": - print(" - Scaling with Nearest Neighbor method...") if self.is_debug else None - return self.scale_nearest_neighbor(self.new_size) - elif self.algo=="Bilinear": - print(" - Scaling with Bilinear method...") if self.is_debug else None - return self.bilinear_interpolation(self.new_size) - else: - print(" - Invalid scale method.\n - Scaling with default Nearest Neighbor method...") if self.is_debug else None - return self.scale_nearest_neighbor(self.new_size) - - def get_scaling_params(self): - self.old_size = (self.sensor_info["height"], self.sensor_info["width"]) - self.new_size = (self.parm_sca["new_height"], self.parm_sca["new_width"]) - self.is_debug = self.parm_sca["isDebug"] - self.is_hardware = self.parm_sca["isHardware"] - self.algo = self.parm_sca["Algo"] - self.upscale_method = self.parm_sca["upscale_method"] - self.downscale_method = self.parm_sca["downscale_method"] - -############################################################################# -# The structure and working of the following three classes is exactlly the same -class OUT_1080x1920: - """ - The hardware friendly approach can only be used for specific input and output sizes. - This class checks if the given output size can be achieved by this approach and - creates a nested list (SCALE_LIST below) with corresponding constants used to execute this scaling approach - comprising of the following three steps: - - 1. Downscale with int factor - 2. Crop - 3. Scale with non-integer-factor - - The elements in each list correspond to the following constants: - - 1. Scale factor [int]: (default 1) scale factor for downscaling. - 2. Crop value [int] : (defaut 0) number of rows or columns to be croped. - 3. Non-int scale factor [tuple with 2 enteries]: (default None) a rational scale factor - of form n/d where n is the first entry (index 0) and d is the second entry(index 1) - of this tuple. - - Instance Attributes: - ------------------- - SCALE_LIST: a nested list with two sublists containing constants used in order to - scale height (index 0) and width (index 1) to the given NEW_SIZE using the three - steps above. - - """ - - def __init__(self, new_size): - self.new_size = new_size - - if self.new_size == (720, 1280): - self.scale_list= [[1,0,(2,3)], [1,0,(2,3)]] - - elif self.new_size == (480, 640): - self.scale_list= [[2,60,None], [3,0,None]] - - elif self.new_size == (360, 640): - self.scale_list= [[3,0,None], [3,0,None]] - - else: - self.scale_list= [[1,0,None],[1,0,None]] - -############################################################################# -class OUT_1536x2592: - - def __init__(self, new_size): - self.new_size = new_size - - if self.new_size == (1080, 1920): - self.scale_list= [[1,24,(5,7)], [1,32,(3,4)]] - - elif self.new_size == (720,1280): - self.scale_list= [[2,48,None], [2,16,None]] - - elif self.new_size == (480, 640): - self.scale_list= [[3,32,None], [4,8,None]] - - elif self.new_size == (360,640): - self.scale_list= [[4,24,None], [4,8,None]] - - else: - self.scale_list= [[1,0,None],[1,0,None]] - -############################################################################# -class OUT_1944x2592: - - def __init__(self, new_size): - self.new_size = new_size - - if self.new_size == (1440, 2560): - self.scale_list= [[1,24,(3,4)], [1,32,None]] - - elif self.new_size == (1080, 1920): - self.scale_list= [[1,54,(4,7)], [1,32,(3,4)]] - - elif self.new_size == (960,1280): - self.scale_list= [[2,16,None], [2,12,None]] - - elif self.new_size == (720,1280): - self.scale_list= [[2,16,(3,4)], [2,12,None]] - - elif self.new_size == (480, 640): - self.scale_list= [[4,6,None], [4,8,None]] - - elif self.new_size == (360,640): - self.scale_list= [[4,6,(3,4)], [4,8,None]] - - else: - self.scale_list= [[1,0,None],[1,0,None]] diff --git a/modules/scale/bilinear_interpolation.py b/modules/scale/bilinear_interpolation.py new file mode 100644 index 0000000..a50ea0b --- /dev/null +++ b/modules/scale/bilinear_interpolation.py @@ -0,0 +1,111 @@ +""" +File: scale.py +Description: Implements both hardware friendly and non hardware freindly scaling +Code / Paper Reference: +https://patentimages.storage.googleapis.com/f9/11/65/a2b66f52c6dbd4/US8538199.pdf +Author: 10xEngineers Pvt Ltd +------------------------------------------------------------ +""" +import numpy as np +from util.utils import stride_convolve2d + +################################################################################ +class BilinearInterpolation: + """Scale 2D image to given size.""" + + def __init__(self, img, new_size): + self.single_channel = np.float32(img) + self.new_size = new_size + + def bilinear_interpolation(self): + + """ + Upscale/Downscale 2D array by any scale factor using Bilinear method. + """ + + old_height, old_width = ( + self.single_channel.shape[0], + self.single_channel.shape[1], + ) + new_height, new_width = self.new_size[0], self.new_size[1] + scale_height, scale_width = new_height / old_height, new_width / old_width + + scaled_img = np.zeros((new_height, new_width), dtype="float32") + old_coor = lambda a, scale_fact: (a + 0.5) / scale_fact - 0.5 + + for row in range(new_height): + for col in range(new_width): + + # Coordinates in old image + old_row, old_col = old_coor(row, scale_height), old_coor( + col, scale_width + ) + + x_1 = ( + 0 + if np.floor(old_col) < 0 + else min(int(np.floor(old_col)), old_width - 1) + ) + y_1 = ( + 0 + if np.floor(old_row) < 0 + else min(int(np.floor(old_row)), old_height - 1) + ) + x_2 = ( + 0 + if np.ceil(old_col) < 0 + else min(int(np.ceil(old_col)), old_width - 1) + ) + y_2 = ( + 0 + if np.ceil(old_row) < 0 + else min(int(np.ceil(old_row)), old_height - 1) + ) + + # Get four neghboring pixels + q_11 = self.single_channel[y_1, x_1] + q_12 = self.single_channel[y_1, x_2] + q_21 = self.single_channel[y_2, x_1] + q_22 = self.single_channel[y_2, x_2] + + # Interpolating p_1 and p_2 + weight_right = old_col - np.floor(old_col) + weight_left = 1 - weight_right + p_1 = weight_left * q_11 + weight_right * q_12 + p_2 = weight_left * q_21 + weight_right * q_22 + + # The case where the new pixel lies between two pixels + if x_1 == x_2: + p_1 = q_11 + p_2 = q_22 + + # Interpolating p + weight_bottom = old_row - np.floor(old_row) + weight_top = 1 - weight_bottom + pixel_val = weight_top * p_1 + weight_bottom * p_2 + + scaled_img[row, col] = pixel_val + return scaled_img.astype("float32") + + def downscale_by_int_factor(self): + + """ + Downscale a 2D array by an integer scale factor using Bilinear method with 2D convolution. + Parameters + ---------- + new_size: Required output size. + Output: 16 bit scaled image in which each pixel is an average of box nxm + determined by the scale factors. + """ + + scale_height = self.new_size[0] / self.single_channel.shape[0] + scale_width = self.new_size[1] / self.single_channel.shape[1] + + box_height = int(np.ceil(1 / scale_height)) + box_width = int(np.ceil(1 / scale_width)) + + scaled_img = np.zeros((self.new_size[0], self.new_size[1]), dtype="float32") + kernel = np.ones((box_height, box_width)) / (box_height * box_width) + + scaled_img = stride_convolve2d(self.single_channel, kernel) + return scaled_img.astype("float32") diff --git a/modules/scale/nearest_neighbor.py b/modules/scale/nearest_neighbor.py new file mode 100644 index 0000000..f03c362 --- /dev/null +++ b/modules/scale/nearest_neighbor.py @@ -0,0 +1,60 @@ +""" +File: scale.py +Description: Implements both hardware friendly and non hardware freindly scaling +Code / Paper Reference: +https://patentimages.storage.googleapis.com/f9/11/65/a2b66f52c6dbd4/US8538199.pdf +Author: 10xEngineers Pvt Ltd +------------------------------------------------------------ +""" +import numpy as np +from util.utils import stride_convolve2d + +################################################################################ +class NearestNeighbor: + """Scale 2D image to given size.""" + + def __init__(self, img, new_size): + self.single_channel = np.float32(img) + self.new_size = new_size + + def downscale_nearest_neighbor(self): + + """Down scale by an integer factor using NN method using convolution.""" + # print("Downscaling with Nearest Neighbor.") + + old_height, old_width = ( + self.single_channel.shape[0], + self.single_channel.shape[1], + ) + new_height, new_width = self.new_size[0], self.new_size[1] + + # As new_size is less than old_size, scale factor is defined s.t it is >1 for downscaling + scale_height, scale_width = old_height / new_height, old_width / new_width + + kernel = np.zeros((int(scale_height), int(scale_width))) + kernel[0, 0] = 1 + + scaled_img = stride_convolve2d(self.single_channel, kernel) + return scaled_img.astype("float32") + + def scale_nearest_neighbor(self): + + """ + Upscale/Downscale 2D array by any scale factor using Nearest Neighbor (NN) algorithm. + """ + + old_height, old_width = ( + self.single_channel.shape[0], + self.single_channel.shape[1], + ) + new_height, new_width = self.new_size[0], self.new_size[1] + scale_height, scale_width = new_height / old_height, new_width / old_width + + scaled_img = np.zeros((new_height, new_width), dtype="float32") + + for row in range(new_height): + for col in range(new_width): + row_nearest = int(np.floor(row / scale_height)) + col_nearest = int(np.floor(col / scale_width)) + scaled_img[row, col] = self.single_channel[row_nearest, col_nearest] + return scaled_img diff --git a/modules/scale/scale.py b/modules/scale/scale.py new file mode 100644 index 0000000..eab8e3a --- /dev/null +++ b/modules/scale/scale.py @@ -0,0 +1,445 @@ +""" +File: scale.py +Description: Implements both hardware friendly and non hardware freindly scaling +Code / Paper Reference: +https://patentimages.storage.googleapis.com/f9/11/65/a2b66f52c6dbd4/US8538199.pdf +Author: 10xEngineers Pvt Ltd +------------------------------------------------------------ +""" +import time +import re +import numpy as np +from util.utils import crop + +from util.utils import save_output_array_yuv, save_output_array +from modules.scale.nearest_neighbor import NearestNeighbor as NN +from modules.scale.bilinear_interpolation import BilinearInterpolation as BLI + + +class Scale: + """Scale color image to given size.""" + + def __init__(self, img, platform, sensor_info, parm_sca, conv_std): + self.img = img + self.enable = parm_sca["is_enable"] + self.sensor_info = sensor_info + self.parm_sca = parm_sca + self.is_save = parm_sca["is_save"] + self.platform = platform + self.conv_std = conv_std + self.get_scaling_params() + + def apply_scaling(self): + """Execute scaling.""" + + # check if no change in size + if self.old_size == self.new_size: + if self.is_debug: + print(" - Output size is the same as input size.") + return self.img + + if self.img.dtype == "float32": + scaled_img = np.empty( + (self.new_size[0], self.new_size[1], 3), dtype="float32" + ) + else: + scaled_img = np.empty( + (self.new_size[0], self.new_size[1], 3), dtype="uint8" + ) + + # Loop over each channel to resize the image + for i in range(3): + + ch_arr = self.img[:, :, i] + scale_2d = Scale2D(ch_arr, self.sensor_info, self.parm_sca) + scaled_ch = scale_2d.execute() + + # If input size is invalid, the Scale2D class returns the original image. + if scaled_ch.shape == self.old_size: + return self.img + else: + scaled_img[:, :, i] = scaled_ch + + # Because each channel is scaled in the same way, the isDeug flag is turned + # off after the first channel has been scaled. + self.parm_sca["is_debug"] = False + + return scaled_img + + def get_scaling_params(self): + """Save parameters as instance attributes.""" + self.is_debug = self.parm_sca["is_debug"] + self.old_size = (self.sensor_info["height"], self.sensor_info["width"]) + self.new_size = (self.parm_sca["new_height"], self.parm_sca["new_width"]) + + def save(self): + """ + Function to save module output + """ + # update size of array in filename + self.platform["in_file"] = re.sub( + r"\d+x\d+", + f"{self.img.shape[1]}x{self.img.shape[0]}", + self.platform["in_file"], + ) + if self.is_save: + if self.platform["rgb_output"]: + save_output_array( + self.platform["in_file"], + self.img, + "Out_scale_", + self.platform, + self.sensor_info["bit_depth"], + self.sensor_info["bayer_pattern"], + ) + else: + save_output_array_yuv( + self.platform["in_file"], + self.img, + "Out_scale_", + self.platform, + self.conv_std, + ) + + def execute(self): + """Execute scaling if enabled.""" + print("Scale = " + str(self.enable)) + + if self.enable: + start = time.time() + scaled_img = self.apply_scaling() + print(f" Execution time: {time.time() - start:.3f}s") + return scaled_img + return self.img + + +################################################################################ +class Scale2D: + """Scale 2D image to given size.""" + + def __init__(self, single_channel, sensor_info, parm_sca): + self.single_channel = np.float32(single_channel) + self.sensor_info = sensor_info + self.parm_sca = parm_sca + self.get_scaling_params() + + def resize_by_non_int_fact(self, red_fact, method): + + """ " + Resize 2D array by non-integer factor n/d. + Firstly, the array is upsacled n times then downscaled d times. + Parameter: + --------- + red_fact: list of tuples with scale factors for height (at index 0) and width (at index 1). + method: list with algorithms used for upscaling(at index 0) and downscaling(at index 1). + Output: scaled img + """ + + for i in range(2): + if bool(red_fact[i]): + + # reduction factor = n/d means: + # Upscale the cropped image n times then downscale d times + upscale_fact = red_fact[i][0] + downscale_fact = red_fact[i][1] + + upscale_to_size = ( + ( + upscale_fact * self.single_channel.shape[0], + self.single_channel.shape[1], + ) + if i == 0 + else ( + self.single_channel.shape[0], + upscale_fact * self.single_channel.shape[1], + ) + ) + if method[0] == "Nearest_Neighbor": + nn_obj = NN(self.single_channel, upscale_to_size) + self.single_channel = nn_obj.scale_nearest_neighbor() + elif method[0] == "Bilinear": + bilinear_obj = BLI(self.single_channel, upscale_to_size) + self.single_channel = bilinear_obj.bilinear_interpolation() + else: + if self.is_debug and i == 0: + print( + " - Invalid scale method.\n" + + " - UpScaling with default Nearest Neighbour method..." + ) + nn_obj = NN(self.single_channel, upscale_to_size) + self.single_channel = nn_obj.scale_nearest_neighbor() + downscale_to_size = ( + ( + int(np.round(self.single_channel.shape[0] / downscale_fact)), + self.single_channel.shape[1], + ) + if i == 0 + else ( + self.single_channel.shape[0], + int(np.round(self.single_channel.shape[1] // downscale_fact)), + ) + ) + + if method[1] == "Nearest_Neighbor": + nn_obj = NN(self.single_channel, downscale_to_size) + self.single_channel = nn_obj.downscale_nearest_neighbor() + elif method[1] == "Bilinear": + bilinear_obj = BLI(self.single_channel, downscale_to_size) + self.single_channel = bilinear_obj.downscale_by_int_factor() + else: + if self.is_debug and i == 0: + print( + " - Invalid scale method.\n" + + " - DownScaling with default Nearest Neighbour method..." + ) + nn_obj = NN(self.single_channel, downscale_to_size) + self.single_channel = nn_obj.downscale_nearest_neighbor() + + return self.single_channel + + def hardware_dep_scaling(self): + """Set algorithm workflow.""" + # check and set the flow of the algorithm + scale_info = self.validate_input_output() + + # apply scaling according to the flow + return self.apply_algo( + scale_info, ([self.upscale_method, self.downscale_method]) + ) + + def apply_algo(self, scale_info, method): + + """ + Scale 2D array using hardware friendly approach comprising of 3 steps: + 1. Downscale with int factor + 2. Crop + 3. Scale with non-integer-factor""" + + # check if input size is valid + if scale_info == [[None, None, None], [None, None, None]]: + print( + " - Invalid input size. It must be one of the following:\n" + " - 1920x1080\n" + " - 2592x1536\n" + " - 2592x1944" + ) + return self.single_channel + + # check if output size is valid + if scale_info == [[1, 0, None], [1, 0, None]]: + print(" - Invalid output size.") + return self.single_channel + else: + # step 1: Downscale by int factor using bilinear interpolation + if scale_info[0][0] > 1 or scale_info[1][0] > 1: + bilinear_obj = BLI(self.single_channel, self.new_size) + self.single_channel = bilinear_obj.downscale_by_int_factor( + ( + self.old_size[0] // scale_info[0][0], + self.old_size[1] // scale_info[1][0], + ) + ) + + if self.is_debug: + print( + " - Shape after downscaling by integer factor " + + f"({scale_info[0][0]}, {scale_info[1][0]})", + self.single_channel.shape, + ) + + # step 2: crop + if scale_info[0][1] > 0 or scale_info[1][1] > 0: + self.single_channel = crop( + self.single_channel, scale_info[0][1], scale_info[1][1] + ) + + if self.is_debug: + print( + " - Shape after cropping " + + f"({scale_info[0][1]}, {scale_info[1][1]}): ", + self.single_channel.shape, + ) + # step 3: Scale with non-int factor + if bool(scale_info[0][2]) or bool(scale_info[1][2]): + self.single_channel = self.resize_by_non_int_fact( + (scale_info[0][2], scale_info[1][2]), method + ) + + if self.is_debug: + print( + " - Shape after scaling by non-integer factor " + + f"({scale_info[0][2]}, {scale_info[1][2]}): ", + self.single_channel.shape, + ) + return self.single_channel + + def validate_input_output(self): + """Chcek if the size of the input image is valid according to the set workflow.""" + valid_size = [(1080, 1920), (1536, 2592), (1944, 2592)] + sizes = [OUT1080x1920, OUT1536x2592, OUT1944x2592] + + # Check if input size is valid + if self.old_size not in valid_size: + scale_info = [[None, None, None], [None, None, None]] + return scale_info + + idx = valid_size.index(self.old_size) + size_obj = sizes[idx](self.new_size) + scale_info = size_obj.execute() + return scale_info + + def execute(self): + """Execute scaling.""" + + if self.is_hardware: + self.single_channel = self.hardware_dep_scaling() + else: + + self.single_channel = self.hardware_indp_scaling() + + if self.is_debug: + print( + " - Shape of scaled image for a single channel = ", + self.single_channel.shape, + ) + return self.single_channel + + def hardware_indp_scaling(self): + """Execute hardware independent scaling.""" + if self.algo == "Nearest_Neighbor": + if self.is_debug: + print(" - Scaling with Nearest Neighbor method...") + + nn_obj = NN(self.single_channel, self.new_size) + return nn_obj.scale_nearest_neighbor() + + elif self.algo == "Bilinear": + if self.is_debug: + print(" - Scaling with Bilinear method...") + + bilinear_obj = BLI(self.single_channel, self.new_size) + return bilinear_obj.bilinear_interpolation() + + else: + if self.is_debug: + print( + " - Invalid scale method." + + " - Scaling with default Nearest Neighbor method..." + ) + + nn_obj = NN(self.single_channel, self.new_size) + return nn_obj.scale_nearest_neighbor() + + def get_scaling_params(self): + """Save parameters as instance attributes.""" + self.old_size = (self.sensor_info["height"], self.sensor_info["width"]) + self.new_size = (self.parm_sca["new_height"], self.parm_sca["new_width"]) + self.is_debug = self.parm_sca["is_debug"] + self.is_hardware = self.parm_sca["is_hardware"] + self.algo = self.parm_sca["algorithm"] + self.upscale_method = self.parm_sca["upscale_method"] + self.downscale_method = self.parm_sca["downscale_method"] + + +############################################################################# +# The structure and working of the following three classes is exactlly the same +class OUT1080x1920: + """ + The hardware friendly approach can only be used for specific input and output sizes. + This class checks if the given output size can be achieved by this approach and + creates a nested list (SCALE_LIST below) with corresponding constants used to execute + this scaling approach comprising of the following three steps: + 1. Downscale with int factor + 2. Crop + 3. Scale with non-integer-factor + The elements in each list correspond to the following constants: + 1. Scale factor [int]: (default 1) scale factor for downscaling. + 2. Crop value [int] : (defaut 0) number of rows or columns to be croped. + 3. Non-int scale factor [tuple with 2 enteries]: (default None) a rational scale factor + of form n/d where n is the first entry (index 0) and d is the second entry(index 1) + of this tuple. + Instance Attributes: + ------------------- + SCALE_LIST: a nested list with two sublists containing constants used in order to + scale height (index 0) and width (index 1) to the given NEW_SIZE using the three + steps above. + """ + + def __init__(self, new_size): + self.new_size = new_size + + if self.new_size == (720, 1280): + self.scale_list = [[1, 0, (2, 3)], [1, 0, (2, 3)]] + + elif self.new_size == (480, 640): + self.scale_list = [[2, 60, None], [3, 0, None]] + + elif self.new_size == (360, 640): + self.scale_list = [[3, 0, None], [3, 0, None]] + + else: + self.scale_list = [[1, 0, None], [1, 0, None]] + + def execute(self): + """Get crop/scale factors to the corresponding input size""" + return self.scale_list + + +############################################################################# +class OUT1536x2592: + """Same as class OUT_1080x1920""" + + def __init__(self, new_size): + self.new_size = new_size + + if self.new_size == (1080, 1920): + self.scale_list = [[1, 24, (5, 7)], [1, 32, (3, 4)]] + + elif self.new_size == (720, 1280): + self.scale_list = [[2, 48, None], [2, 16, None]] + + elif self.new_size == (480, 640): + self.scale_list = [[3, 32, None], [4, 8, None]] + + elif self.new_size == (360, 640): + self.scale_list = [[4, 24, None], [4, 8, None]] + + else: + self.scale_list = [[1, 0, None], [1, 0, None]] + + def execute(self): + """Get crop/scale factors to the corresponding input size""" + return self.scale_list + + +############################################################################# +class OUT1944x2592: + """Same as OUT_1080x1920""" + + def __init__(self, new_size): + self.new_size = new_size + + if self.new_size == (1440, 2560): + self.scale_list = [[1, 24, (3, 4)], [1, 32, None]] + + elif self.new_size == (1080, 1920): + self.scale_list = [[1, 54, (4, 7)], [1, 32, (3, 4)]] + + elif self.new_size == (960, 1280): + self.scale_list = [[2, 16, None], [2, 12, None]] + + elif self.new_size == (720, 1280): + self.scale_list = [[2, 16, (3, 4)], [2, 12, None]] + + elif self.new_size == (480, 640): + self.scale_list = [[4, 6, None], [4, 8, None]] + + elif self.new_size == (360, 640): + self.scale_list = [[4, 6, (3, 4)], [4, 8, None]] + + else: + self.scale_list = [[1, 0, None], [1, 0, None]] + + def execute(self): + """Get crop/scale factors to the corresponding input size""" + return self.scale_list diff --git a/modules/sharpen.py b/modules/sharpen.py deleted file mode 100644 index 2296c98..0000000 --- a/modules/sharpen.py +++ /dev/null @@ -1,21 +0,0 @@ -# File: sharpen.py -# Description: -# Code / Paper Reference: -# Author: xx-isp (ispinfinite@gmail.com) - -import numpy as np - -class Sharpening: - def __init__(self, img, sensor_info, parm_sha): - self.img = img - self.enable = parm_sha['isEnable'] - self.sensor_info = sensor_info - self.parm_sha = parm_sha - - def execute(self): - print('Sharpening = ' + str(self.enable)) - - if self.enable == False: - return self.img - else: - return self.img \ No newline at end of file diff --git a/modules/sharpen/sharpen.py b/modules/sharpen/sharpen.py new file mode 100644 index 0000000..7c7190d --- /dev/null +++ b/modules/sharpen/sharpen.py @@ -0,0 +1,63 @@ +""" +File: sharpen.py +Description: Implements sharpening for Infinite-ISP. +Code / Paper Reference: +Author: 10xEngineers Pvt Ltd +""" + +import time +from modules.sharpen.unsharp_masking import UnsharpMasking as USM + +from util.utils import save_output_array_yuv + + +class Sharpening: + """ + Sharpening + """ + + def __init__(self, img, platform, sensor_info, parm_sha, conv_std): + self.img = img + self.enable = parm_sha["is_enable"] + self.sensor_info = sensor_info + self.parm_sha = parm_sha + self.is_save = parm_sha["is_save"] + self.platform = platform + self.conv_std = conv_std + + def apply_unsharp_masking(self): + """ + Apply function for Shapening Algorithm - Unsharp Masking + """ + usm = USM( + self.img, self.parm_sha["sharpen_sigma"], self.parm_sha["sharpen_strength"] + ) + return usm.apply_sharpen() + + def save(self): + """ + Function to save module output + """ + if self.is_save: + save_output_array_yuv( + self.platform["in_file"], + self.img, + "Out_Shapening_", + self.platform, + self.conv_std, + ) + + def execute(self): + """ + Applying sharpening to input image + """ + print("Sharpening = " + str(self.enable)) + + if self.enable is True: + start = time.time() + s_out = self.apply_unsharp_masking() + print(f" Execution time: {time.time() - start:.3f}s") + self.img = s_out + + self.save() + return self.img diff --git a/modules/sharpen/unsharp_masking.py b/modules/sharpen/unsharp_masking.py new file mode 100644 index 0000000..d0e31f1 --- /dev/null +++ b/modules/sharpen/unsharp_masking.py @@ -0,0 +1,43 @@ +""" +File: sharpen.py +Description: Simple unsharp masking with frequency and strength control. +Code / Paper Reference: +Author: 10xEngineers Pvt Ltd +""" +import numpy as np +from scipy import ndimage + + +class UnsharpMasking: + """ + Implements Unsharp Masking Algorithm + """ + + def __init__(self, img, sharpen_sigma, sharpen_strength): + self.img = img + self.sharpen_sigma = sharpen_sigma + self.sharpen_strength = sharpen_strength + + def apply_sharpen(self): + """ + Applying sharpening to the input image + """ + luma = np.float32(self.img[:, :, 0]) + + # if self.img.dtype == "float32": + # luma = np.round(255 * luma).astype(np.uint8) + + # Filter the luma component of the image with a Gaussian LPF + # Smoothing magnitude can be controlled with the sharpen_sigma parameter + smoothened = ndimage.gaussian_filter(luma, self.sharpen_sigma) + # Sharpen the image with upsharp mask + # Strength is tuneable with the sharpen_strength parameter + sharpened = luma + ((luma - smoothened) * self.sharpen_strength) + + if self.img.dtype == "float32": + # sharpened = np.float32((sharpened) / 255.0) + # out = sharpened.astype("float32") + self.img[:, :, 0] = np.clip(sharpened, 0, 1) + else: + self.img[:, :, 0] = np.uint8(np.clip(sharpened, 0, 255)) + return self.img diff --git a/modules/tone_mapping.py b/modules/tone_mapping.py deleted file mode 100644 index 4ff47a2..0000000 --- a/modules/tone_mapping.py +++ /dev/null @@ -1,25 +0,0 @@ -# File: tone_mapping.py -# Description: -# Code / Paper Reference: -# Author: xx-isp (ispinfinite@gmail.com) -#------------------------------------------------------------ - -import numpy as np - - -class ToneMapping: - 'Tone Mapping' - - def __init__(self, img, sensor_info, parm_tmp): - self.img = img - self.enable = parm_tmp['isEnable'] - self.sensor_info = sensor_info - self.parm_tmp = parm_tmp - - def execute(self): - print('Tone Mapping = ' + str(self.enable)) - - if self.enable == False: - return self.img - else: - return self.img diff --git a/modules/white_balance.py b/modules/white_balance.py deleted file mode 100644 index 3091d74..0000000 --- a/modules/white_balance.py +++ /dev/null @@ -1,105 +0,0 @@ -# File: white_balance.py -# Description: Applies the white balance gains from the config file -# Code / Paper Reference: -# Author: xx-isp (ispinfinite@gmail.com) -#------------------------------------------------------------ -import numpy as np - - -class WhiteBalance: - 'White balancing' - - def __init__(self, img, sensor_info, parm_wbc): - self.img = img - self.enable = parm_wbc['isEnable'] - self.auto = parm_wbc['isAuto'] - self.sensor_info = sensor_info - self.parm_wbc = parm_wbc - - def apply_wb_parameters(self): - - #get config params - redgain = self.parm_wbc['r_gain'] - bluegain = self.parm_wbc['b_gain'] - self.bayer = self.sensor_info['bayer_pattern'] - self.bpp = self.sensor_info['bitdep'] - self.raw = np.float32(self.img) - - if self.bayer == 'rggb': - self.raw[::2, ::2] = self.raw[::2, ::2] * redgain - self.raw[1::2, 1::2] = self.raw[1::2, 1::2] * bluegain - elif self.bayer == 'bggr': - self.raw[::2, ::2] = self.raw[::2, ::2] * bluegain - self.raw[1::2, 1::2] = self.raw[1::2, 1::2] * redgain - elif self.bayer == 'grbg': - self.raw[1::2, ::2] = self.raw[1::2, ::2] * bluegain - self.raw[::2, 1::2] = self.raw[::2, 1::2] * redgain - elif self.bayer == 'gbrg': - self.raw[1::2, ::2] = self.raw[1::2, ::2] * redgain - self.raw[::2, 1::2] = self.raw[::2, 1::2] * bluegain - - raw_whitebal = np.uint16(np.clip(self.raw, 0, (2**self.bpp)-1)) - - return raw_whitebal - - # This function should be a part of auto white balancing or the tuning tool - def apply_grayworld(self): - - # raw: raw input image - # bayer: the bayer pattern of the raw image (rggb/bggr/grbg/gbrg) - # bpp: the required bit-width of each pixel in the RAW image (8 to 16 bit) - # returns greyworld white balanced raw image - - self.bayer = self.sensor_info['bayer_pattern'] - self.bpp = self.sensor_info['bitdep'] - self.raw = self.img - - self.raw = np.float32(self.raw) - if self.bayer == 'rggb': - red_mean = self.raw[::2, ::2].mean() - green_mean = (self.raw[::2, 1::2].mean() + self.raw[1::2, ::2].mean()) / 2 - blue_mean = self.raw[1::2, 1::2].mean() - elif self.bayer == 'bggr': - blue_mean = self.raw[::2, ::2].mean() - green_mean = (self.raw[::2, 1::2].mean() + self.raw[1::2, ::2].mean()) / 2 - red_mean = self.raw[1::2, 1::2].mean() - elif self.bayer == 'grbg': - red_mean = self.raw[::2, 1::2].mean() - green_mean = (self.raw[::2, ::2].mean() + self.raw[1::2, 1::2].mean()) / 2 - blue_mean = self.raw[1::2, ::2].mean() - elif self.bayer == 'gbrg': - red_mean = self.raw[1::2, ::2].mean() - green_mean = (self.raw[::2, ::2].mean() + self.raw[1::2, 1::2].mean()) / 2 - blue_mean = self.raw[::2, 1::2].mean() - - redgain, bluegain = green_mean/red_mean, green_mean/blue_mean - - if self.bayer == 'rggb': - self.raw[::2, ::2] = self.raw[::2, ::2] * redgain - self.raw[1::2, 1::2] = self.raw[1::2, 1::2] * bluegain - elif self.bayer == 'bggr': - self.raw[::2, ::2] = self.raw[::2, ::2] * bluegain - self.raw[1::2, 1::2] = self.raw[1::2, 1::2] * redgain - elif self.bayer == 'grbg': - self.raw[1::2, ::2] = self.raw[1::2, ::2] * bluegain - self.raw[::2, 1::2] = self.raw[::2, 1::2] * redgain - elif self.bayer == 'gbrg': - self.raw[1::2, ::2] = self.raw[1::2, ::2] * redgain - self.raw[::2, 1::2] = self.raw[::2, 1::2] * bluegain - - raw_whitebal = np.uint16(np.clip(self.raw, 0, (2**self.bpp)-1)) - - return raw_whitebal - - def execute(self): - - - if self.enable == True and self.auto == False: - print('White balancing = ' + "True") - return self.apply_wb_parameters() - - print('Manual White balancing = ' + "False") - return self.img - - - \ No newline at end of file diff --git a/modules/white_balance/white_balance.py b/modules/white_balance/white_balance.py new file mode 100644 index 0000000..6b2880a --- /dev/null +++ b/modules/white_balance/white_balance.py @@ -0,0 +1,93 @@ +""" +File: white_balance.py +Description: Applies the white balance gains from the config file +Code / Paper Reference: +Author: 10xEngineers Pvt Ltd +------------------------------------------------------------ +""" +import time +import numpy as np + +from util.utils import save_output_array + + +class WhiteBalance: + """ + White balance Module + """ + + def __init__(self, img, platform, sensor_info, parm_wbc): + """ + Class Constructor + """ + self.img = img.copy() + self.enable = parm_wbc["is_enable"] + self.is_save = parm_wbc["is_save"] + self.is_auto = parm_wbc["is_auto"] + self.is_debug = parm_wbc["is_debug"] + self.platform = platform + self.sensor_info = sensor_info + self.parm_wbc = parm_wbc + self.bayer = self.sensor_info["bayer_pattern"] + self.bpp = self.sensor_info["bit_depth"] + self.raw = None + + def apply_wb_parameters(self): + """ + Applies white balance gains from config file to raw images + """ + + # get config params + redgain = self.parm_wbc["r_gain"] + bluegain = self.parm_wbc["b_gain"] + self.raw = np.float32(self.img) + + if self.is_debug: + print(" - WB - red gain : ", redgain) + print(" - WB - blue gain: ", bluegain) + + if self.bayer == "rggb": + self.raw[::2, ::2] = self.raw[::2, ::2] * redgain + self.raw[1::2, 1::2] = self.raw[1::2, 1::2] * bluegain + elif self.bayer == "bggr": + self.raw[::2, ::2] = self.raw[::2, ::2] * bluegain + self.raw[1::2, 1::2] = self.raw[1::2, 1::2] * redgain + elif self.bayer == "grbg": + self.raw[1::2, ::2] = self.raw[1::2, ::2] * bluegain + self.raw[::2, 1::2] = self.raw[::2, 1::2] * redgain + elif self.bayer == "gbrg": + self.raw[1::2, ::2] = self.raw[1::2, ::2] * redgain + self.raw[::2, 1::2] = self.raw[::2, 1::2] * bluegain + + raw_whitebal = np.uint16(np.clip(self.raw, 0, (2**self.bpp) - 1)) + + return raw_whitebal + + def save(self): + """ + Function to save module output + """ + if self.is_save: + save_output_array( + self.platform["in_file"], + self.img, + "Out_white_balance_", + self.platform, + self.sensor_info["bit_depth"], + self.sensor_info["bayer_pattern"], + ) + + def execute(self): + """ + Execute White Balance Module + """ + + if self.enable is True: + print("White balancing = " + "True") + start = time.time() + wb_out = self.apply_wb_parameters() + print(f" Execution time: {time.time() - start:.3f}s") + self.img = wb_out + + self.save() + return self.img diff --git a/modules/yuv_conv_format.py b/modules/yuv_conv_format.py deleted file mode 100644 index c928bf0..0000000 --- a/modules/yuv_conv_format.py +++ /dev/null @@ -1,54 +0,0 @@ -# File: yuv_conv_format.py -# Description: -# Code / Paper Reference: https://web.archive.org/web/20190220164028/http://www.sunrayimage.com/examples.html -# https://en.wikipedia.org/wiki/YUV -# https://learn.microsoft.com/en-us/windows/win32/medfound/recommended-8-bit-yuv-formats-for-video-rendering -# https://www.flir.com/support-center/iis/machine-vision/knowledge-base/understanding-yuv-data-formats/ -# Author: xx-isp (ispinfinite@gmail.com) -#------------------------------------------------------------ - -import numpy as np -from matplotlib import pyplot as plt - - -class YUVConvFormat: - 'YUV Conversion Formats - 444, 442' - - - def __init__(self, img, sensor_info, parm_yuv, inputfile_name, parm_csc): - self.img = img - self.enable = parm_yuv['isEnable'] - #self.is_csc_enable = parm_csc['isEnable'] - self.sensor_info = sensor_info - self.param_yuv = parm_yuv - self.infile = inputfile_name - - def convert2yuv_format(self): - conv_type = self.param_yuv['conv_type'] - - if conv_type == '422': - y0 = self.img[:, 0::2, 0].reshape(-1, 1) - u = self.img[:, 0::2, 1].reshape(-1, 1) - v = self.img[:, 0::2, 2].reshape(-1, 1) - y1 = self.img[:, 1::2, 0].reshape(-1, 1) - yuv = np.concatenate([y0, u, y1, v], axis=1) - - elif conv_type == '444': - y0 = self.img[:,:,0].reshape(-1,1) - u0 = self.img[:,:,1].reshape(-1,1) - v0 = self.img[:,:,2].reshape(-1,1) - yuv = np.concatenate([y0, u0, v0], axis=1) - - out_path = './out_frames/out_' + self.infile + '.yuv' - - raw_wb = open(out_path, 'wb') - yuv.flatten().tofile(raw_wb) - raw_wb.close() - - def execute(self): - print('YUV conversion format '+ self.param_yuv['conv_type'] + ' = ' + str(self.enable)) - - if (self.enable) == False: - return self.img - else: - return self.convert2yuv_format() diff --git a/modules/yuv_conv_format/yuv_conv_format.py b/modules/yuv_conv_format/yuv_conv_format.py new file mode 100644 index 0000000..6c9cece --- /dev/null +++ b/modules/yuv_conv_format/yuv_conv_format.py @@ -0,0 +1,104 @@ +""" +File: yuv_conv_format.py +Description: +Code / Paper Reference: +- https://web.archive.org/web/20190220164028/http://www.sunrayimage.com/examples.html +- https://en.wikipedia.org/wiki/YUV +- https://learn.microsoft.com/en-us/windows/win32/medfound/recommended-8-bit-yuv-formats- + for-video-rendering +- https://www.flir.com/support-center/iis/machine-vision/knowledge-base/understanding-yuv- + data-formats/ +Author: 10xEngineers Pvt Ltd +------------------------------------------------------------ +""" +import time +import re +import numpy as np + +from util.utils import save_output_array + + +class YUVConvFormat: + "YUV Conversion Formats - 444, 442" + + def __init__(self, img, platform, sensor_info, parm_yuv): # parm_csc): + self.img = img + self.shape = img.shape + self.enable = parm_yuv["is_enable"] + # self.is_csc_enable = parm_csc['is_enable'] + self.sensor_info = sensor_info + self.param_yuv = parm_yuv + self.is_save = parm_yuv["is_save"] + self.platform = platform + self.in_file = self.platform["in_file"] + + def convert2yuv_format(self): + """Execute YUV conversion.""" + conv_type = self.param_yuv["conv_type"] + + if conv_type == "422": + y_0 = self.img[:, 0::2, 0].reshape(-1, 1) + u_ch = self.img[:, 0::2, 1].reshape(-1, 1) + v_ch = self.img[:, 0::2, 2].reshape(-1, 1) + y_1 = self.img[:, 1::2, 0].reshape(-1, 1) + yuv = np.concatenate([y_0, u_ch, y_1, v_ch], axis=1) + + elif conv_type == "444": + y_0 = self.img[:, :, 0].reshape(-1, 1) + u_0 = self.img[:, :, 1].reshape(-1, 1) + v_0 = self.img[:, :, 2].reshape(-1, 1) + yuv = np.concatenate([y_0, u_0, v_0], axis=1) + + out_path = "./out_frames/out_" + self.in_file + ".yuv" + + raw_wb = open(out_path, "wb") + yuv.flatten().tofile(raw_wb) + raw_wb.close() + + return yuv.flatten() + + def save(self): + """ + Function to save module output + """ + # update size of array in filename + self.in_file = re.sub( + r"\d+x\d+", f"{self.shape[1]}x{self.shape[0]}", self.in_file + ) + if self.is_save: + # save format for yuv_conversion_format is .npy only + save_format = self.platform["save_format"] + self.platform["save_format"] = "npy" + + save_output_array( + self.in_file, + self.img, + f"Out_yuv_conversion_format_{self.param_yuv['conv_type']}_", + self.platform, + self.sensor_info["bit_depth"], + self.sensor_info["bayer_pattern"], + ) + # restore the original save format + self.platform["save_format"] = save_format + + def execute(self): + """Execute YUV conversion if enabled.""" + print( + "YUV conversion format " + + self.param_yuv["conv_type"] + + " = " + + str(self.enable) + ) + + if self.enable: + if self.platform["rgb_output"]: + print("Invalid input for YUV conversion: RGB image format.") + self.param_yuv["is_enable"] = False + else: + start = time.time() + yuv = self.convert2yuv_format() + print(f" Execution time: {time.time() - start:.3f}s") + self.img = yuv + + self.save() + return self.img diff --git a/util/config_utils.py b/util/config_utils.py new file mode 100644 index 0000000..450b0c3 --- /dev/null +++ b/util/config_utils.py @@ -0,0 +1,63 @@ +""" +Helper functions for automatic config file parameter update +""" + +import re +import rawpy +import numpy as np + + +def parse_file_name(filename): + """ + Parse the file name + """ + # Expected pattern for file name + pattern = r"(.+)_(\d+)x(\d+)_(\d+)(?:bit|bits)_(RGGB|GRBG|GBRG|BGGR)" + # Check pattern in the string + match_parttern = re.match(pattern, filename) + if match_parttern: + _, width, height, bit_depth, bayer = match_parttern.groups() + # Convert width, height, and bits to integers and bayer tp lower case + return [int(width), int(height), int(bit_depth), bayer.lower()] + return False + + +def extract_raw_metadata(filename): + """ + Extract Exif/Metadata Information from Raw File + """ + with rawpy.imread(filename) as raw: + + # Get the Bayer pattern + # The pattern is returned as a 2D numpy array, where 0=red, 1=green, 2=blue + bayer_array = raw.raw_pattern + # Map the numerical values to color letters + color_map = {0: "r", 1: "g", 2: "b", 3: "g"} + bayer_pattern = "".join((np.vectorize(color_map.get)(bayer_array)).flatten()) + + # Get the bit depth + # The white_level attribute gives the maximum possible value + # for a pixel, which can be used to infer the bit depth + white_level = raw.white_level + bit_depth = white_level.bit_length() + + # Get the dimensions + # These are the dimensions of the raw image data, + # which includes any extra pixels around the edges + # used by some cameras + height, width = raw.raw_image.shape + + black_level = raw.black_level_per_channel + wb_gains = raw.camera_whitebalance + ccm = raw.color_matrix + + return [ + int(width), + int(height), + int(bit_depth), + bayer_pattern, + black_level, + white_level, + wb_gains, + ccm, + ] diff --git a/util/gen_requirements.py b/util/gen_requirements.py index 38477d0..ef9bdfd 100644 --- a/util/gen_requirements.py +++ b/util/gen_requirements.py @@ -1,11 +1,13 @@ -# Script for generating requirements.txt for this project -# Would'nt it be silly to run this file without python and pip +""" +Script for generating requirements.txt for this project +Would'nt it be silly to run this file without python and pip +""" import subprocess -x = subprocess.check_output(["pip", "freeze"]).decode() +X = subprocess.check_output(["pip", "freeze"]).decode() -if ("pipreqs" not in x) : - subprocess.run( ["pip", "install", "pipreqs"] ) +if "pipreqs" not in X: + subprocess.run(["pip", "install", "pipreqs"], check=True) -subprocess.run( ["pipreqs", "--force"] ) +subprocess.run(["pipreqs", "--force"], check=True) diff --git a/util/utils.py b/util/utils.py index e67c832..523d938 100644 --- a/util/utils.py +++ b/util/utils.py @@ -1,118 +1,412 @@ -# File: utils.py -# Description: Common helper functions for all algorithms -# Code / Paper Reference: -# Author: xx-isp (ispinfinite@gmail.com) -#------------------------------------------------------------ +"""File: utils.py +Description: Common helper functions for all algorithms +Code / Paper Reference: +Author: 10xEngineers Pvt Ltd +------------------------------------------------------------ +""" +import os +from datetime import datetime import random -import numpy as np import warnings +from pathlib import Path +import numpy as np +import yaml from scipy.signal import correlate2d +import matplotlib.pyplot as plt +from modules.demosaic.malvar_he_cutler import Malvar as MAL + + +# Infinite-ISP output directory +OUTPUT_DIR = "out_frames/" + +# Output directory for Module output +OUTPUT_ARRAY_DIR = "./module_output/" def introduce_defect(img, total_defective_pixels, padding): - + """ - This function randomly replaces pixels values with extremely high or low pixel values to create dead pixels (Dps). - Note that the defective pixel values are never introduced on the periphery of the image to ensure that there - are no adjacent DPs. - + This function randomly replaces pixels values with extremely high or low + pixel values to create dead pixels (Dps). + Note that the defective pixel values are never introduced on the periphery + of the image to ensure that there are no adjacent DPs. Parameters ---------- img: 2D ndarray total_defective_pixels: number of Dps to introduce in img. padding: bool value (set to True to add padding) - Returns ------- - defective image: image/padded img containing specified (by TOTAL_DEFECTIVE_PIXELS) + defective image: image/padded img containing specified (by TOTAL_DEFECTIVE_PIXELS) number of dead pixels. - orig_val: ndarray of size same as img/padded img containing original pixel values in place of introduced DPs - and zero elsewhere. + orig_val: ndarray of size same as img/padded img containing original pixel values + in place of introduced DPs and zero elsewhere. """ - + if padding: - padded_img = np.pad(img, ((2,2), (2,2)), "reflect") + padded_img = np.pad(img, ((2, 2), (2, 2)), "reflect") else: - padded_img = img.copy() - - orig_val = np.zeros((padded_img.shape[0], padded_img.shape[1])) - + padded_img = img.copy() + + orig_val = np.zeros((padded_img.shape[0], padded_img.shape[1])) + while total_defective_pixels: - defect = [random.randrange(1,15), random.randrange(4081, 4095)] # stuck low int b/w 1 and 15, stuck high float b/w 4081 and 4095 - defect_val = defect[random.randint(0,1)] - random_row, random_col = random.randint(2, img.shape[0]-3), random.randint(2, img.shape[1]-3) - left, right = orig_val[random_row, random_col-2], orig_val[random_row, random_col+2] - top, bottom = orig_val[random_row-2, random_col], orig_val[random_row+2, random_col] - neighbours = [left, right, top, bottom] - - if not any(neighbours) and orig_val[random_row, random_col]==0: # if all neighbouring values in orig_val are 0 and the pixel itself is not defective - orig_val[random_row, random_col] = padded_img[random_row, random_col] + defect = [ + random.randrange(1, 15), + random.randrange(4081, 4095), + ] # stuck low int b/w 1 and 15, stuck high float b/w 4081 and 4095 + defect_val = defect[random.randint(0, 1)] + random_row, random_col = random.randint(2, img.shape[0] - 3), random.randint( + 2, img.shape[1] - 3 + ) + left, right = ( + orig_val[random_row, random_col - 2], + orig_val[random_row, random_col + 2], + ) + top, bottom = ( + orig_val[random_row - 2, random_col], + orig_val[random_row + 2, random_col], + ) + neighbours = [left, right, top, bottom] + + if ( + not any(neighbours) and orig_val[random_row, random_col] == 0 + ): # if all neighbouring values in orig_val are 0 and the pixel itself is not defective + orig_val[random_row, random_col] = padded_img[random_row, random_col] padded_img[random_row, random_col] = defect_val - total_defective_pixels-=1 - + total_defective_pixels -= 1 + return padded_img, orig_val -def gaussKernRAW(N, stdDev, stride): - """ - This function takes in size, standard deviation and spatial stride required for adjacet weights to output a gaussian kernel of size NxN +def gauss_kern_raw(size, std_dev, stride): + """ + This function takes in size, standard deviation and spatial stride required for adjacet + weights to output a gaussian kernel of size NxN Parameters ---------- - N: size of gaussian kernel, odd - stdDev: standard deviation of the gaussian kernel + size: size of gaussian kernel, odd + std_dev: standard deviation of the gaussian kernel stride: spatial stride between to be considered for adjacent gaussian weights - Returns ------- outKern: an output gaussian kernel of size NxN """ - if N%2 == 0: - warnings.warn('kernel size (N) cannot be even, setting it as odd value') - N = N + 1 + if size % 2 == 0: + warnings.warn("kernel size (N) cannot be even, setting it as odd value") + size = size + 1 + + if size <= 0: + warnings.warn("kernel size (N) cannot be <= zero, setting it as 3") + size = 3 - if N <= 0: - warnings.warn('kernel size (N) cannot be <= zero, setting it as 3') - N = 3 - - outKern = np.zeros((N,N), dtype=np.float32) + out_kern = np.zeros((size, size), dtype=np.float32) - for i in range(0,N): - for j in range (0,N): - outKern[i,j] = np.exp(-1 * ((stride*(i - ((N-1)/2)))**2 + (stride*(j - ((N-1)/2)))**2) / (2 * (stdDev**2))) - - sumKern = np.sum(outKern) - outKern[0:N:1, 0:N:1] = outKern[0:N:1, 0:N:1] / sumKern + for i in range(0, size): + for j in range(0, size): + out_kern[i, j] = np.exp( + -1 + * ( + (stride * (i - ((size - 1) / 2))) ** 2 + + (stride * (j - ((size - 1) / 2))) ** 2 + ) + / (2 * (std_dev**2)) + ) + + sum_kern = np.sum(out_kern) + out_kern[0:size:1, 0:size:1] = out_kern[0:size:1, 0:size:1] / sum_kern + + return out_kern - return outKern def crop(img, rows_to_crop=0, cols_to_crop=0): - + """ Crop 2D array. Parameter: --------- img: image (2D array) to be cropped. - rows_to_crop: Number of rows to crop. If it is an even integer, - equal number of rows are cropped from either side of the image. + rows_to_crop: Number of rows to crop. If it is an even integer, + equal number of rows are cropped from either side of the image. Otherwise the image is cropped from the extreme right/bottom. cols_to_crop: Number of columns to crop. Works exactly as rows_to_crop. - Output: cropped image """ - + if rows_to_crop: - if rows_to_crop%2==0: - img = img[rows_to_crop//2:-rows_to_crop//2, :] + if rows_to_crop % 2 == 0: + img = img[rows_to_crop // 2 : -rows_to_crop // 2, :] else: img = img[0:-1, :] - if cols_to_crop: - if cols_to_crop%2==0: - img = img[:, cols_to_crop//2:-cols_to_crop//2] + if cols_to_crop: + if cols_to_crop % 2 == 0: + img = img[:, cols_to_crop // 2 : -cols_to_crop // 2] else: - img = img[:, 0:-1] + img = img[:, 0:-1] return img + def stride_convolve2d(matrix, kernel): - return correlate2d(matrix, kernel, mode="valid")[::kernel.shape[0], ::kernel.shape[1]] \ No newline at end of file + """2D convolution""" + return correlate2d(matrix, kernel, mode="valid")[ + :: kernel.shape[0], :: kernel.shape[1] + ] + + +def display_ae_statistics(ae_feedback, awb_gains): + """ + Print AE Stats for current frame + """ + # Logs for AWB + if awb_gains is None: + print(" - 3A Stats - AWB is Disable") + else: + print(" - 3A Stats - AWB Rgain = ", awb_gains[0]) + print(" - 3A Stats - AWB Bgain = ", awb_gains[1]) + + # Logs for AE + if ae_feedback is None: + print(" - 3A Stats - AE is Disable") + else: + if ae_feedback < 0: + print(" - 3A Stats - AE Feedback = Underexposed") + elif ae_feedback > 0: + print(" - 3A Stats - AE Feedback = Overexposed") + else: + print(" - 3A Stats - AE Feedback = Correct Exposure") + + +def reconstruct_yuv_from_422_custom(yuv_422_custom, width, height): + """ + Reconstruct a YUV from YUV 422 format + """ + # Create an empty 3D YUV image (height, width, channels) + yuv_img = np.zeros((height, width, 3), dtype=np.uint8) + + # Rearrange the flattened 4:2:2 YUV data back to 3D YUV format + yuv_img[:, 0::2, 0] = yuv_422_custom[0::4].reshape(height, -1) + yuv_img[:, 0::2, 1] = yuv_422_custom[1::4].reshape(height, -1) + yuv_img[:, 1::2, 0] = yuv_422_custom[2::4].reshape(height, -1) + yuv_img[:, 0::2, 2] = yuv_422_custom[3::4].reshape(height, -1) + + # Replicate the U and V (chroma) channels to the odd columns + yuv_img[:, 1::2, 1] = yuv_img[:, 0::2, 1] + yuv_img[:, 1::2, 2] = yuv_img[:, 0::2, 2] + + return yuv_img + + +def reconstruct_yuv_from_444_custom(yuv_444_custom, width, height): + """ + Reconstruct a YUV from YUV 444 format + """ + # Create an empty 3D YUV image (height, width, channels) + yuv_img = np.zeros((height, width, 3), dtype=np.uint8) + + # Rearrange the flattened 4:2:2 YUV data back to 3D YUV format + yuv_img[:, 0::1, 0] = yuv_444_custom[0::3].reshape(height, -1) + yuv_img[:, 0::1, 1] = yuv_444_custom[1::3].reshape(height, -1) + yuv_img[:, 0::1, 2] = yuv_444_custom[2::3].reshape(height, -1) + + return yuv_img + + +def get_image_from_yuv_format_conversion(yuv_img, height, width, yuv_custom_format): + """ + Convert YUV image into RGB based on its format & Conversion Standard + """ + + # Reconstruct the 3D YUV image from the custom given format YUV data + if yuv_custom_format == "422": + yuv_img = reconstruct_yuv_from_422_custom(yuv_img, width, height) + else: + yuv_img = reconstruct_yuv_from_444_custom(yuv_img, width, height) + + return yuv_img + + +def save_pipeline_output(img_name, output_img, config_file): + """ + Saves the output image (png) and config file in OUTPUT_DIR + """ + + # Time Stamp for output filename + dt_string = datetime.now().strftime("_%Y%m%d_%H%M%S") + + # Set list format to flowstyle to dump yaml file + yaml.add_representer(list, represent_list) + + # Storing configuration file for output image + with open( + OUTPUT_DIR + img_name + dt_string + ".yaml", "w", encoding="utf-8" + ) as file: + yaml.dump( + config_file, + file, + sort_keys=False, + Dumper=CustomDumper, + width=17000, + ) + + # Save Image as .png + plt.imsave(OUTPUT_DIR + img_name + dt_string + ".png", output_img) + + +# utilities to save the config_automate exactly as config.yml +class CustomDumper(yaml.Dumper): + + """This class is a custom YAML dumper that overrides the default behavior + of the increase_indent and write_line_break methods. It ensures that indentations + and line breaks are inserted correctly in the output YAML file.""" + + def increase_indent(self, flow=False, indentless=False): + """For indentation""" + return super(CustomDumper, self).increase_indent(flow, False) + + def write_line_break(self, data=None): + """For line break""" + super().write_line_break(data) + if len(self.indents) == 1: + self.stream.write("\n") + + +def represent_list(self, data): + """This function ensures that the lookup table are stored on flow style + to keep the saved yaml file readable.""" + return self.represent_sequence("tag:yaml.org,2002:seq", data, flow_style=True) + + +def save_output_array( + img_name, output_array, module_name, platform, bitdepth, bayer_pattern +): + """ + Saves output array [raw/rgb] for pipline modules + """ + + # create directory to save array + if not os.path.exists(OUTPUT_ARRAY_DIR): + Path(OUTPUT_ARRAY_DIR).mkdir(parents=True, exist_ok=False) + + # filename identifies input image and isp pipeline module for which testing + # vector is generated + filename = OUTPUT_ARRAY_DIR + module_name + img_name.split(".")[0] + + if platform["save_format"] == "npy" or platform["save_format"] == "both": + + # save image as npy array + np.save(filename, output_array.astype("uint16")) + + if platform["save_format"] == "png" or platform["save_format"] == "both": + + # for 1-channel raw: convert raw image to 8-bit rgb image + if len(output_array.shape) == 2: + output_array = apply_cfa(output_array, bitdepth, bayer_pattern) + + # convert image to 8-bit image if required + if output_array.dtype != np.uint8: + shift_by = bitdepth - 8 + output_array = (output_array >> shift_by).astype("uint8") + + # save Image as .png + plt.imsave(filename + ".png", output_array) + + +def save_output_array_yuv(img_name, output_array, module_name, platform, conv_std): + + """ + Saves output array [yuv] for pipline modules + """ + # create directory to save array + if not os.path.exists(OUTPUT_ARRAY_DIR): + Path(OUTPUT_ARRAY_DIR).mkdir(parents=True, exist_ok=False) + + # filename identifies input image and isp pipeline module for which testing + # vector is generated + filename = OUTPUT_ARRAY_DIR + module_name + img_name.split(".")[0] + + # save image as .npy array + if platform["save_format"] == "npy" or platform["save_format"] == "both": + np.save(filename, output_array.astype("uint16")) + + # save image as .png + if platform["save_format"] == "png" or platform["save_format"] == "both": + # convert the yuv image to RGB image + output_array = yuv_to_rgb(output_array, conv_std) + plt.imsave(filename + ".png", output_array) + + +def yuv_to_rgb(yuv_img, conv_std): + """ + YUV-to-RGB Colorspace conversion 8bit + """ + + # make nx3 2d matrix of image + mat_2d = yuv_img.reshape((yuv_img.shape[0] * yuv_img.shape[1], 3)) + + # convert to 3xn for matrix multiplication + mat2d_t = mat_2d.transpose() + + # subract the offsets + mat2d_t = mat2d_t - np.array([[16, 128, 128]]).transpose() + + if conv_std == 1: + # for BT. 709 + yuv2rgb_mat = np.array([[74, 0, 114], [74, -13, -34], [74, 135, 0]]) + else: + # for BT.601/407 + # conversion metrix with 8bit integer co-efficients - m=8 + yuv2rgb_mat = np.array([[64, 87, 0], [64, -44, -20], [61, 0, 105]]) + + # convert to RGB + rgb_2d = np.matmul(yuv2rgb_mat, mat2d_t) + rgb_2d = rgb_2d >> 6 + + # reshape the image back + rgb2d_t = rgb_2d.transpose() + yuv_img = rgb2d_t.reshape(yuv_img.shape).astype(np.float32) + + # clip the resultant img as it can have neg rgb values for small Y' + yuv_img = np.float32(np.clip(yuv_img, 0, 255)) + + # convert the image to [0-255] + yuv_img = np.uint8(yuv_img) + return yuv_img + + +def masks_cfa_bayer(img, bayer): + """ + Generating masks for the given bayer pattern + """ + + # dict will be creating 3 channel boolean type array of given shape with the name + # tag like 'r_channel': [False False ....] , 'g_channel': [False False ....] , + # 'b_channel': [False False ....] + channels = dict((channel, np.zeros(img.shape, dtype=bool)) for channel in "rgb") + + # Following comment will create boolean masks for each channel r_channel, + # g_channel and b_channel + for channel, (y_channel, x_channel) in zip(bayer, [(0, 0), (0, 1), (1, 0), (1, 1)]): + channels[channel][y_channel::2, x_channel::2] = True + + # tuple will return 3 channel boolean pattern for r_channel, + # g_channel and b_channel with True at corresponding value + # For example in rggb pattern, the r_channel mask would then be + # [ [ True, False, True, False], [ False, False, False, False]] + return tuple(channels[c] for c in "rgb") + + +def apply_cfa(img, bit_depth, bayer): + """ + Demosaicing the given raw image using given algorithm + """ + # 3D masks according to the given bayer + masks = masks_cfa_bayer(img, bayer) + mal = MAL(img, masks) + demos_out = mal.apply_malvar() + + # Clipping the pixels values within the bit range + demos_out = np.clip(demos_out, 0, 2**bit_depth - 1) + demos_out = np.uint16(demos_out) + return demos_out