```
├── .github/
├── workflows/
├── cf_pages.yml (200 tokens)
├── gh_pages.yml (400 tokens)
├── release.yaml (2.2k tokens)
├── rust.yml (900 tokens)
├── .gitignore
├── .typos.toml
├── Cargo.lock (omitted)
├── Cargo.toml (500 tokens)
├── LICENSE (omitted)
├── README.md (400 tokens)
├── Trunk.toml
├── assets/
├── android-chrome-192x192.png
├── android-chrome-512x512.png
├── apple-touch-icon.png
├── favicon-16x16.png
├── favicon-32x32.png
├── favicon.ico
├── github-mark-white.svg (200 tokens)
├── icon128.png
├── linux/
├── icon.png
├── macos/
├── icon.icns
├── manifest.json (100 tokens)
├── mug.webp
├── pfp_transparent.png
├── phone_case.webp
├── pillow.png
├── pillow.webp
├── shirt.webp
├── sw.js (100 tokens)
├── example.gif
├── flake.lock (omitted)
├── flake.nix (900 tokens)
├── index.html (2.9k tokens)
├── presets/
├── blackhole/
├── assignments.json (17.4k tokens)
├── output.png
├── source.png
├── target.png
├── cat/
├── assignments.json (17.4k tokens)
├── output.png
├── source.png
├── target.png
├── cat2/
├── assignments.json (17.4k tokens)
├── output.png
├── source.png
├── target.png
├── colorful/
├── assignments.json (17.4k tokens)
├── output.png
├── source.png
├── target.png
├── wisetree/
├── assignments.json (17.4k tokens)
├── obama128_order.png
├── output.png
├── source.png
├── target.png
├── rust-toolchain (100 tokens)
├── src/
├── app.rs (13.6k tokens)
├── app/
├── arrow-right.svg (100 tokens)
├── calculate/
├── blank.png
├── drawing_process.rs (1700 tokens)
├── mod.rs (3.5k tokens)
├── target128.png
├── target256.png
├── util.rs (1300 tokens)
├── weights128.png
├── weights256.png
├── worker/
├── mod.rs (400 tokens)
├── gif_recorder.rs (2.2k tokens)
├── gui.rs (12.9k tokens)
├── morph_sim.rs (2.4k tokens)
├── preset.rs (100 tokens)
├── lib.rs
├── main.rs (1000 tokens)
├── shaders/
├── clear.wgsl (100 tokens)
├── jfa.wgsl (600 tokens)
├── seed.wgsl (300 tokens)
├── shade.wgsl (400 tokens)
├── worker.js (100 tokens)
```
## /.github/workflows/cf_pages.yml
```yml path="/.github/workflows/cf_pages.yml"
name: Deploy to Cloudflare Pages
on:
push:
branches: [main]
permissions:
contents: read
deployments: write
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup toolchain for wasm
run: |
rustup update stable
rustup default stable
rustup set profile minimal
rustup target add wasm32-unknown-unknown
- name: Rust Cache
uses: Swatinem/rust-cache@v2
- name: Download and install Trunk binary
run: wget -qO- https://github.com/thedodd/trunk/releases/latest/download/trunk-x86_64-unknown-linux-gnu.tar.gz | tar -xzf-
- name: Build
run: ./trunk build --release --public-url "/"
- name: Deploy to Cloudflare Pages
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
command: pages deploy dist --project-name=obamify
gitHubToken: ${{ secrets.GITHUB_TOKEN }}
```
## /.github/workflows/gh_pages.yml
```yml path="/.github/workflows/gh_pages.yml"
name: Github Pages
# By default, runs if you push to main. keeps your deployed app in sync with main branch.
on:
push:
branches:
- main
# to only run when you do a new github release, comment out above part and uncomment the below trigger.
# on:
# release:
# types:
# - published
permissions:
contents: write # for committing to gh-pages branch.
jobs:
build-github-pages:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4 # repo checkout
- name: Setup toolchain for wasm
run: |
rustup update stable
rustup default stable
rustup set profile minimal
rustup target add wasm32-unknown-unknown
- name: Rust Cache # cache the rust build artefacts
uses: Swatinem/rust-cache@v2
- name: Download and install Trunk binary
run: wget -qO- https://github.com/thedodd/trunk/releases/latest/download/trunk-x86_64-unknown-linux-gnu.tar.gz | tar -xzf-
- name: Build # build
# Environment $public_url resolves to the github project page.
# If using a user/organization page, remove the `${{ github.event.repository.name }}` part.
# using --public-url something will allow trunk to modify all the href paths like from favicon.ico to repo_name/favicon.ico .
# this is necessary for github pages where the site is deployed to username.github.io/repo_name and all files must be requested
# relatively as eframe_template/favicon.ico. if we skip public-url option, the href paths will instead request username.github.io/favicon.ico which
# will obviously return error 404 not found.
run: ./trunk build --release --public-url $public_url
env:
public_url: "https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}"
- name: Deploy
uses: JamesIves/github-pages-deploy-action@v4
with:
folder: dist
# this option will not maintain any history of your previous pages deployment
# set to false if you want all page build to be committed to your gh-pages branch history
single-commit: true
```
## /.github/workflows/release.yaml
```yaml path="/.github/workflows/release.yaml"
name: Build & Package (Windows, macOS, Linux)
on:
workflow_dispatch: # manual run from Actions tab
env:
BIN_NAME: obamify
# Human-facing display name for the app
APP_DISPLAY_NAME: obamify
# Reverse-DNS bundle identifier
APP_BUNDLE_ID: com.obamify
jobs:
build:
name: Build ${{ matrix.os_tag }}
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include:
- runner: ubuntu-latest
os_tag: linux
target: x86_64-unknown-linux-gnu
ext: ""
- runner: macos-14
os_tag: macos
target: aarch64-apple-darwin
ext: ""
- runner: windows-latest
os_tag: windows
target: x86_64-pc-windows-msvc
ext: ".exe"
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Cargo build (release)
run: cargo build --release --target ${{ matrix.target }}
- name: Package (.app bundle)
if: ${{ startsWith(matrix.runner, 'macos') }}
shell: bash
run: |
set -euo pipefail
APP="${{ env.BIN_NAME }}"
DISP="${{ env.APP_DISPLAY_NAME }}"
BUNDLE_ID="${{ env.APP_BUNDLE_ID }}"
BIN="target/${{ matrix.target }}/release/${APP}${{ matrix.ext }}"
test -f "$BIN" || (echo "Missing $BIN" && exit 1)
# Derive version from Cargo metadata (fallback to 0.0.0)
VERSION="$(cargo metadata --format-version 1 --no-deps | python3 -c "import sys, json; m=json.load(sys.stdin); p=[x for x in m['packages'] if x['name']=='${APP}']; print(p[0]['version'] if p else '0.0.0')")"
APPDIR="dist/${DISP}.app"
mkdir -p "${APPDIR}/Contents/MacOS" "${APPDIR}/Contents/Resources"
# Binary
cp "$BIN" "${APPDIR}/Contents/MacOS/${APP}"
chmod +x "${APPDIR}/Contents/MacOS/${APP}"
# Icon (optional) - put your .icns at assets/macos/icon.icns
if [ -f assets/macos/icon.icns ]; then
cp assets/macos/icon.icns "${APPDIR}/Contents/Resources/AppIcon.icns"
ICON_LINE="<key>CFBundleIconFile</key><string>AppIcon</string>"
else
ICON_LINE=""
fi
# Generate Info.plist
cat > "${APPDIR}/Contents/Info.plist" <<PLIST
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleName</key><string>${DISP}</string>
<key>CFBundleDisplayName</key><string>${DISP}</string>
<key>CFBundleExecutable</key><string>${APP}</string>
<key>CFBundleIdentifier</key><string>${BUNDLE_ID}</string>
<key>CFBundleVersion</key><string>${VERSION}</string>
<key>CFBundleShortVersionString</key><string>${VERSION}</string>
<key>LSMinimumSystemVersion</key><string>11.0</string>
<key>LSApplicationCategoryType</key><string>public.app-category.utilities</string>
<key>NSHighResolutionCapable</key><true/>
${ICON_LINE}
</dict>
</plist>
PLIST
# Zip for distribution (zip keeps resource forks properly with ditto flags)
mkdir -p dist
ditto -c -k --sequesterRsrc --keepParent "${APPDIR}" "dist/${APP}-${{ matrix.os_tag }}.zip"
- name: Package (Linux AppImage)
if: ${{ startsWith(matrix.runner, 'ubuntu') }}
shell: bash
run: |
set -euo pipefail
APP="${{ env.BIN_NAME }}"
DISP="${{ env.APP_DISPLAY_NAME }}"
BIN="target/${{ matrix.target }}/release/${APP}"
echo "Checking for binary at: $BIN"
test -f "$BIN" || (echo "Missing $BIN" && exit 1)
echo "Creating AppDir structure..."
mkdir -p dist/AppDir/usr/bin dist/AppDir/usr/share/applications dist/AppDir/usr/share/icons/hicolor/256x256/apps
# Put binary in AppDir
echo "Copying binary..."
cp "$BIN" dist/AppDir/usr/bin/${APP}
chmod +x dist/AppDir/usr/bin/${APP}
# Icon (optional) - place a 256x256 PNG at assets/linux/icon.png
if [ -f assets/linux/icon.png ]; then
echo "Copying icon..."
cp assets/linux/icon.png dist/AppDir/usr/share/icons/hicolor/256x256/apps/${APP}.png
ICON_PATH=dist/AppDir/usr/share/icons/hicolor/256x256/apps/${APP}.png
else
echo "No icon found, proceeding without..."
ICON_PATH=
fi
# Desktop file
echo "Creating desktop file..."
if [ -n "$ICON_PATH" ]; then
ICON_LINE="Icon=${APP}"
else
ICON_LINE=""
fi
cat > dist/AppDir/usr/share/applications/${APP}.desktop <<DESKTOP
[Desktop Entry]
Type=Application
Name=${DISP}
Exec=${APP}
${ICON_LINE}
Categories=Utility;
Terminal=false
DESKTOP
# AppRun launcher
echo "Creating AppRun launcher..."
cat > dist/AppDir/AppRun <<'APPRUN'
#!/bin/sh
HERE="$(dirname "$(readlink -f "$0")")"
export PATH="$HERE/usr/bin:$PATH"
exec "${HERE}/usr/bin/obamify" "$@"
APPRUN
chmod +x dist/AppDir/AppRun
# Create tarball first (guaranteed to work)
echo "Creating tarball..."
mkdir -p dist
tar -C "target/${{ matrix.target }}/release" -czf "dist/${APP}-${{ matrix.os_tag }}.tar.gz" "${APP}"
# Try to create AppImage (may fail on some systems)
echo "Attempting to create AppImage..."
if command -v wget >/dev/null 2>&1; then
echo "Downloading AppImage tools..."
LINUXDEPLOY_SUCCESS=false
APPIMAGETOOL_SUCCESS=false
if wget -q "https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage" -O linuxdeploy; then
LINUXDEPLOY_SUCCESS=true
echo "linuxdeploy downloaded successfully"
else
echo "Failed to download linuxdeploy"
fi
if wget -q "https://github.com/AppImage/AppImageKit/releases/download/13/appimagetool-x86_64.AppImage" -O appimagetool; then
APPIMAGETOOL_SUCCESS=true
echo "appimagetool downloaded successfully"
else
echo "Failed to download appimagetool"
fi
if [ "$LINUXDEPLOY_SUCCESS" = true ] && [ "$APPIMAGETOOL_SUCCESS" = true ]; then
chmod +x linuxdeploy appimagetool
# Build AppImage
echo "Building AppImage with both tools available..."
if [ -n "$ICON_PATH" ]; then
./linuxdeploy --appdir dist/AppDir -d dist/AppDir/usr/share/applications/${APP}.desktop -i "$ICON_PATH" --output appimage || echo "AppImage creation failed"
else
./linuxdeploy --appdir dist/AppDir -d dist/AppDir/usr/share/applications/${APP}.desktop --output appimage || echo "AppImage creation failed"
fi
# Move result if it exists
if ls *.AppImage 1> /dev/null 2>&1; then
mv *.AppImage "dist/${APP}-${{ matrix.os_tag }}.AppImage"
echo "AppImage created successfully"
else
echo "AppImage creation failed, but tarball is available"
fi
else
echo "Could not download both AppImage tools, skipping AppImage creation"
echo "linuxdeploy: $LINUXDEPLOY_SUCCESS, appimagetool: $APPIMAGETOOL_SUCCESS"
fi
else
echo "wget not available, skipping AppImage creation"
fi
- name: Package (Windows)
if: startsWith(matrix.runner, 'windows')
shell: pwsh
run: |
$ErrorActionPreference = "Stop"
$App = "${{ env.BIN_NAME }}"
$Bin = "target/${{ matrix.target }}/release/$App${{ matrix.ext }}"
if (-not (Test-Path $Bin)) { throw "Missing $Bin" }
New-Item -ItemType Directory -Force -Path "dist" | Out-Null
Copy-Item $Bin -Destination "dist/$App-${{ matrix.os_tag }}${{ matrix.ext }}" -Force
- name: Upload artifacts (macOS)
if: ${{ startsWith(matrix.runner, 'macos') }}
uses: actions/upload-artifact@v4
with:
name: ${{ env.BIN_NAME }}-${{ matrix.os_tag }}
path: |
dist/${{ env.APP_DISPLAY_NAME }}.app
dist/${{ env.BIN_NAME }}-${{ matrix.os_tag }}.zip
- name: Upload artifacts (Linux)
if: ${{ startsWith(matrix.runner, 'ubuntu') }}
uses: actions/upload-artifact@v4
with:
name: ${{ env.BIN_NAME }}-${{ matrix.os_tag }}
path: |
dist/${{ env.BIN_NAME }}-${{ matrix.os_tag }}.AppImage
dist/${{ env.BIN_NAME }}-${{ matrix.os_tag }}.tar.gz
if-no-files-found: ignore
- name: Upload artifacts (Windows)
if: startsWith(matrix.runner, 'windows')
uses: actions/upload-artifact@v4
with:
name: ${{ env.BIN_NAME }}-${{ matrix.os_tag }}
path: dist/${{ env.BIN_NAME }}-${{ matrix.os_tag }}${{ matrix.ext }}
```
## /.github/workflows/rust.yml
```yml path="/.github/workflows/rust.yml"
on: [push, pull_request, workflow_dispatch]
name: CI
# env:
# RUSTFLAGS: -D warnings
# RUSTDOCFLAGS: -D warnings
jobs:
check:
name: Check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
- uses: actions-rs/cargo@v1
with:
command: check
args: --all-features
check_wasm:
name: Check wasm32
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
target: wasm32-unknown-unknown
override: true
- uses: actions-rs/cargo@v1
with:
command: check
args: --all-features --lib --target wasm32-unknown-unknown
test:
name: Test Suite
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
- run: sudo apt-get install libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libxkbcommon-dev libssl-dev
- uses: actions-rs/cargo@v1
with:
command: test
args: --lib
fmt:
name: Rustfmt
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
components: rustfmt
- uses: actions-rs/cargo@v1
with:
command: fmt
args: --all -- --check
clippy:
name: Clippy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
components: clippy
- uses: actions-rs/cargo@v1
with:
command: clippy
trunk:
name: trunk
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: 1.85.0
target: wasm32-unknown-unknown
override: true
- name: Download and install Trunk binary
run: wget -qO- https://github.com/thedodd/trunk/releases/latest/download/trunk-x86_64-unknown-linux-gnu.tar.gz | tar -xzf-
- name: Build
run: ./trunk build
build:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- os: macos-latest
TARGET: aarch64-apple-darwin
- os: macos-latest
TARGET: x86_64-apple-darwin
- os: ubuntu-latest
TARGET: arm-unknown-linux-musleabihf
- os: ubuntu-latest
TARGET: armv7-unknown-linux-musleabihf
- os: ubuntu-latest
TARGET: x86_64-unknown-linux-musl
- os: windows-latest
TARGET: x86_64-pc-windows-msvc
EXTENSION: .exe
steps:
- name: Building ${{ matrix.TARGET }}
run: echo "${{ matrix.TARGET }}"
- uses: actions/checkout@master
- uses: actions-rs/toolchain@v1.0.1
with:
toolchain: stable
target: ${{ matrix.TARGET }}
override: true
- uses: actions-rs/cargo@v1
with:
use-cross: true
command: build
args: --verbose --release --target=${{ matrix.TARGET }}
```
## /.gitignore
```gitignore path="/.gitignore"
# Mac stuff:
.DS_Store
# trunk output folder
dist
# Rust compile target directories:
target
target_ra
target_wasm
# https://github.com/lycheeverse/lychee
.lycheecache
.vscode/*
```
## /.typos.toml
```toml path="/.typos.toml"
# https://github.com/crate-ci/typos
# install: cargo install typos-cli
# run: typos
[default.extend-words]
egui = "egui" # Example for how to ignore a false positive
```
## /Cargo.toml
```toml path="/Cargo.toml"
[package]
name = "obamify"
version = "0.3.0"
authors = ["Spu7Nix"]
edition = "2024"
include = ["LICENSE-MIT", "**/*.rs", "Cargo.toml"]
rust-version = "1.85"
[package.metadata.docs.rs]
all-features = true
targets = ["x86_64-unknown-linux-gnu", "wasm32-unknown-unknown"]
[dependencies]
egui = "0.32"
eframe = { version = "0.32", default-features = false, features = [
# "accesskit", # Make egui compatible with screen readers. NOTE: adds a lot of dependencies.
"default_fonts", # Embed the default egui fonts.
"wgpu", # Use the wgpu rendering backend. Alternative: "glow".
"persistence", # Enable restoring app state when restarting the app.
"wayland", # To support Linux (and CI)
"x11", # To support older Linux distributions (restores one of the default features)
] }
egui_extras = { version = "0.32", features = ["svg"] }
log = "0.4.27"
egui-wgpu = "0.32.1"
wgpu = { version = "25.0", default-features = false, features = ["wgsl"] }
bytemuck = { version = "1.16", features = ["derive"] }
image = { version = "0.25.6", features = ["serde"] }
palette = "0.7.6"
pathfinding = "4.13.0"
indexmap = "2.11.0"
frand = "0.10.1"
uuid = { version = "1.18.1", features = ["v4", "js", "serde"] }
rfd = "0.15.4"
gif = "0.13.3"
futures-intrusive = "0.5.0"
pollster = "0.4.0"
color_quant = "1.1.0"
opener = {version = "0.8.3", features = ["reveal"]}
serde = { version = "1.0.219", features = ["derive"] }
# native:
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
env_logger = "0.11.8"
# web:
[target.'cfg(target_arch = "wasm32")'.dependencies]
wasm-bindgen-futures = "0.4.50"
web-sys = { version = "0.3.70", features = [
"DedicatedWorkerGlobalScope", "Worker", "WorkerOptions", "WorkerType", "MessageEvent", "ErrorEvent",
"HtmlScriptElement", "HtmlCollection", "Element", "NodeList", "Blob", "BlobPropertyBag", "Url", "Window", "Document",
] } # to access the DOM (to hide the loading text)
# gloo = { version = "0.11.0", features = ["futures"] }
serde-wasm-bindgen = "0.6"
futures = "0.3.31"
wasm-bindgen = "0.2"
console_error_panic_hook = "0.1.7"
# Override wgpu for WASM to use only WebGL backend
wgpu = { version = "25.0", features = ["webgl"] }
[profile.release]
opt-level = 3 # fast and small wasm
# Optimize all dependencies even in debug builds:
[profile.dev.package."*"]
opt-level = 2
```
## /README.md
[(try it here)](https://obamify.com/)
# obamify
revolutionary new technology that turns any image into obama

# How to use
**Use the ui at the top of the window to control the animation, choose between saved transformations, and generate new ones.** You can change the source image and target image, and choose how they are cropped to a square (tip: if both the images are faces, try making the eyes overlap). You can also change these advanced settings:
| Setting | Description |
|-----------------------|-------------------------------------------------------------------------------------------------|
| resolution | How many cells the images will be divided into. Higher resolution will capture more high frequency details. |
| proximity importance | How much the algorithm changes the original image to make it look like the target image. Increase this if you want a more subtle transformation. |
| algorithm | The algorithm used to calculate the assignment of each pixel. Optimal will find the mathematically optimal solution, but is extremely slow for high resolutions. |
# Installations
Install the latest version in [releases](https://github.com/Spu7Nix/obamify/releases). Unzip and run the .exe file inside!
**Note for macOS users:**
Run 'xattr -C <path/to/app.app>' in your terminal to remove the damaged app warning.
### Building from source
1. Install [Rust](https://www.rust-lang.org/tools/install)
2. Run `cargo run --release` in the project folder
#### Running the web version locally
1. Install [Rust](https://www.rust-lang.org/tools/install)
2. Install the required target with `rustup target add wasm32-unknown-unknown`
3. Install Trunk with `cargo install --locked trunk`
4. Run `trunk serve --release --open`
# Contributing
Please open an issue or a pull request if you have any suggestions or find any bugs :)
# How it works
magic
## /Trunk.toml
```toml path="/Trunk.toml"
[build]
filehash = true
```
## /assets/android-chrome-192x192.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/assets/android-chrome-192x192.png
## /assets/android-chrome-512x512.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/assets/android-chrome-512x512.png
## /assets/apple-touch-icon.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/assets/apple-touch-icon.png
## /assets/favicon-16x16.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/assets/favicon-16x16.png
## /assets/favicon-32x32.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/assets/favicon-32x32.png
## /assets/favicon.ico
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/assets/favicon.ico
## /assets/github-mark-white.svg
```svg path="/assets/github-mark-white.svg"
<svg width="98" height="96" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a46.97 46.97 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0z" fill="#fff"/></svg>
```
## /assets/icon128.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/assets/icon128.png
## /assets/linux/icon.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/assets/linux/icon.png
## /assets/macos/icon.icns
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/assets/macos/icon.icns
## /assets/manifest.json
```json path="/assets/manifest.json"
{
"name": "obamify",
"short_name": "obamify",
"icons": [
{
"src": "/assets/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/assets/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"lang": "en-US",
"id": "/index.html",
"start_url": "./index.html",
"display": "standalone",
"background_color": "white",
"theme_color": "white"
}
```
## /assets/mug.webp
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/assets/mug.webp
## /assets/pfp_transparent.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/assets/pfp_transparent.png
## /assets/phone_case.webp
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/assets/phone_case.webp
## /assets/pillow.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/assets/pillow.png
## /assets/pillow.webp
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/assets/pillow.webp
## /assets/shirt.webp
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/assets/shirt.webp
## /assets/sw.js
```js path="/assets/sw.js"
var cacheName = "obamify-pwa"
var filesToCache = [] //["./", "./index.html", "./obamify.js", "./obamify_bg.wasm"]
/* Start the service worker and cache all of the app's content */
self.addEventListener("install", function (e) {
e.waitUntil(
caches.open(cacheName).then(function (cache) {
return cache.addAll(filesToCache)
})
)
})
/* Serve cached content when offline */
self.addEventListener("fetch", function (e) {
e.respondWith(
caches.match(e.request).then(function (response) {
return response || fetch(e.request)
})
)
})
```
## /example.gif
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/example.gif
## /flake.nix
```nix path="/flake.nix"
{
description = "revolutionary new technology that turns any image into obama";
inputs = {
nixpkgs.url = "https://flakehub.com/f/NixOS/nixpkgs/0.1";
rust-overlay = {
url = "github:oxalica/rust-overlay";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs =
{
self,
nixpkgs,
rust-overlay,
...
}:
let
supportedSystems = [
"x86_64-linux"
"aarch64-linux"
"x86_64-darwin"
"aarch64-darwin"
];
forEachSupportedSystem =
f:
nixpkgs.lib.genAttrs supportedSystems (
system:
f {
pkgs = import nixpkgs {
inherit system;
overlays = [
rust-overlay.overlays.default
self.overlays.default
];
};
systemStr = system;
}
);
in
{
overlays.default = final: prev: {
rustToolchain =
let
rust = prev.rust-bin;
in
if builtins.pathExists ./rust-toolchain.toml then
rust.fromRustupToolchainFile ./rust-toolchain.toml
else if builtins.pathExists ./rust-toolchain then
rust.fromRustupToolchainFile ./rust-toolchain
else
rust.stable.latest.default.override {
extensions = [
"rust-src"
"rustfmt"
];
};
};
packages = forEachSupportedSystem (
{ pkgs, systemStr }:
{
default = pkgs.rustPlatform.buildRustPackage {
pname = "obamify";
version = "1.1";
src = ./.;
cargoLock = {
lockFile = ./Cargo.lock;
};
nativeBuildInputs = with pkgs; [
pkg-config
makeWrapper
];
buildInputs = [
pkgs.openssl
]
++ pkgs.lib.optionals pkgs.stdenv.isLinux (
with pkgs;
[
wayland
libxkbcommon
xorg.libX11
xorg.libXcursor
xorg.libXrandr
xorg.libXi
vulkan-loader
libglvnd
mesa
egl-wayland
]
);
postFixup = pkgs.lib.optionalString pkgs.stdenv.isLinux ''
wrapProgram $out/bin/obamify \
--set-default WINIT_UNIX_BACKEND wayland \
--set-default WGPU_BACKEND vulkan \
--set LD_LIBRARY_PATH ${
pkgs.lib.makeLibraryPath [
pkgs.wayland
pkgs.libxkbcommon
pkgs.xorg.libX11
pkgs.xorg.libXcursor
pkgs.xorg.libXrandr
pkgs.xorg.libXi
pkgs.vulkan-loader
pkgs.libglvnd
pkgs.mesa
pkgs.egl-wayland
]
}
'';
enableParallelBuild = true;
meta = {
description = "revolutionary new technology that turns any image into obama";
homepage = "htpps://github/Spu7Nix/obamify";
license = pkgs.lib.licenses.mit;
mainProgram = "obamify";
};
};
}
);
apps = forEachSupportedSystem (
{ pkgs, systemStr }:
{
default = {
type = "app";
program = nixpkgs.lib.getExe self.packages.${systemStr}.default;
};
}
);
devShells = forEachSupportedSystem (
{ pkgs, ... }:
{
default = pkgs.mkShell {
packages =
with pkgs;
[
rustToolchain
openssl
pkg-config
cargo-deny
cargo-edit
cargo-watch
rust-analyzer
]
++ pkgs.lib.optionals pkgs.stdenv.isLinux [
wayland
libxkbcommon
xorg.libX11
xorg.libXcursor
xorg.libXrandr
xorg.libXi
];
env = {
RUST_SRC_PATH = "${pkgs.rustToolchain}/lib/rustlib/src/rust/library";
};
};
}
);
};
}
```
## /index.html
```html path="/index.html"
<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!-- Disable zooming: -->
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<head>
<title>obamify</title>
<meta name="description" content="revolutionary new technology that turns any image into obama">
<meta name="keywords" content="image processing, image morphing, optimal transport, meme generator">
<meta name="author" content="Spu7Nix">
<meta name="robots" content="index, follow">
<meta property="og:type" content="website">
<meta property="og:url" content="https://obamify.com/">
<meta property="og:title" content="obamify">
<meta property="og:description" content="revolutionary new technology that turns any image into obama">
<meta property="og:image" content="https://obamify.com/assets/android-chrome-512x512.png">
<meta property="og:image:width" content="512">
<meta property="og:image:height" content="512">
<meta property="og:site_name" content="obamify">
<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:url" content="https://obamify.com/">
<meta property="twitter:title" content="obamify">
<meta property="twitter:description" content="revolutionary new technology that turns any image into obama">
<meta property="twitter:image" content="https://obamify.com/assets/android-chrome-512x512.png">
<meta name="application-name" content="obamify">
<meta name="format-detection" content="telephone=no">
<!-- config for our rust wasm binary. go to https://trunkrs.dev/assets/#rust for more customization -->
<link data-trunk rel="rust" data-wasm-opt="4" data-integrity="none" />
<!-- this is the base url relative to which other urls will be constructed. trunk will insert this from the public-url option -->
<base data-trunk-public-url />
<link data-trunk rel="icon" href="assets/favicon.ico" data-integrity="none">
<link data-trunk rel="copy-file" href="assets/sw.js" data-integrity="none" />
<link data-trunk rel="copy-file" href="assets/manifest.json" />
<link data-trunk rel="copy-file" href="assets/android-chrome-192x192.png" data-target-path="assets"
data-integrity="none" />
<link data-trunk rel="copy-file" href="assets/android-chrome-512x512.png" data-target-path="assets"
data-integrity="none" />
<link data-trunk rel="copy-file" href="assets/apple-touch-icon.png" data-target-path="assets"
data-integrity="none" />
<link data-trunk rel="copy-file" href="assets/pfp_transparent.png" data-target-path="assets"
data-integrity="none" />
<link data-trunk rel="copy-file" href="assets/github-mark-white.svg" data-target-path="assets"
data-integrity="none" />
<link data-trunk rel="copy-file" href="worker.js" data-integrity="none" />
<link rel="manifest" href="manifest.json">
<link rel="apple-touch-icon" href="assets/apple-touch-icon.png">
<meta name="theme-color" media="(prefers-color-scheme: light)" content="white">
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#404040">
<style>
html {
/* Remove touch delay: */
touch-action: manipulation;
}
body {
/* Light mode background color for what is not covered by the egui canvas,
or where the egui canvas is translucent. */
background: #909090;
}
@media (prefers-color-scheme: dark) {
body {
/* Dark mode background color for what is not covered by the egui canvas,
or where the egui canvas is translucent. */
background: #404040;
}
}
/* Allow canvas to fill entire web page: */
html,
body {
overflow: hidden;
margin: 0 !important;
padding: 0 !important;
height: 100%;
width: 100%;
}
/* Make canvas fill entire document: */
canvas {
margin-right: auto;
margin-left: auto;
display: block;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
/* Limit canvas size for WebGL compatibility (max 4096x4096) */
max-width: 4096px;
max-height: 4096px;
}
.centered {
margin-right: auto;
margin-left: auto;
display: block;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: #f0f0f0;
font-size: 24px;
font-family: Ubuntu-Light, Helvetica, sans-serif;
text-align: center;
}
#rfd-output {
font-weight: bold;
padding-bottom: 10px;
padding-top: 10px;
}
#rfd-input {
font-weight: bold;
padding-bottom: 10px;
padding-top: 10px;
}
#rfd-card {
font-family: Arial, Helvetica, sans-serif;
border: white 1px solid;
border-radius: 10px;
}
/* ---------------------------------------------- */
/* Loading animation from https://loading.io/css/ */
.lds-dual-ring {
display: inline-block;
width: 24px;
height: 24px;
}
.lds-dual-ring:after {
content: " ";
display: block;
width: 24px;
height: 24px;
margin: 0px;
border-radius: 50%;
border: 3px solid #fff;
border-color: #fff transparent #fff transparent;
animation: lds-dual-ring 1.2s linear infinite;
}
@keyframes lds-dual-ring {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
/* Bottom-left corner icons */
.bottom-left-icons {
position: fixed;
bottom: 20px;
left: 20px;
display: flex;
flex-direction: column;
gap: 12px;
z-index: 1000;
}
.icon-link {
position: relative;
display: flex;
align-items: center;
justify-content: center;
width: 48px;
height: 48px;
background-color: rgba(0, 0, 0, 1.0);
border-radius: 8px;
transition: all 0.2s ease;
text-decoration: none;
overflow: visible;
}
.icon-link:hover {
transform: scale(1.1);
background-color: rgba(0, 0, 0, 1.0);
}
.icon-link img {
width: 32px;
height: 32px;
border-radius: 6px;
}
.icon-text {
position: absolute;
left: 100%;
bottom: 0;
background-color: rgba(0, 0, 0, 0.9);
color: white;
padding: 8px 8px;
padding-left: 8px;
border-radius: 0 8px 8px 0;
font-family: Fira Code, monospace, sans-serif;
font-size: 10px;
white-space: nowrap;
margin-left: 0px;
opacity: 0;
transform: translateX(-10px);
transition: all 0.3s ease;
pointer-events: none;
z-index: 10;
}
.bottom-left-icons:hover .icon-text {
padding-left: 18px;
opacity: 1;
transform: translateX(0);
}
.bottom-left-icons:hover .icon-link {
border-radius: 12px 12px 0 12px;
}
.error {
padding-top: 10px;
font-size: small;
opacity: 0.6;
}
</style>
</head>
<body>
<!-- The WASM code will resize the canvas dynamically -->
<!-- the id is hardcoded in main.rs . so, make sure both match. -->
<canvas id="the_canvas_id"></canvas>
<!-- the loading spinner will be removed in main.rs -->
<div class="centered" id="loading_text">
<noscript>You need javascript to use this website</noscript>
<p style="font-size:16px">
Loading…
</p>
<div class="lds-dual-ring"></div>
</div>
<!-- Bottom-left corner icons -->
<div class="bottom-left-icons">
<a href="https://github.com/Spu7Nix/obamify" class="icon-link" target="_blank" rel="noopener noreferrer">
<img src="assets/github-mark-white.svg" alt="source code" />
<span class="icon-text">source code</span>
</a>
<a href="https://spu7nix.net" class="icon-link" target="_blank" rel="noopener noreferrer">
<img src="assets/pfp_transparent.png" alt="Spu7Nix" />
<span class="icon-text">my website</span>
</a>
</div>
<!--Register Service Worker. this will cache the wasm / js scripts for offline use (for PWA functionality). -->
<!-- Force refresh (Ctrl + F5) to load the latest files instead of cached files -->
<script>
// We disable caching during development so that we always view the latest version.
if ('serviceWorker' in navigator && window.location.hash !== "#dev") {
window.addEventListener('load', function () {
navigator.serviceWorker.register('sw.js');
});
}
function addShareButton() {
const downloadLink = document.getElementById('rfd-output');
if (!downloadLink) {
return;
}
const parent = downloadLink.parentElement;
if (parent.querySelector('.share-button')) {
return;
}
// remove the "Ok" button, keep only "Cancel" button
const rfdButtons = parent.querySelectorAll('.rfd-button');
if (rfdButtons.length >= 2) {
rfdButtons[0].remove();
}
if (!navigator.share) {
return;
}
const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ||
(navigator.maxTouchPoints && navigator.maxTouchPoints > 2);
if (!isMobile) {
return;
}
const blobUrl = downloadLink.href;
const fileName = downloadLink.download || 'recording.gif';
const container = document.createElement('div');
container.style.cssText = `
display: flex;
flex-direction: column;
gap: 10px;
align-items: center;
font-weight: bold;
padding-bottom: 10px;
padding-top: 10px;
`;
const shareButton = document.createElement('button');
shareButton.className = 'share-button';
shareButton.textContent = 'save/share';
shareButton.style.cssText = `
padding: 12px 24px;
background-color: #007bff;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
font-weight: bold;
font-size: 16px;
touch-action: manipulation;
-webkit-tap-highlight-color: transparent;
width: 100%;
max-width: 300px;
`;
shareButton.addEventListener('click', async function (e) {
e.preventDefault();
e.stopPropagation();
try {
const response = await fetch(blobUrl);
const blob = await response.blob();
const file = new File([blob], fileName, { type: 'image/gif' });
if (navigator.canShare && !navigator.canShare({ files: [file] })) {
throw new Error('File sharing not supported');
}
await navigator.share({
files: [file],
title: 'obamification',
text: 'made with https://obamify.com'
});
} catch (error) {
if (error.name !== 'AbortError') {
console.error('Error sharing:', error);
// Fall back to showing the download link
alert('Could not share file: ' + error.message + '\nTry using the download link instead.');
} else {
console.log('Share cancelled by user');
}
}
});
// Style the download link as a secondary button
downloadLink.style.cssText = `
padding: 10px 20px;
background-color: transparent;
color: white;
border: 1px solid white;
border-radius: 5px;
cursor: pointer;
font-weight: normal;
font-size: 14px;
text-decoration: none;
display: inline-block;
touch-action: manipulation;
`;
downloadLink.textContent = 'or download file';
// Wrap everything in the container
parent.insertBefore(container, downloadLink);
container.appendChild(shareButton);
container.appendChild(downloadLink);
}
const observer = new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
if (mutation.addedNodes.length) {
addShareButton();
}
});
});
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', function () {
observer.observe(document.body, {
childList: true,
subtree: true
});
});
} else {
observer.observe(document.body, {
childList: true,
subtree: true
});
}
</script>
</body>
</html>
<!-- Powered by egui: https://github.com/emilk/egui/ -->
```
## /presets/blackhole/assignments.json
```json path="/presets/blackhole/assignments.json"
[1,2,3,4,5,6,7,8,10,11,12,13,14,15,16,17,18,19,21,22,23,24,25,26,27,28,29,31,32,33,34,36,37,38,39,40,42,43,44,45,46,47,175,303,557,177,50,307,180,53,54,183,55,185,186,58,187,60,61,190,63,62,64,65,66,67,68,69,70,71,199,72,73,74,202,203,75,76,77,79,78,207,208,209,210,211,83,84,85,86,87,88,89,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,121,122,123,124,125,126,0,130,131,132,133,134,135,136,9,139,140,141,142,143,144,145,146,147,20,150,151,152,153,154,155,156,157,30,160,161,162,35,165,166,167,169,41,170,171,172,173,174,302,48,176,49,688,562,309,181,310,311,184,56,57,314,59,444,189,317,191,192,193,194,322,195,196,197,325,198,327,200,201,329,458,330,331,332,204,205,206,336,80,337,82,339,340,341,214,215,216,217,90,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,120,249,250,251,252,253,127,128,129,259,260,261,262,263,264,137,138,268,269,270,271,272,273,274,275,148,149,279,280,281,282,283,284,285,158,159,289,290,163,164,294,295,168,297,298,299,300,301,429,431,813,305,434,435,563,52,182,438,566,312,440,441,442,443,188,316,318,447,319,320,321,323,451,324,580,326,454,328,456,840,457,586,587,459,588,460,333,334,335,81,465,338,467,212,213,342,343,344,345,218,347,348,350,351,352,481,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,247,248,377,378,379,380,254,255,256,257,258,388,389,390,391,392,265,266,267,397,398,399,400,401,402,403,276,277,278,408,409,410,411,412,413,286,287,288,418,291,292,293,423,296,425,426,427,554,683,685,430,304,561,178,179,308,51,437,693,567,1076,823,313,570,315,826,445,446,575,448,449,450,578,579,452,453,581,455,583,584,841,714,843,844,845,716,846,461,462,848,464,849,466,723,468,469,470,471,472,473,346,475,349,478,479,480,609,610,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,374,375,376,505,506,507,381,382,383,384,385,386,387,517,518,519,520,393,394,395,396,526,527,528,529,530,531,404,405,406,407,537,538,539,540,541,414,415,416,417,419,420,421,422,424,552,553,681,810,428,940,941,560,689,306,818,564,436,1075,694,439,1331,824,696,571,1081,572,573,574,703,576,577,705,706,707,708,709,582,966,711,585,713,842,1099,1100,972,973,1103,847,463,1105,720,721,1107,979,596,597,598,984,599,474,985,476,477,606,607,608,737,738,739,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,501,502,503,504,633,634,508,509,510,511,512,513,514,515,516,646,647,648,521,522,523,524,525,655,656,657,658,659,532,533,534,535,536,666,667,668,669,542,543,545,546,547,549,550,551,679,680,808,937,555,556,558,559,432,433,690,1072,1074,565,821,1204,1333,568,697,569,1208,955,700,701,702,831,704,832,833,834,964,836,965,710,839,967,968,1097,1098,715,1228,1101,1230,717,589,1104,591,592,594,1235,595,1109,725,726,983,600,601,602,603,1116,1117,1118,735,865,866,867,868,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,628,629,630,631,632,761,635,636,637,638,639,640,641,642,643,644,645,775,776,649,650,651,652,653,654,784,785,786,787,660,661,662,663,664,665,795,796,797,670,671,544,674,675,548,677,678,807,936,1064,682,811,1194,686,1323,816,1325,1453,691,820,692,1455,822,951,695,1335,825,698,699,828,829,830,959,960,961,962,1091,835,1219,1093,1094,1096,1224,1095,1225,1226,1227,1229,1357,1102,1231,718,590,976,1361,1106,722,1236,724,1237,854,1240,728,1241,730,604,605,1244,1374,1119,993,994,995,996,997,869,870,871,872,873,874,875,876,877,878,879,880,881,755,756,757,758,759,760,762,763,764,765,766,767,768,769,770,771,772,773,774,904,777,778,779,780,781,782,783,913,914,915,788,789,790,791,792,793,794,924,925,798,799,672,673,803,676,805,806,1062,1063,1192,1320,1322,1450,814,687,1198,1327,817,1328,819,1330,949,1206,1079,952,953,954,1338,827,956,1593,958,1215,1342,1088,1089,1218,1092,963,1221,1350,1223,837,712,1353,1354,1355,1356,1358,1486,1359,1232,1233,1360,593,1362,978,1363,1621,1365,1366,727,855,729,731,859,733,1371,1373,1375,1376,1377,1251,1123,1124,1125,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,882,883,884,885,886,887,888,889,890,891,892,893,894,896,897,898,899,900,901,902,903,905,906,907,908,909,910,911,912,1042,1043,916,917,918,919,920,921,922,923,1053,926,927,800,801,802,804,932,1317,1318,1191,1447,1448,1195,684,1452,1071,815,1201,1073,1582,1458,1586,1205,950,1462,1590,1592,1082,1083,1084,1340,957,1469,1087,1216,1598,1217,1090,1346,1220,1349,1477,1352,1222,838,969,1482,1483,1485,1484,975,1487,719,1617,1618,850,851,1491,1493,852,1494,982,1367,856,857,732,1370,861,734,736,1501,1503,1504,1506,1380,1252,1253,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,895,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1171,1044,1045,1046,1047,1048,1049,1050,1051,1052,1054,1055,928,929,930,931,1060,933,1190,1574,1065,1449,1577,812,1069,943,944,1329,1457,1712,948,1077,1334,1078,1207,1464,1209,1466,1211,1848,1085,1214,1086,1343,1344,1472,1345,1347,1348,1475,1604,1351,1606,1480,1608,1609,1611,970,1613,1612,971,1615,1488,1616,1489,1619,1490,1620,1492,853,1622,1751,1623,1496,858,860,1498,862,1628,863,864,1502,1632,1505,1507,1508,1381,1254,1255,1256,1257,1258,1259,1260,1261,1262,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1022,1023,1024,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1172,1173,1174,1175,1176,1177,1178,1179,1181,1182,1183,1056,1057,1058,1186,1572,1189,1446,1575,1576,809,939,1068,1070,1199,1200,945,946,947,1460,1715,1461,1589,1591,1080,1337,1594,1467,1212,1341,1213,1725,1471,1599,1473,1600,1474,1603,1731,1859,1479,1733,1734,1481,1610,1735,1739,1740,1614,974,1743,1744,1745,1746,1747,1748,1234,980,1108,1878,1110,1238,986,987,1626,988,1627,989,990,992,1630,1631,1633,1634,1636,1509,1382,1383,1384,1385,1386,1387,1388,1389,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1149,1150,1151,1152,1153,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1308,1180,1309,1310,1184,1185,1442,1443,1701,1059,1702,934,935,1066,938,1579,1197,942,1456,1584,1202,1203,1332,1588,1717,1718,1719,1847,1465,1210,1339,1468,1597,1470,1726,1727,1855,1856,1601,1602,1476,1857,1605,1607,1862,1736,1737,1738,1865,1866,1741,1868,1742,1872,1871,1873,977,1875,1874,1876,1877,981,1111,1879,1495,1113,1114,1753,1115,1243,1372,991,1629,1120,1759,1760,1762,1635,1637,1510,1511,1512,1513,1514,1515,1516,1517,1390,1391,1392,1393,1394,1395,1396,1397,1399,1400,1401,1402,1276,1277,1278,1279,1280,1281,1282,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1294,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1307,1436,1437,1439,1311,1312,1699,1571,1444,1573,1188,1061,1321,1451,1067,1324,1454,1583,1711,1839,1713,1459,1587,1716,1845,1463,1336,1720,1721,1722,1595,1596,1724,1852,1853,1854,1728,1729,1730,1985,1732,1860,1478,1987,2115,1989,1863,1991,1867,1992,1869,1870,1996,1997,1998,2001,2000,2003,2002,2004,1364,2005,2006,1749,1750,1242,1880,1752,1754,1499,1245,1500,1121,1122,1758,2016,1761,1763,1764,1638,1639,1640,1641,1642,1643,1644,1645,1518,1519,1520,1521,1522,1523,1524,1398,1527,1528,1529,1403,1404,1405,1406,1407,1408,1409,1410,1411,1541,1542,1543,1544,1545,1546,1547,1548,1549,1422,1423,1553,1554,1555,1556,1557,1558,1559,1560,1561,1563,1435,1565,1566,1438,1568,1441,1313,1955,1315,1187,1445,1704,1319,1193,1835,1196,1326,1581,1710,1585,1714,1842,1841,1844,1843,1972,1846,1975,1849,1850,1851,1723,1980,1979,1981,2107,1982,1983,1984,1858,1986,1988,2113,1861,1990,1864,2117,1994,2121,1995,2124,2123,2125,2126,2127,2128,2130,2129,2131,2132,2133,2262,2134,1239,1112,2007,1624,1625,1881,1882,1755,1246,1247,1886,1250,1379,2018,2019,2020,1765,1766,1767,1768,1770,1771,1772,1773,1646,1647,1648,1649,1650,1651,1525,1526,1655,1656,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1670,1671,1672,1673,1674,1675,1676,1677,1550,1551,1552,1682,1683,1684,1685,1686,1687,1688,1689,1562,1691,1692,1823,1564,1696,1440,1826,1827,1314,1829,1316,1831,1705,1578,1707,1580,1708,1709,1837,1838,1840,1969,1966,1967,1968,1970,1971,1974,2100,1973,2103,1977,1978,1976,2104,2105,2234,2108,2109,2112,2238,2111,2240,2114,2116,1993,2118,2120,2119,2248,2122,2251,2252,1999,2255,2256,2254,2258,2257,2259,2387,2260,2261,1368,2263,2135,2136,2008,2009,2010,2011,1756,1248,1885,1378,2015,2017,2146,2148,2021,1895,1896,1769,1897,1898,1899,1900,1774,1775,1776,1777,1778,1652,1653,1654,1783,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1799,1800,1801,1802,1803,1804,1805,1678,1679,1680,1681,1811,1812,1813,1814,1815,1816,1817,1690,1819,1821,1693,1695,1694,1825,1569,1567,1570,1700,1958,1703,1832,1833,1706,1834,1836,1963,1964,2091,2092,2093,1965,2094,2095,2096,2098,2097,2227,2099,2229,2101,2102,2231,2232,2233,2106,2235,2236,2237,2110,2239,2367,2241,2242,2243,2244,2246,2245,2247,2377,2249,2250,2379,2380,2381,2253,2382,2383,2384,2385,2390,2388,2389,1369,1497,2264,2265,2137,2138,1883,1884,1757,1249,2014,2144,1890,1891,2147,2149,2022,2023,2024,2025,2026,2027,1901,1902,1903,1904,1905,1779,1780,1781,1782,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1928,1929,1930,1931,1932,1933,1806,1807,1808,1809,1810,1940,1941,1942,1943,1944,1945,1818,1948,1949,1820,1952,1822,1824,1953,1697,1698,1956,1828,1830,2087,1960,1961,2089,1962,2218,2090,2219,2348,2220,2221,2222,2351,2352,2224,2225,2226,2355,2356,2228,2357,2230,2359,2360,2361,2362,2363,2364,2365,2366,2495,2368,2369,2370,2371,2372,2373,2374,2375,2376,2505,2378,2507,2508,2509,2510,2511,2512,2514,2386,2515,2516,2517,2519,2391,2392,2393,2266,2139,2012,2140,2141,1887,1889,2145,1892,1893,2277,2150,2151,2152,2153,2154,2028,2029,2030,2031,2032,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1920,1921,1922,1923,1924,1925,1926,1927,2057,2058,2059,2060,2061,1934,1935,1936,1937,1938,1939,2068,2070,2071,2072,2073,1946,2204,2078,1947,1950,2079,2081,1954,2082,2083,2084,1957,2086,1959,2216,2088,2217,2345,2474,2346,2347,2476,2477,2349,2350,2223,2480,2481,2353,2354,2483,2484,2485,2486,2358,2487,2488,2489,2490,2491,2492,2493,2622,2494,2496,2497,2498,2499,2500,2501,2502,2503,2504,2633,2506,2635,2636,2637,2638,2639,2640,2513,2642,2643,2644,2646,2518,2647,2520,2521,2394,2267,2268,2013,2142,1888,2143,2400,2274,1894,2276,2278,2279,2280,2281,2155,2156,2157,2158,2159,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,1919,2048,2049,2050,2051,2052,2053,2054,2055,2056,2186,2187,2188,2189,2062,2063,2064,2065,2066,2067,2196,2069,2199,2200,2201,2074,2075,2205,2334,2077,1951,2209,2338,2210,2211,2213,2085,2214,2215,2344,2472,2473,2601,2602,2603,2475,2604,2605,2606,2478,2479,2607,2609,2610,2482,2611,2612,2613,2614,2615,2616,2745,2617,2618,2619,2620,2749,2621,2623,2624,2625,2626,2627,2628,2757,2630,2631,2632,2761,2634,2763,2764,2765,2895,2767,2768,2769,2641,2771,2772,2645,2774,2776,2648,2649,2522,2395,2396,2269,2270,2271,2272,2273,2401,2275,2404,2406,2407,2408,2282,2283,2284,2285,2286,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2046,2047,2176,2177,2178,2179,2180,2181,2182,2183,2184,2185,2315,2316,2317,2190,2191,2192,2193,2194,2195,2325,2197,2198,2328,2329,2330,2333,2203,2462,2464,2207,2076,2208,2080,2340,2212,2341,2342,2343,2599,2600,2729,2730,2731,2859,2860,2732,2733,2862,2734,2735,2736,2608,2737,2738,2739,2740,2741,2742,2743,2744,2873,2874,2746,2747,2748,2877,2750,2751,2752,2753,2754,2755,2756,2629,2758,2759,3016,2889,2890,2762,2892,2766,2894,3024,2896,2897,2898,2770,2900,2773,2902,2775,2903,2777,2778,2779,2523,2524,2397,2398,2399,2529,2402,2403,2405,2661,2663,2664,2409,2410,2412,2413,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2173,2174,2175,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2444,2445,2318,2319,2320,2321,2322,2323,2324,2454,2326,2327,2457,2456,2460,2202,2331,2720,2206,2336,2466,2467,2339,2468,2469,2470,2471,2728,2856,2857,2986,2858,2987,2988,2861,2989,2990,2991,2863,2992,2993,2865,2866,2867,2868,2869,2870,2871,3000,2872,3002,3003,2875,2876,3005,2878,2879,2880,2881,2882,2883,2884,2885,2886,3015,2888,2760,3018,2891,3020,3021,3022,3023,3153,3025,3026,3027,3028,2901,3030,3031,3032,2904,2905,2650,2651,2525,2526,2527,2528,2657,2530,2531,2532,2533,2662,2792,2665,2411,2539,2540,2414,2415,2416,2417,2418,2419,2420,2421,2423,2424,2425,2426,2300,2301,2302,2303,2432,2433,2434,2435,2436,2437,2438,2439,2440,2441,2442,2443,2573,2446,2447,2448,2449,2450,2451,2452,2453,2583,2584,2585,2455,2588,2459,2332,2458,2335,2465,2337,2594,2595,2597,2598,2726,2727,2855,2984,2985,3113,3114,3115,3244,3116,3117,3118,3119,3120,2864,3121,2994,3123,2995,2996,2997,2998,2999,3128,3001,3130,3131,3132,3004,3134,3006,3007,3008,3009,3010,3011,3012,3013,3014,2887,3144,3017,3146,3147,3148,2893,3150,3279,3152,3281,3154,2899,3156,3157,3158,3159,3160,3161,3033,2906,2652,2653,2654,2911,2656,2785,2658,2659,2660,2534,2535,2791,2538,2666,2668,2541,2542,2543,2544,2545,2546,2547,2548,2422,2551,2552,2553,2427,2428,2429,2430,2431,2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2574,2575,2576,2577,2578,2579,2580,2581,2582,2711,2712,2586,2716,2846,2718,2591,2461,2592,2463,2723,2596,2853,2725,2983,3111,3112,3240,3241,3242,3243,3371,3372,3245,3374,3246,3247,3376,3248,3249,3250,3122,3252,3124,3125,3126,3256,3127,3129,3258,3259,3260,3261,3133,3262,3135,3136,3137,3138,3139,3140,3141,3142,3143,3272,3145,3274,3019,3276,3149,3278,3151,3280,3409,3282,3155,3284,3285,3029,3287,3288,3289,3162,3163,2780,2781,2782,2655,2784,3041,2786,3043,2788,2789,2536,2537,2793,2794,2795,2669,2670,2671,2672,2673,2674,2675,2549,2550,2679,2680,2554,2555,2556,2557,2558,2559,2688,2689,2690,2691,2692,2693,2694,2695,2696,2697,2698,2699,2701,2702,2703,2704,2705,2706,2707,2708,2709,2710,2840,2841,2714,2715,2717,2587,2719,2590,2593,2589,2979,2980,2724,2854,3237,3238,3239,3368,3369,3370,3498,3499,3500,3501,3373,3503,3375,3504,3505,3377,3378,3251,3380,3381,3253,3254,3255,3384,3257,3386,3387,3388,3389,3390,3391,3263,3264,3393,3266,3267,3268,3269,3270,3271,3401,3273,3402,3275,3404,3277,3534,3663,3408,3537,3538,3283,3412,3413,3542,3415,3416,3417,3418,3034,2907,2908,2910,2783,2912,2913,2914,2787,2916,2790,2918,2667,2921,2922,2923,2797,2798,2799,2800,2801,2802,2676,2677,2678,2807,2681,2682,2683,2684,2685,2686,2687,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2828,2700,2830,2831,2832,2833,2834,2835,2836,2837,2838,3225,3098,2970,2842,2973,2713,2847,3105,2977,2721,2722,2852,2981,2982,3366,3367,3495,3496,3497,3625,3626,3627,3628,3629,3630,3502,3631,3632,3633,3634,3506,3507,3379,3509,3510,3382,3383,3512,3385,3514,3643,3515,3517,3518,3519,3520,3392,3265,3394,3395,3396,3397,3398,3399,3400,3529,3530,3531,3532,3405,3406,3407,3536,3665,3666,3411,3796,3541,3543,3671,3544,3673,3290,3035,3036,2909,3038,3039,3040,3042,2915,3171,2917,3045,2919,2920,2796,3050,2924,2925,2926,2927,2928,2929,2803,2804,2805,2806,2808,2809,2810,2811,2812,2813,2814,2815,2944,2945,2946,2947,2948,2949,2950,2951,2952,2953,2954,2827,2957,2829,2959,2960,2961,2962,2963,2965,2966,2967,2968,2969,2839,3099,2971,2844,2974,3104,2843,2849,2850,2851,3109,3110,3620,3622,3750,3751,3752,3753,3754,3755,3756,3757,3758,3886,3887,3759,3760,3761,3762,3635,3636,3508,3638,3639,3768,3769,3513,3642,3772,3644,3516,3645,3646,3648,3778,3521,3522,3652,3524,3525,3526,3527,3785,3528,3658,3659,3403,3661,3662,3535,4048,3921,4178,3795,3540,3797,3286,3799,3672,3546,3547,3291,3164,3037,3551,3167,3168,3297,3170,3044,3172,3046,3047,3048,3049,3051,3052,3053,3054,3055,3056,2930,2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,2955,2956,3086,2958,3088,3089,3090,3091,2964,3093,3095,3092,3094,3097,3356,3100,2972,3360,3232,2845,2848,2978,3107,3236,3493,3621,3749,3878,3879,3880,3881,3883,4011,4141,4013,4014,4142,4144,3888,4017,3889,3890,3891,3892,3893,3894,3895,3511,3640,3641,3770,3899,3901,3773,3902,3775,3647,3777,3650,3779,3523,3780,3653,3654,4169,4042,4043,3915,3787,3660,4174,3918,3919,3664,4049,3410,3667,3924,4053,3798,3800,3801,3802,3675,3419,3292,3165,3294,3296,3169,3426,3299,3173,3301,3429,3175,3176,3177,3178,3179,3180,3181,3183,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069,2943,3200,3201,3202,3203,3204,3205,3206,3207,3208,3209,3210,3083,3084,3085,3215,3087,3217,3218,3219,3220,3221,3223,3224,3096,3226,3228,3357,3101,3231,3103,2975,2976,3106,3235,3108,3365,3875,3877,4006,4007,4009,4137,4010,4139,4012,3885,4270,4271,4143,4015,4016,4145,4018,4019,4020,4021,3765,3766,4024,3767,3897,4027,4028,4029,4159,4160,3774,4033,3905,3906,3907,3651,3908,3781,3782,3655,4170,3656,4172,4044,4045,3789,4047,3791,3792,4177,4179,4307,3668,4180,3926,3928,3929,4058,3803,3548,3420,3166,3423,3424,3553,3554,3298,3300,3174,3430,3303,3304,3305,3306,3307,3308,3182,3184,3185,3186,3187,3188,3189,3190,3191,3192,3193,3194,3195,3196,3070,3071,3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3211,3212,3213,3214,3344,3216,3346,3347,3348,3349,3222,3350,3352,3482,3355,3354,3227,3229,3230,3361,3102,3234,3363,3364,3874,4003,4005,4134,4008,4264,4265,4138,3884,4140,4269,4398,4399,4400,4272,4273,4275,4276,4147,4148,3764,3637,4152,4023,4282,4025,4413,3898,4157,4158,4030,4289,3903,4291,3649,4035,4293,4037,4295,4425,4426,4298,4299,4171,4301,4173,4046,4175,4304,4176,4305,4050,4435,4436,3669,3927,4055,3545,3674,3931,3676,3293,3422,3295,3807,3425,3681,3427,3428,3302,3431,3559,3687,3433,3434,3435,3309,3310,3311,3312,3313,3314,3315,3317,3318,3319,3320,3321,3322,3323,3197,3198,3199,3456,3457,3458,3459,3460,3461,3462,3463,3464,3465,3466,3339,3340,3341,3342,3343,3473,3345,3475,3476,3478,3479,3480,3609,3610,3483,3484,3613,3487,4127,3358,3233,3362,3491,3492,4002,4131,3623,4133,3624,4135,4136,4266,4395,4267,4268,4397,4527,4528,4529,4530,4402,4403,4405,4406,4278,4150,4151,4281,4153,4540,4283,4284,4414,4415,4544,4031,4290,4032,4420,4163,4421,4294,4423,4553,4682,3912,4427,4556,4429,4558,3533,4303,4433,3920,4306,4434,3539,4308,3414,4054,4312,4185,3930,4187,3549,3421,3678,3679,3680,3936,3683,3555,3556,3557,3558,3686,3432,3561,3562,3436,3437,3438,3439,3440,3441,3442,3316,3445,3446,3447,3448,3449,3450,3324,3325,3326,3327,3584,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3467,3468,3469,3470,3471,3472,3601,3474,3603,3605,3607,3477,3351,3481,3353,3611,3612,3485,3486,4255,3359,3489,3490,3619,3618,3747,3494,4518,4262,4263,3882,4522,4393,4396,4524,4654,4526,4656,4657,4658,4531,4660,4146,4534,4407,4149,4022,4279,3896,4411,4154,4542,4800,4801,4802,4675,4288,3904,4162,4678,4807,4808,4937,4681,4810,4683,3657,4428,4941,4814,4686,4559,4432,4561,3793,3922,4563,4181,4309,4183,4566,4313,4186,3804,3677,3550,3552,3806,4064,4193,3938,3812,3684,3813,3814,3560,3815,3690,3563,3564,3565,3566,3567,3568,3569,3443,3444,3573,3574,3575,3576,3577,3451,3452,3453,3454,3455,3712,3713,3714,3715,3716,3717,3718,3719,3720,3721,3722,3595,3596,3597,3598,3599,3600,3729,3602,3731,3732,3606,3604,3994,3734,3608,3738,3998,3614,3743,3615,3616,3488,3617,4257,3746,4387,3748,4260,4261,4391,4520,4650,4651,4394,4523,4782,4525,4655,4786,4787,4659,4789,4532,4404,4535,4277,4665,4538,4408,4798,4799,4541,3771,4543,4674,4803,4547,4677,4034,4935,4679,4809,3909,4680,3911,4811,3913,4685,4557,3916,4815,4943,4560,4562,3794,3923,4437,4564,4565,4438,4440,4441,4442,4059,3932,3805,3682,3808,4320,3937,4066,4195,3940,3685,3688,4070,3816,3817,3818,3691,3692,3694,3695,3696,3570,3571,3572,3701,3702,3703,3704,3578,3579,3580,3581,3582,3583,3840,3841,3842,3843,3844,3845,3846,3847,3848,3849,3850,3723,3724,3725,3726,3727,3728,3858,3730,3860,3733,3863,3864,3736,3735,3737,3868,3867,3741,3740,3739,3872,3744,3745,4001,4129,4130,3876,4132,4517,4519,4647,4649,4779,4652,4780,4910,4912,4783,4785,4914,4916,4917,4274,3763,4662,4663,4923,4795,4537,4925,4797,4927,4929,4156,4285,4286,4804,4676,4806,4550,4936,4036,4938,3910,4812,3784,4684,4940,4813,4942,4431,3790,4689,4691,4690,4051,3925,4310,4567,4057,4694,4569,4315,4060,3933,3934,3809,3811,3810,4577,4579,3939,4068,3941,3942,3689,3944,3945,3819,3820,3693,3822,3823,3697,3698,3699,3700,3829,3830,3831,3705,3706,3707,3708,3709,3710,3711,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,3978,3851,3852,3853,3854,3855,3856,3857,3986,3859,3989,3861,3992,3865,3862,3866,4253,3997,3869,3995,3742,3870,3871,3873,4383,4256,4385,4004,4259,4388,4390,4775,4906,4908,4521,4909,5038,5040,4653,4913,4784,5045,5047,5048,4661,4790,5050,4791,4664,4796,4409,5054,4668,4928,4930,4931,4932,3776,4417,4161,4934,5064,5065,4939,5067,3783,4041,3786,5070,3788,5071,4688,4944,5073,4819,3670,4692,4052,4056,4311,4695,4823,4443,4444,4189,4061,3935,4063,4192,4065,4067,4322,4707,4325,4069,3943,4327,4199,3946,3947,3948,3821,3950,3824,3825,3826,3827,3828,3957,3958,3832,3833,3834,3835,3836,3837,3838,3839,4096,4097,4098,4099,4100,4101,4102,4103,4104,4105,4106,3979,3980,3981,3982,3983,3984,3985,3987,3988,4116,3990,3991,4121,3993,4379,4636,4124,4125,4126,3996,3999,4638,4511,4128,4384,4513,4258,4515,4516,4389,4646,4776,4648,5164,5036,5037,5039,4781,4911,5171,5042,5174,4401,4788,4918,5049,5051,4922,4536,4924,4410,4155,5057,5059,5187,5060,5189,4933,5063,5192,5193,5194,5066,4422,4040,3914,5196,5069,3917,4816,4817,4818,4945,4820,4821,4182,4439,4568,4184,4314,4696,4188,4317,4318,4062,4319,4191,4448,4194,4833,4196,4580,4837,4197,4198,4071,4328,4074,4075,4076,3949,3951,3952,3953,3954,3955,3956,4085,3959,3960,3961,3962,3963,3964,3965,3966,3967,4224,4225,4226,4227,4228,4229,4230,4231,4232,4233,4234,4107,4108,4109,4110,4111,4112,4113,4114,4117,4115,4119,4118,4249,4122,5018,4123,4891,4252,4381,5022,4254,4894,4000,4639,4768,4641,4514,4643,4901,4902,4904,5162,4392,5035,5165,5166,5167,5168,5170,5300,5301,5173,5175,4915,5178,4533,4919,5052,4280,4026,5184,3900,5056,5058,5316,4287,5061,5190,4805,5320,5321,4164,4038,4039,5068,5324,5197,4687,5199,4302,5074,5201,4693,5076,4949,5078,5077,4822,4316,4697,4824,4698,4446,4190,4447,4576,4321,4323,4834,4963,4324,4836,4965,4582,4072,4073,4200,4202,4203,4077,4078,4079,4080,4081,4082,4083,4084,4086,4087,4088,4089,4090,4091,4092,4093,4094,4095,4352,4353,4354,4355,4356,4357,4358,4359,4360,4361,4362,4235,4236,4237,4238,4239,4240,4241,4243,4374,4242,4247,4120,4246,4378,4250,5020,4251,4380,4892,5149,4509,4510,4766,4767,4512,4386,4642,4771,4772,5290,4774,5292,5291,4905,5293,5422,5294,5295,5427,5169,5299,5041,5172,5043,5176,5046,5177,5311,4921,5053,5055,5312,5185,5315,5188,5317,5446,5191,4549,4419,5449,4165,4166,4168,4552,5325,5198,5200,4946,5202,5330,4948,5331,5204,5205,4950,5333,4951,5079,5334,4825,4573,4445,4572,4701,4449,4706,4450,4708,4452,5092,4453,4838,4711,4455,4201,4329,4330,4204,4205,4206,4207,4208,4209,4210,4211,4212,4213,4214,4216,4217,4218,4219,4220,4221,4222,4223,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,4490,4363,4364,4365,4366,4367,4368,4369,4370,4372,4244,4375,4245,4248,4506,4634,4507,4508,5275,5019,5277,4637,4382,5023,5410,4896,5025,4769,4770,4644,4645,5417,5418,5419,5420,5548,5421,5551,5553,5423,5296,5426,5428,5302,5304,5303,5305,5309,5182,5180,4792,4666,4539,5313,5442,5186,5445,5318,5319,4418,4292,5195,5323,4167,4296,4297,4555,4300,4430,5203,4947,5456,5332,5458,5461,5587,5462,5207,4571,4952,5463,4826,4574,5208,4703,4575,4705,4578,4451,4709,4581,5221,5222,4454,4326,4712,4457,4456,4458,4331,4332,4333,4334,4335,4337,4338,4339,4340,4341,4215,4344,4345,4346,4347,4348,4349,4350,4351,4608,4609,4610,4611,4612,4613,4614,4615,4616,4617,4618,4491,4492,4493,4494,4495,4496,4497,4498,4371,4759,4631,4503,4504,5400,4377,4376,5273,5274,5146,5147,4764,4765,5407,5279,4895,4897,5541,5414,4773,5673,5545,5546,5675,5676,5678,5680,5550,5552,5554,5424,5425,5297,5298,5433,5306,5431,5308,5307,5310,5183,5181,4412,5443,5314,4670,4416,5062,5447,5448,5577,5578,5579,4551,4424,5453,5581,5072,5329,5075,5457,5459,5460,5713,5588,5843,5717,5335,4570,5591,5589,5080,4700,4702,4704,4957,4962,5090,5091,4966,5093,5094,5348,4839,5224,4583,4584,4585,4586,4459,4460,4461,4462,4336,4465,4466,4467,4468,4342,4343,4472,4473,4474,4475,4476,4477,4478,4479,4736,4737,4738,4739,4740,4741,4742,4743,4744,4745,4746,4619,4620,4621,4622,4623,4624,4625,4626,4499,4502,4500,4373,4632,4887,4505,4633,5016,4890,4763,4635,5148,4893,5021,5538,4640,5668,5282,4899,5156,5672,5801,5674,5803,5804,5677,5805,5807,5681,5682,5555,5556,5559,5432,5434,5429,5044,5436,5435,5439,4793,4667,5440,5441,5444,4671,4672,4545,5575,4548,5705,5451,5580,5708,4554,5326,5327,5328,5711,5583,5715,5840,5712,5841,5590,5844,5718,5719,5846,5592,4699,4827,4828,5593,4830,4831,4958,5218,4835,4964,4710,5350,5351,5353,5480,4840,4713,4714,4715,4587,4588,4589,4463,4464,4593,4594,4595,4469,4470,4471,4600,4601,4602,4603,4604,4605,4606,4607,4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4747,4875,4748,4749,4750,4751,4752,4627,4628,4629,4630,4758,4501,4760,4761,5143,5272,4889,4762,5531,5532,5276,5405,5278,5796,5024,4898,5027,5670,5800,5929,5802,5931,5932,5933,5934,5806,5808,5679,5683,5809,5684,5685,5686,5557,5558,5430,5689,5567,5568,5569,5179,4669,5701,5573,5574,4546,5576,5704,5450,5706,5707,5836,5709,5837,5455,5584,5586,5839,5842,5966,5969,5968,5971,5845,5972,5720,5847,4956,4829,5849,5722,4832,4960,4961,5219,5347,5220,5349,4967,5096,5606,5733,4968,5097,4841,4969,4843,4716,4717,4590,4591,4592,4721,4722,4596,4597,4598,4599,4728,4729,4730,4731,4732,4733,4734,4735,4992,4993,4994,4995,4996,4997,5125,4998,4999,5000,5001,5002,5003,4876,4877,4878,4879,4880,4754,4753,4755,4884,4885,4757,5014,4886,5015,4888,5017,5401,5530,5402,5404,5533,5150,5923,5280,5153,5797,5927,6056,5928,6057,5930,6059,6060,6061,6062,5936,5935,5811,5560,5810,5812,5563,5565,5437,5692,5817,5819,4794,5570,5571,5572,4926,5702,4673,5703,5832,5831,5833,5834,5835,5965,5454,5710,5838,5585,6094,5967,6096,5970,6095,6097,6098,6099,5974,5976,5848,5975,5977,5850,4959,5087,5978,5088,5851,5979,5216,5478,5479,5352,5607,5736,5481,5738,4842,4970,4971,4844,4845,4718,4719,4720,4849,4723,4724,4725,4726,4727,4856,4857,4858,4859,4860,4861,4862,4863,5120,5121,5122,5123,5124,5252,5253,5126,5127,5128,5129,5130,5131,5004,5005,5006,5007,5135,5008,4881,4882,5140,4883,4756,5397,5142,5270,5399,5144,5145,6046,5403,5660,5661,5406,5151,5795,5026,6054,4900,6183,6184,6185,6058,6186,6187,6188,6189,6190,6063,6064,5937,5938,5562,5564,5566,5438,5816,5695,5696,5697,5824,5699,5700,5822,5957,5830,5958,5959,5960,5322,5452,5964,6092,5582,6093,6222,5714,6352,6223,6226,6353,6224,6225,5973,6102,5721,6105,4953,6106,6362,6103,6234,6107,5089,6235,5980,5476,5477,5605,5223,5095,5608,5609,5610,5482,5099,5100,5098,4972,4973,4846,4847,4848,4850,4851,4852,4853,4854,4855,4984,4985,4986,4987,4988,4989,4990,4991,5248,5249,5250,5251,5379,5380,5381,5254,5255,5256,5384,5257,5258,5259,5132,5133,5134,5262,5136,5009,5395,5012,5010,5141,5269,5013,5398,5528,5271,6045,6305,5659,6049,6306,6179,5152,6052,5154,6053,6182,6311,6312,6441,6313,6314,6315,6444,6316,6317,6191,5687,5688,5561,6066,5939,5693,5694,5814,5815,4920,5818,5698,5827,5829,5821,5952,6085,6086,5961,6089,5963,6091,6219,6220,6221,6349,6350,6478,5716,6351,6481,6482,6610,6354,6483,6231,6233,6232,6100,6358,6230,6101,6361,6360,5217,6364,5346,5604,6109,5734,5735,5863,5737,5864,5225,6122,5226,5227,5228,5101,4974,4975,4976,4977,4978,4979,4980,4981,4982,4983,5112,5113,5114,5115,5116,5117,5118,5119,5376,5377,5378,5506,5507,5508,5509,5382,5383,5511,5512,5385,5386,5387,5260,5388,5261,5390,5263,5264,5011,5137,5138,5139,5268,5653,5527,5655,5529,5915,5916,5788,6177,6307,6178,6050,5664,6180,6310,6438,6439,6568,6440,6569,6570,6442,6443,6572,6445,6446,6318,6192,6065,5690,5691,5940,5813,5941,5942,6071,5823,5826,5828,5955,5820,5950,6087,6088,5962,6090,6218,6345,6347,6348,6477,6606,6734,6607,6480,6737,6608,6609,6738,6739,6104,6740,6612,6741,6613,6227,6356,6229,6228,6487,6359,5474,5475,6236,6365,5862,5991,6120,5993,6121,5994,5354,5355,5356,5357,5229,5102,5103,5104,5105,5106,5107,5108,5109,5110,5111,5240,5241,5242,5243,5244,5245,5246,5247,5504,5505,5633,5634,5635,5636,5637,5510,5638,5639,5640,5513,5514,5642,5515,5516,5389,5517,5518,5391,5393,5265,5266,5267,5396,5526,5654,5785,5656,6172,5658,6304,6562,5917,5662,5792,5408,5922,6565,6566,6567,6696,6697,6825,6698,6826,6699,6700,6574,6573,6447,6319,6320,6193,6194,6067,6068,6069,6070,5943,5944,5825,5956,6083,6082,5949,6215,6216,6217,6344,6474,6597,6475,6476,6605,6863,6735,6864,6865,6993,6866,6867,6995,5464,5209,6996,6611,6868,6869,6870,6489,6484,6355,6357,6486,6490,6363,6491,6366,5990,6119,5992,5865,5866,6377,5995,5485,5611,5484,5358,5230,5231,5232,5233,5234,5235,5236,5237,5238,5239,5368,5369,5370,5371,5372,5373,5374,5375,5632,5760,5761,5762,5763,5764,5765,5766,5894,5767,5768,5641,5769,5770,5643,5771,5644,5645,5646,5519,5520,5392,5522,5394,5525,5781,5783,5912,6559,5657,5786,6433,6434,6435,5918,5534,6308,6437,6693,6694,6695,6055,6824,6571,6954,6955,6827,6701,6702,6576,6575,6448,6449,6321,6322,6451,6195,6196,6453,6197,6198,5945,5946,6084,5948,6077,6335,6079,6465,6346,6603,6731,6604,6733,6862,6991,7120,6992,7121,7122,7123,6994,5465,5594,4954,5466,5724,5723,6998,6997,6871,6618,6742,6615,6485,6488,6492,5861,6493,6495,6248,6496,6249,6250,6505,5483,5740,5612,5614,5486,5359,5360,5361,5490,5362,5363,5364,5365,5366,5367,5496,5497,5498,5499,5500,5501,5502,5503,5888,5889,5890,5891,6019,5892,5893,6021,6022,5895,5896,6024,5897,5898,6026,5899,5772,5773,5901,5774,5647,5648,5521,5523,5524,6039,5782,6300,5784,6432,6560,5787,6561,6691,6436,5919,6048,5794,6822,6823,6181,6952,6953,5544,6828,6829,6956,6830,5547,6703,5549,6704,6577,6578,6450,6579,6323,6324,6452,6454,6586,6199,5953,5947,6075,6333,6463,6594,6722,6602,6859,6732,6861,7118,7111,7112,7248,7240,5206,7249,5081,5336,5082,5339,4955,5084,5213,5981,5085,5086,6239,6746,6999,6872,6745,6614,6617,6118,6247,6375,6494,6753,6376,6378,5739,5741,6506,5869,5613,5615,5487,5488,5489,5618,5619,5491,5492,5493,5494,5495,5624,5625,5626,5627,5628,5629,5630,5631,6016,6017,6018,6146,6147,6020,6148,6149,6150,6023,6151,6152,6025,6153,6154,6027,5900,6028,6029,5902,5649,5775,5650,5651,5910,5780,6041,6558,6042,5914,6688,6819,6044,6690,6563,6564,6692,6821,6951,7079,5669,5285,5158,4903,5032,4777,4778,4907,5163,6967,6839,6969,6835,6706,6840,6707,6580,6713,6581,6325,6326,6072,5954,6073,6203,6205,6206,6720,6723,6730,6860,6989,6990,7119,7110,7238,7368,7369,7497,5337,5210,5211,5083,5212,5341,5342,5214,5215,5343,5344,5345,5601,6749,7000,6743,6744,6616,6620,6619,6622,6621,6752,6633,6634,5867,6507,5868,5997,5742,5743,5744,5616,5617,5746,5747,5748,5620,5621,5622,5623,5752,5753,5754,5755,5756,5757,5758,5759,6144,6145,6273,6274,6275,6276,6405,6277,6278,6279,6408,6280,6409,6281,6282,6155,6283,6156,6157,6030,5776,5903,5777,5779,5652,5909,5911,6040,6815,5913,6817,6947,6689,6820,6176,6047,6949,6950,5667,5283,5028,5157,5030,5031,5289,5033,5161,5034,6966,7096,6968,7226,7098,7099,7228,7100,6972,6845,6714,6715,6585,6327,6200,5951,6076,6332,6718,6847,6721,6724,6852,6980,7109,7247,7239,7367,7366,7496,7624,5338,5467,5468,5340,5469,5470,5599,5471,5600,5472,5473,5602,5603,5986,7129,7002,6873,6876,6747,6748,6504,6879,6880,6761,6889,6123,5996,6125,5998,5870,5871,5872,5873,5745,5874,5875,5876,5877,5749,5750,5751,5880,5881,5882,5883,5884,5885,5886,5887,6272,6400,6401,6402,6403,6404,6533,6534,6406,6407,6536,6537,6666,6410,6539,6411,6540,6284,6285,6413,6158,5904,6031,5778,6037,6038,6167,6169,6687,6816,6171,6946,6818,6173,6174,5790,7080,5793,5281,5155,5284,5029,5286,5287,5288,5160,7094,7223,7224,7097,7225,7354,7227,7355,7356,7485,7357,7230,6974,7103,6584,6975,6201,6074,6204,6460,6589,6719,6849,6850,6978,7107,7108,7236,7237,7493,7495,7623,7752,7626,5595,5596,5725,5597,5726,5598,5727,5728,5857,5729,5730,5731,5732,5988,7127,7006,7001,6875,6877,7137,6750,6878,7138,6762,6251,6508,6381,6124,6127,5999,6128,6000,6129,6001,6002,6003,6004,6005,5878,5879,6008,6009,6010,6011,6012,6013,6014,6015,6528,6529,6658,6530,6531,6532,6661,6662,6663,6535,6664,6665,6538,6667,6796,6032,5905,6412,6668,6541,6286,6159,6414,5906,5907,6165,6814,6168,6170,6297,6944,7075,6948,6430,6302,7078,5920,5535,5409,5411,5412,5542,5415,5159,5416,7093,7222,7095,7221,7351,7353,7481,7482,7483,7484,7613,7358,7359,7232,6712,6846,6328,6080,6202,6331,6461,6462,6591,6848,7113,7106,7234,7235,7363,7364,7494,7622,7625,7753,7754,7755,5852,5853,5982,5854,5983,5855,5856,5985,5858,5987,5859,5860,5989,6245,7010,7128,7003,6874,7005,7134,7007,7017,6890,6252,6763,6254,6253,6126,6256,6384,6383,6255,6257,6130,6131,6132,6133,6006,6007,6136,6137,6138,6139,6140,6141,6142,6143,6656,6657,6786,6787,6659,6660,6789,6790,6791,6792,6793,6794,6795,6924,6289,6162,6035,6033,6160,6669,6542,6034,6543,6288,5908,6166,6295,6426,6943,7073,7074,6945,7076,6428,7077,6175,5791,5536,5537,5539,5540,5413,5543,5671,7091,7090,6963,7349,7350,7092,7352,7480,6970,7611,7229,7101,6973,7487,7488,7360,6711,6456,6458,6330,6207,6334,6590,6593,6985,6979,7233,7361,7490,7620,7621,7365,7498,7627,7628,7757,7759,7758,6108,6237,7256,6238,6110,5984,6113,6114,6115,6244,6116,6117,6246,6630,7130,7266,7004,7133,7263,7264,7265,7267,6380,6635,6892,6510,6382,6511,6896,7025,6640,6385,6258,6259,6260,6261,6134,6135,6264,6265,6266,6267,6268,6269,6270,6271,6784,6785,6914,6915,6916,6788,6917,6918,6919,6920,6921,6922,6923,6416,6415,6287,6290,6163,6161,6925,6797,6036,6799,6800,6164,6294,6685,6296,6425,7201,7203,7202,7204,7205,7206,6043,5789,5663,5665,5666,5798,5799,6831,6961,6959,7087,6705,7218,6834,6964,7220,7477,7478,6841,6971,6844,7102,7231,6836,6709,6583,6078,6081,6208,6338,6470,6727,6858,6987,6976,7105,7489,7618,7491,7492,7629,7630,7631,7632,7633,7634,7635,7507,7380,7255,7254,7126,7385,6367,6241,6242,6243,6372,6373,6374,6502,6758,7259,7131,7261,7132,7262,7395,7145,6379,6509,6638,6639,6895,7022,7150,7024,6512,6513,6386,6387,6388,6389,6262,6263,6392,6393,6394,6395,6396,6397,6398,6399,6912,6913,7042,7043,7044,7045,7046,7047,7048,7049,7050,7051,7180,6671,7181,7053,6417,6291,6545,6544,6926,7054,7055,6927,6292,6422,6813,6424,6552,7072,6427,7330,6556,6557,6298,6299,6301,5921,5924,5925,5926,6957,7085,7208,7082,7212,6832,6833,6960,6962,7219,7605,7479,7736,6842,6843,7486,7615,7104,6708,6455,6329,6211,6210,6212,6472,6728,6857,7114,6977,7370,7499,7362,7619,7750,7756,7886,7887,7751,7883,7884,7885,7888,7636,7639,7513,7386,7514,6751,6623,6625,6371,6500,6501,6503,6631,6632,7258,7524,7260,7392,7521,7391,7522,6636,6637,6894,6767,7274,7019,7148,7023,6768,6641,6514,6515,6516,6517,6390,6391,6520,6521,6522,6523,6524,6525,6526,6527,7040,7041,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7052,6670,7309,6672,6546,6420,6418,6293,6419,7182,6928,7183,7056,6421,6423,6553,7328,7200,6555,7329,6683,6554,7191,6811,6429,6303,6051,7081,7083,6958,7088,7089,7347,7475,7348,7606,7735,7609,7610,7990,7991,7612,7741,7614,7742,7616,7744,6837,6582,6457,6209,6213,6214,6471,6601,6473,7117,7243,7374,7500,7746,7747,7748,7749,7877,7879,8013,7880,8008,7881,8010,8011,6111,6112,6368,6240,6370,6497,6754,6882,6883,7139,6629,6759,6760,7257,7388,7390,7781,7779,7520,7523,6765,6764,6766,7018,7402,7147,7404,7278,7152,6769,6770,6642,6643,6644,6518,6519,6648,6649,6650,6651,6652,6653,6654,6655,7168,7169,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308,6798,7437,6673,6674,6675,6547,6548,6550,6549,6929,7311,7313,6551,6681,6679,6942,6680,6682,7331,6684,7333,6812,6939,6686,6431,6309,7084,7086,7346,7217,7216,7476,7607,7608,7737,7738,7860,7992,7739,7740,7868,7869,7870,7743,7871,7872,7745,6710,6459,6336,6340,6343,6467,6600,6729,7115,7245,7375,7617,7874,7875,7876,8006,7878,8007,8136,8015,7882,6479,8009,8139,7124,8020,6369,6498,6626,6755,6499,6628,7140,7141,7268,6887,6888,7016,7387,7517,7389,7648,7519,7778,6893,7021,6891,7273,7146,7275,7403,7406,7151,6897,6898,6771,6772,6645,6646,6647,6776,6777,6778,6779,6780,6781,6782,6783,7296,7297,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7057,7438,6801,6802,6803,6677,6676,6936,6808,7185,7312,7440,6678,6809,6810,6807,7070,6938,7458,6941,7194,7207,7199,7197,7071,7213,7344,7345,7473,7474,7733,7604,7862,7734,7865,7866,7867,7995,8121,8119,7996,7997,7998,8126,7999,8000,8001,6838,6587,6337,6339,6341,6599,6725,6986,7116,7246,7501,7873,8002,8003,8004,8005,8014,8135,6736,7250,7251,8137,8138,8140,8012,8141,6624,7008,6881,6627,6756,6884,6757,7013,7397,7143,7015,7144,7644,7516,7518,7906,7777,7907,7020,7276,7785,7658,7533,7530,7531,7534,7279,7154,7026,6899,6900,6773,6774,6775,6904,6905,6906,6907,6908,6909,6910,6911,7424,7425,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7566,7565,7058,6930,6933,6931,6804,6805,7066,6806,7696,7568,6934,6935,7069,6937,6940,7193,7068,7459,7332,7323,7324,7452,7708,7835,7214,7602,7731,7732,7603,7463,7861,7863,7864,7993,7994,8120,8249,8122,8123,8125,8124,8127,8254,8128,8256,6965,6588,6464,6468,6342,6598,6855,6856,6988,7244,7503,8129,8259,8131,8132,8133,8134,8264,8267,8266,8142,8270,8269,8268,8022,8143,7135,7136,7009,7011,7012,6885,7014,6886,7525,7526,7653,7654,7400,7515,7646,8036,7647,7776,7149,8039,8040,7660,7914,7786,7659,7662,7407,7153,7282,7027,7028,6901,6902,6903,7032,7033,7034,7035,7036,7037,7038,7039,7552,7553,7682,7683,7684,7685,7686,7687,7688,7689,7690,7820,7692,7184,7310,7314,7186,7059,7060,7062,6932,7064,7325,7569,7697,7317,7065,7198,7456,7192,7457,7449,7705,7460,7461,7334,7836,7962,7340,8219,7858,7857,7601,7730,7729,7859,7987,7988,7989,8115,8245,8374,8247,8376,8377,8252,8253,8255,8383,8384,8511,6716,6592,6466,6469,6726,6854,6984,7241,7373,8385,8257,8258,8130,8261,8521,8392,8016,8265,8271,8145,8144,8272,7767,8150,8273,8151,7645,7772,7393,7394,7396,7269,7142,7398,7271,7272,7655,7783,7774,8165,7904,8162,8164,7277,8167,7532,7910,8042,7913,7787,7661,7408,7280,7281,7155,7156,7029,7030,7031,7160,7161,7162,7163,7164,7165,7166,7167,7680,7681,7810,7811,7812,7813,7814,7815,7816,7817,7818,7691,7821,7567,7439,7441,7315,7187,7189,7188,7322,7061,7453,7063,7824,7190,7319,7196,7067,7195,7704,7586,7327,7707,7964,7709,7335,8090,8093,7983,7470,7471,7209,7211,7210,7215,8244,8243,8118,8246,8248,8375,8250,8251,8379,8507,8382,8636,8510,8638,8512,8639,6717,6595,6596,6853,6981,6983,7242,7372,8513,8386,8387,8388,8260,8389,8262,8263,8522,8394,8398,8021,8275,8274,7252,7382,7384,7125,7643,7901,7775,7649,7651,7270,7527,7399,7528,7529,7401,7902,7773,8032,8160,8033,7405,8170,7915,8166,8168,8041,8043,7790,7535,7409,7410,7283,7284,7157,7158,7159,7288,7289,7290,7291,7292,7293,7294,7295,7808,7809,7938,7939,7940,7941,7942,7943,7944,7945,7946,7819,7949,7693,7695,7442,7444,7445,7316,7321,7582,7580,7318,7320,7953,7572,7454,7584,7326,7833,7455,7960,8216,8344,8217,8091,8222,8220,8349,8111,7469,7468,7342,7339,7337,7338,7600,7341,8241,7472,8501,8503,8378,8380,8381,8508,8634,8635,8637,8764,8117,8762,8765,8766,6851,8767,6982,8640,8642,7371,7502,8514,8515,8516,8517,8518,8390,8520,8391,8393,8395,8526,7894,7895,8279,7768,7511,7253,7383,8030,7903,7652,7780,7908,7782,7656,7657,7784,7912,8293,8029,8159,8290,8161,7788,8171,8551,8296,8295,8169,7916,7791,7663,7536,7538,7411,7412,7285,7286,7287,7416,7417,7418,7419,7420,7421,7422,7423,7936,7937,8066,8067,8068,8069,8070,8071,8072,8073,8074,7947,8077,7822,7694,7570,7443,7574,7575,7577,7578,7710,7446,7448,8209,7829,7447,7451,7581,7579,7961,7834,7963,8218,8346,8221,7589,7462,7336,7464,7597,8238,8368,7467,7598,8496,7343,8370,8371,8502,8504,8505,8506,8632,8633,8509,8500,7986,8761,8763,8116,8891,8893,8894,8895,8896,8768,8898,8641,8771,8772,8643,8644,8645,7376,8519,8649,8017,8146,8525,8523,8524,8396,8397,8399,8403,8408,8156,8031,7905,7650,8034,8035,7909,8037,7911,8038,7900,8294,8548,8420,8416,8289,8419,8678,8044,8550,8425,8424,8297,8299,7664,7665,7537,7539,7540,7541,7413,7414,7415,7544,7545,7546,7547,7548,7549,7550,7551,8064,8065,8194,8195,8196,8197,8198,8199,8200,8201,8202,8075,7948,7950,7951,7698,7571,7702,7831,7703,7576,7573,7700,7701,7830,8212,7450,7838,7712,7711,8347,7583,7713,7585,8348,8351,7587,7588,7592,7593,7852,7595,7466,7465,7594,8625,8372,8373,8627,8630,8631,8629,8756,8886,8113,8242,7985,8887,8760,8759,8889,9019,8892,9021,9022,9024,9026,8897,8899,8770,8901,8903,8773,8774,8646,7504,7762,8018,8402,8147,8276,8404,8278,8405,8400,8401,8153,8284,8285,7641,7512,8288,7642,8163,8291,8292,8423,8676,8286,8157,8287,8544,8417,8418,8679,7917,8045,8554,8553,8298,7789,7792,7793,7666,7667,7668,7669,7670,7542,7543,7672,7673,7674,7675,7676,7677,7678,7679,8192,8193,8322,8323,8324,8325,8326,8327,8329,8330,8331,8203,8076,8334,7823,7825,7828,7957,8086,8214,7699,7954,8210,8083,7832,7958,7837,7706,7839,8345,7840,8475,7714,7715,8478,7716,7717,7718,7590,8106,7850,7722,7721,8622,7723,7596,7725,7599,7727,8624,7728,7856,8755,8240,7855,7984,8499,8114,8628,8758,8888,9018,9020,9150,9151,9023,9025,9156,9027,8769,8900,8905,8906,8527,7760,7761,7377,7506,8019,7891,8149,7893,7637,7379,7509,7381,8281,8410,8283,8158,7769,8414,7771,7770,8421,8422,8549,8413,8552,8542,8543,8415,8546,8547,8172,8301,8173,8427,8680,8426,7918,7919,7921,7794,7795,7796,7797,7798,7799,7671,7800,7801,7802,7803,7804,7805,7806,7807,8320,8321,8450,8451,8452,8453,8454,8328,8457,8458,8459,8460,8461,8204,8079,7952,8085,8342,7956,7827,7826,8081,8338,8466,8087,7959,8215,8094,7965,8092,7966,7967,7842,7841,7968,7969,8863,7976,7977,7719,7591,7847,7720,7849,8749,7724,7851,7726,8109,7853,8623,8110,7982,7854,8112,8369,8626,8498,8885,8757,9146,9147,9148,9149,9280,9152,9153,9154,9159,9028,9160,9033,8907,8908,8528,7889,7890,7505,7378,7763,8277,7764,7765,8280,7508,7766,7638,7510,7897,7640,8541,7898,7899,8545,8027,8028,8677,8804,8670,8672,8803,8673,8805,8674,8428,8300,8555,8681,8808,8682,8047,7920,8050,7922,7923,8052,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935,8448,8449,8578,8579,8580,8581,8455,8456,8584,8585,8587,8588,8332,8205,8078,8080,8084,8213,8341,7955,8082,8211,8467,8595,8088,8343,8089,8095,8604,8602,8223,8097,8733,7844,7843,7845,7974,8864,8865,8234,8748,8747,7848,7979,7978,8108,8877,7980,8750,8366,7981,8237,8367,8239,8753,8497,8754,8884,9013,9015,9145,9276,9277,9278,9279,9281,9411,9414,9288,9289,9161,9034,9035,8909,8655,8529,8530,8531,8532,8148,7892,8406,8535,8407,8023,8152,8024,7896,8025,8412,8154,8155,8026,8668,8675,8931,8797,8806,8927,8807,8799,8930,8802,8933,8556,8683,8810,8937,8809,8046,8175,8048,8049,8178,8051,8180,8181,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,8576,8577,8706,8707,8708,8582,8583,8711,8712,8586,8715,8716,8589,8333,8206,8208,8470,8340,8598,8726,8337,8468,8724,8853,8477,8476,8471,8472,8350,8601,8731,8096,8225,7970,7971,7846,8992,7975,8233,9123,8362,8105,9005,8107,9132,8876,9006,8493,9135,8621,8365,8879,8494,8495,8752,8882,9011,8883,9012,9014,9274,9275,9406,9407,9408,9410,9541,9413,9416,9287,9290,9163,9036,9164,9038,9039,8912,8915,9425,8533,8534,8663,9428,8792,8536,8537,8409,8538,8282,8539,8411,8669,8671,9178,8923,9052,8925,8926,8798,8934,8800,8928,9062,8801,8932,8938,8811,9065,8302,8174,8304,8176,8177,8306,8179,8308,8309,8310,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,8704,8705,8834,8835,8709,8710,8838,8839,8713,8714,8843,8844,8717,8718,8462,8207,8469,8597,8339,8336,8594,8982,8852,8727,8605,8606,8603,8474,8735,8352,8479,8224,8099,8098,7972,7973,8227,8232,8104,9252,9253,8491,9258,9259,9131,8364,9261,8235,8492,8236,9264,9136,8751,9137,9139,8881,9010,9140,9141,9142,9402,9404,9405,9536,9538,9540,9670,9542,9543,9545,9417,9291,9419,9293,9294,8656,8657,9170,8659,8660,8662,8790,8791,9555,8664,8665,9049,8666,8667,8540,9050,9051,9306,8924,9307,9180,9181,9055,9054,8936,8935,9056,9059,8929,9191,8939,9066,8429,8430,8431,8303,8305,8434,8435,8307,8436,8437,8438,8439,8311,8312,8313,8314,8315,8316,8317,8318,8319,8832,8833,8962,8836,8964,8837,8966,8840,8841,8842,8971,8972,8845,8846,8590,8335,8596,8725,8465,8593,8722,8723,9110,8473,8732,8861,8599,8600,8858,8607,8608,8226,8353,8354,8100,8993,8102,8103,8360,9508,9510,8618,9386,9387,9388,8619,9260,8363,9262,9391,9263,8878,9007,9008,8880,9009,9138,9268,9269,9270,9401,9403,9534,9535,9666,9669,9539,9799,9672,9674,9546,9675,9548,9165,9422,9168,9169,9297,9043,9299,8661,9301,9429,8920,8921,9684,8793,8794,8795,8796,9179,9053,9433,9434,9182,9308,9435,9309,9060,9063,9187,9184,9061,9057,9064,9193,8684,8557,8558,8560,8559,8432,8433,8562,8563,8564,8565,8566,8567,8568,8440,8441,8442,8443,8444,8445,8446,8447,8960,8961,8963,9091,8965,9093,8967,8968,8969,8970,9099,9100,8973,8974,8847,8463,8464,8981,8592,8721,8851,9109,8855,8729,8859,8734,8730,8728,8736,9241,8609,8480,8481,8482,8228,8101,8229,8230,9379,8231,8361,9640,8490,9514,9515,9516,9518,9389,9519,9390,8620,9134,9392,9393,9265,9266,9267,9396,9397,9398,9657,9660,9661,9533,9795,9797,9798,9800,9801,9802,9803,9676,9549,9421,9295,9296,8777,8786,9680,9681,9427,8918,9682,9048,9556,9557,9431,9685,9558,9559,9687,9562,9560,9688,9564,9438,9436,9437,9311,9310,9185,9183,9188,9058,9319,9194,8812,8685,8686,8687,8688,8561,8689,8690,8691,8692,8693,8694,8695,8696,8697,8569,8570,8571,8572,8573,8574,8575,9088,9089,9090,9092,9220,9094,9095,9096,9097,9098,9227,9228,9101,9102,8975,8719,8591,8980,8720,8849,8978,9238,8854,8860,8986,8862,8857,8984,9119,9247,9120,8737,9248,8355,8483,8356,8357,8358,8616,8488,8489,9382,9641,9642,9771,9773,9774,9645,9517,9004,9133,9648,9520,9650,9521,9394,9523,9395,9654,9786,9787,9789,9921,9793,9922,9925,9926,9927,9928,10058,9804,9932,9677,9550,9166,8910,8647,8648,8658,9300,9173,9809,10065,9810,9683,9811,9812,9686,9940,9563,9814,9561,9816,9690,9689,9818,9691,9565,9566,9189,9186,9312,9190,9313,9318,9067,8940,8813,9070,8814,8815,8816,8817,8818,8819,8820,8821,8822,8823,8824,8825,8826,8698,8699,8700,8701,8702,8703,9216,9217,9218,9219,9221,9222,9223,9224,9225,9226,9355,9229,9230,9231,9103,9233,8848,8979,8850,8977,9106,9493,8983,8987,8988,8989,8856,8985,9115,8991,9372,8610,8866,8611,8612,8484,8613,8486,8487,8359,8617,9638,9769,9770,9385,9643,9772,9644,9003,9646,9647,9649,9651,8890,9524,9522,9653,9655,9783,9913,9914,10048,9788,10050,10052,10054,10055,10056,9929,9930,9931,10060,9933,9678,8902,8904,8775,8776,8650,8779,8788,9046,9302,9937,10066,9938,9939,9813,8922,9941,9815,9942,9944,9943,9817,9946,9945,9692,9693,9439,9440,9569,9314,9441,9575,9195,9068,9196,8941,8942,8943,8944,8945,8946,8947,8948,8949,8950,8951,8952,8953,8954,8955,8827,8828,8829,8830,8831,9344,9345,9347,9348,9349,9350,9351,9352,9353,9354,9356,9357,9358,9359,9232,9104,8976,9107,9108,9236,9234,9492,9111,9116,9117,8990,9245,9114,9244,9375,9502,9121,8994,8738,8739,8740,8485,8614,8615,8744,8873,8746,8745,9898,9900,8874,9130,8875,9902,9775,9906,9144,9017,9778,9907,9908,9652,9910,10039,10041,10176,10049,10177,10307,10179,10053,10183,10184,10057,10059,10187,10188,10189,9551,9037,9167,9552,9040,8778,8651,8780,8789,9174,9430,10193,10194,9177,10067,10068,10069,10070,10073,10071,10072,9570,9694,9445,9819,9820,9567,9447,9568,9315,9442,9192,9323,9324,9197,9069,9198,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,8956,8957,8958,8959,9472,9473,9346,9476,9477,9478,9479,9480,9481,9482,9484,9485,9486,9487,9360,9361,9105,9235,9237,9366,9363,9620,9621,9112,9243,9118,9246,9113,9242,9631,9122,9249,9376,8867,8996,8995,8868,8741,8870,8742,8743,9001,9896,9897,9002,9899,10028,9901,10030,9780,9143,9016,9782,9905,9777,10035,10036,10038,10167,10298,10302,10306,10308,10309,10181,10182,10311,10185,10186,10314,10315,10316,10317,10190,9679,9935,9936,10192,9426,8911,8652,8654,8787,8919,9303,9432,10195,10323,10325,10196,10197,10198,10200,10199,9697,10075,10074,9947,9821,9695,9696,9317,9446,9574,9448,9322,9581,9453,9325,9326,9199,9200,9201,9202,9203,9204,9205,9206,9207,9208,9209,9210,9211,9212,9213,9085,9086,9087,9600,9601,9474,9475,9605,9606,9607,9608,9609,9610,9483,9613,9614,9615,9488,9489,9490,9362,9365,9364,9494,9750,9748,9239,9240,9373,9374,9500,9370,9503,9377,9761,9250,9251,9764,9124,8997,8869,8999,8998,8871,8872,9257,10025,10155,10156,10029,10157,9779,9399,9273,9272,9904,9776,10034,10163,10164,10165,10295,10432,10433,10562,10436,10435,10437,10310,10312,10313,10442,10443,10444,10061,10445,10318,10191,10319,10447,10576,10448,9041,8782,8653,8784,9045,9047,9304,10450,10322,10451,10324,10455,10326,10327,9572,10201,10077,9949,10202,9948,9822,9444,9316,9443,9320,9450,9708,9321,9580,9452,9327,9455,9328,9329,9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9214,9215,9728,9729,9602,9603,9604,9734,9735,9736,9737,9738,9611,9612,9742,9743,9616,9617,9618,9619,9491,9749,9622,9751,9367,9368,9497,9369,9501,9499,9371,9629,9378,9504,9505,9507,9380,9887,9381,9126,10022,9127,9000,9128,9129,10153,10026,10027,10284,10285,9525,9271,9400,10162,9903,10161,10033,10292,10293,10552,10294,10558,10563,10566,10565,10564,10438,10439,10440,10441,10569,10699,10571,10572,10062,10063,10446,10574,10575,10704,10705,10577,9042,8914,8781,8785,8917,9176,9305,10583,10579,10580,10453,10452,10454,10329,10328,10330,9699,9950,10076,9823,9573,9825,9698,9577,9578,9449,9451,9579,9582,9454,9583,9456,9457,9458,9459,9460,9461,9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9343,9856,9857,9730,9731,9732,9733,9863,9864,9865,9866,9739,9740,9741,9871,9744,9745,9746,9747,9876,10133,10006,9878,9495,9623,9496,9624,9498,9627,9628,9630,9632,9633,9506,9634,9763,9509,9637,9125,9254,9383,9255,9256,9513,10409,10283,10411,10539,10538,9526,9527,9909,10159,10031,10032,10290,10419,10551,10681,10683,10556,10690,10692,10694,10693,10567,10691,10695,10568,10698,10697,10570,9923,9805,10700,10573,10702,10703,10449,10578,10706,9298,9171,9044,8783,8916,9175,10586,10587,10708,10582,10709,10581,10456,10081,10457,10331,10333,10203,10204,9571,9952,9824,9826,9833,9834,9706,9705,9707,9709,9710,9711,9584,9585,9586,9587,9716,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599,9984,9985,9858,9859,9860,9861,9862,9992,9993,9994,9867,9868,9869,9870,9872,9873,9874,9875,10004,9877,9879,10007,10008,9752,9626,10137,9625,9754,9756,9755,9759,9760,9757,9635,9636,9762,9894,9767,9766,10149,9384,9512,10281,10282,10537,10666,10665,10793,10920,9781,10037,10158,10160,10417,10548,10677,10679,10810,10811,10812,10686,10817,10818,10821,10820,10819,10822,10696,10824,10434,9794,9667,9796,9806,9934,10320,10321,10064,9553,9554,10707,10710,9172,8913,10846,10844,10716,10588,10461,10714,10713,10712,10585,10584,10458,10459,9701,9700,10205,10078,9951,10079,9703,9961,9576,9704,9835,9836,9837,9838,9839,9712,9713,9714,9715,9844,9845,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,10112,10113,9986,9987,9988,9989,9990,9991,10121,10122,9995,9996,9997,9998,9999,10001,10002,10003,10132,10005,10134,10135,9880,9753,9883,10264,9881,10138,9882,9884,9758,9885,9890,9891,9892,9765,9893,9895,9639,9511,9768,10279,10410,10408,10536,10664,10919,11046,10921,10668,10287,10288,10289,10418,10547,10420,10678,10550,10809,10424,10682,10684,10816,10947,10689,10688,10946,10823,10561,9665,9282,9284,9412,9668,9544,9418,9292,9420,9423,9424,10836,10838,10839,10843,11101,10974,10845,10717,10589,10715,10590,10711,10337,10212,10083,9955,9828,10460,10332,10206,9702,9953,9831,10090,9832,9960,9962,9964,9965,9967,9968,9840,9841,9842,9843,9972,9973,9974,9846,9847,9848,9849,9850,9851,9852,9853,9854,9855,10240,10241,10114,10115,10116,10117,10118,10119,10120,10250,10123,10124,10125,10126,10127,10000,10129,10130,10131,10261,10262,10263,10136,10009,10010,10392,10390,10266,10139,10011,10012,9888,9889,10524,10142,10270,10019,10150,10023,10152,10154,10406,10534,10535,10791,10918,11303,11175,10922,10669,10415,10416,10291,10166,9528,9529,9530,9531,9658,9785,10168,10169,10813,10944,10815,10300,10301,10431,9663,9664,9537,9155,9029,9158,9030,9031,9032,9162,10834,10835,10837,10966,10840,10842,10971,11358,11102,10973,10718,10591,10720,10464,10465,10210,10211,9956,9954,9827,9830,10334,10207,10080,9959,10474,10088,10089,10217,9963,9966,10095,10096,10097,9969,9970,9971,10100,10101,10102,10103,9975,9976,9977,9978,9979,9980,9981,9982,9983,10368,10369,10242,10243,10244,10245,10246,10247,10248,10249,10251,10252,10253,10254,10255,10128,10258,10259,10388,10517,10391,10519,10521,10265,10393,10647,10777,10650,10394,10267,10013,9886,10015,10014,10018,10020,10147,10021,10024,10280,10278,10660,10662,10789,11045,11174,11302,11049,10795,10541,10414,10544,10674,10546,10675,9911,9656,9784,9912,10040,9532,10296,10554,10555,10685,9917,10045,9790,10047,9792,9409,9283,9157,9285,9286,9415,9807,9547,9808,11094,10967,10965,10968,10969,11099,11229,11359,11103,10975,10847,10721,10593,10841,10468,10340,10084,10215,10344,9957,9958,9829,10208,10216,10602,10346,10218,10091,10092,10093,10094,10223,10224,10226,10098,10099,10228,10229,10230,10231,10232,10104,10105,10106,10107,10108,10109,10110,10111,10496,10497,10370,10371,10372,10373,10374,10375,10376,10377,10378,10379,10380,10381,10382,10256,10257,10386,10387,10260,10518,10520,10648,10649,10389,10775,10776,10905,10778,10395,10140,10017,10016,10141,10271,10145,10148,10151,10402,10657,10659,10787,10916,11044,11173,11559,11432,11050,10796,10799,10286,10545,10802,10803,10804,10676,10421,10549,10422,10423,10042,9659,10425,10171,9915,9916,9662,9918,9919,9791,9920,10305,10178,10051,9924,9671,9673,10963,11092,10964,11093,11223,11095,11096,10970,11100,11230,11360,11231,11232,10849,10722,10723,10595,10469,10341,10342,10085,10472,10087,10082,10209,10345,10731,10475,10347,10219,10220,10221,10222,10351,10352,10225,10354,10227,10356,10357,10358,10359,10360,10361,10233,10234,10235,10236,10237,10238,10239,10624,10625,10498,10499,10500,10501,10502,10503,10504,10505,10506,10507,10508,10509,10510,10383,10384,10385,10515,11153,11155,10901,10903,10902,10645,10774,10904,11033,10906,10522,10268,10143,10146,10144,10526,10654,10273,10276,10277,10403,10405,10915,11172,11301,11429,11431,11304,11051,10925,10413,10543,10672,10673,11061,11063,10933,10805,10806,10935,10807,10680,10297,10170,10043,10172,10044,10173,10046,10174,10175,10304,10825,10701,10950,10949,10180,11727,11475,11091,11221,11220,11222,11224,11097,11098,11226,11356,11487,11488,11233,11104,11105,10978,10724,10597,10598,10470,10471,10343,10086,10335,10336,10730,10732,10603,10476,10348,10349,10350,10478,10479,10480,10353,10482,10355,10484,10485,10486,10487,10488,10489,10490,10362,10363,10364,10365,10366,10367,10752,10753,10626,10627,10628,10629,10630,10631,10632,10633,10634,10635,10636,10637,10638,10511,10512,10513,10514,10897,11154,11284,10516,10772,10773,10646,11031,11161,11034,10779,10523,10269,10274,10397,10398,10399,10275,10530,10407,10404,11042,11171,11300,11428,11430,11560,11178,10667,10412,10542,10800,10801,11058,10931,11060,10932,11062,10934,11064,10945,10808,10553,10426,10299,10428,10429,10557,10430,10303,10559,10560,10828,10951,10948,11978,10962,11728,11219,11603,11348,11349,11351,11353,11350,11225,11354,11357,11485,11615,11616,11361,11106,10979,11108,10725,10854,10338,10599,10213,10214,10462,10473,10858,10859,10860,10604,10477,10605,10606,10607,10608,10609,10481,10610,10483,10612,10613,10614,10615,10616,10617,10618,10619,10491,10492,10493,10494,10495,10880,10881,10754,10755,10756,10757,10758,10759,10760,10761,10762,10890,10763,10764,10765,10766,10639,10640,10641,10769,10642,10898,10771,10644,10900,11030,11159,11032,11162,10907,10651,10396,10272,10653,10527,10400,10529,10656,10531,10786,11170,11299,11556,11557,11688,11689,10794,10540,10670,10671,11059,11313,11189,11187,11191,11067,11188,11070,11072,11074,10936,11066,10427,10939,10940,10941,10942,10814,10687,12101,12102,11975,11848,10830,10832,10833,11855,11856,11347,11730,11859,11606,11608,11476,11610,11482,11483,11613,11486,11617,11489,11234,11235,10851,10852,10596,10726,10728,10339,10463,10601,10857,11114,10987,10988,10861,10733,10862,10734,10735,10736,10737,10738,10739,10611,10740,10741,10742,10743,10744,10745,10746,10747,10748,10620,10621,10622,10623,11008,11009,10882,10883,10884,10885,10886,10887,10888,10889,11017,11018,10891,10892,10893,10894,10767,10895,10768,10896,10770,10643,10899,11028,11157,11029,11158,11160,11289,11163,10652,10525,10401,10781,10910,10655,10532,10785,10913,11169,11298,11427,11684,11686,11687,11561,10797,10798,10926,10930,10928,11057,11314,11315,11316,11197,11190,11069,11071,11073,10937,11065,10938,11068,11077,11840,10943,11970,11971,11844,11974,10827,11977,11979,12106,12236,12109,12111,11984,12239,11987,11731,11735,11736,11609,11739,11484,11612,11614,11743,11745,11490,11363,10850,10980,10853,10466,10727,10467,10600,10729,10986,11242,11115,11243,11116,10989,10990,10991,10863,10992,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876,10877,10749,10750,10751,11136,11137,11010,11011,11012,11013,11014,11015,11016,11144,11145,11146,11019,11020,11021,11022,11150,11023,11024,11152,11025,11026,11027,11156,11285,11286,11287,11288,11417,11290,10908,10780,10909,10528,10783,10911,10533,10663,10788,11297,11555,11812,11685,11558,11816,11817,10924,11053,11055,11056,10929,11442,11317,11444,11192,11195,11196,11200,11201,11705,11193,11835,11836,11837,11839,12096,11969,11842,12100,11973,11976,12105,11851,11980,12107,12108,11474,11729,11602,11986,12242,11988,11863,11864,11866,11738,11741,11740,11869,11742,11873,11872,11362,11107,11236,10981,10983,10594,10592,10856,10985,11241,11370,11498,11371,11244,11245,11117,11118,11119,11120,11121,10993,10994,10995,10996,10997,10998,10999,11000,11001,11002,11003,11004,11005,11006,10878,10879,11264,11265,11138,11139,11140,11141,11142,11143,11271,11272,11273,11274,11147,11148,11149,11277,11278,11151,11279,11280,11281,11282,11283,11412,11413,11414,11415,11416,11545,11418,11035,11036,10782,10658,10784,11039,11167,10914,10661,11426,11554,12069,10792,11815,12073,11052,10927,11054,11310,11184,11186,11571,11318,11320,11572,11194,11324,11325,11198,11202,11075,11711,11964,11838,11076,12097,12098,12099,11972,12103,11849,10826,11852,11854,11981,11983,12110,11857,12112,11858,12114,12115,11989,11992,11865,11994,11867,11868,11870,11871,12001,11744,11618,10977,10848,11109,10982,10719,10855,10984,11113,11369,11625,11626,11499,11372,11373,11374,11246,11247,11248,11249,11250,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,11135,11007,11392,11393,11266,11267,11268,11269,11270,11398,11399,11400,11401,11402,11275,11276,11404,11405,11406,11407,11408,11537,11409,11410,11411,11540,11541,11542,11671,11543,11544,11546,11291,11164,11037,11165,11038,10912,11168,11041,10790,11553,11811,12327,10923,11814,11945,11181,11182,11183,11441,11185,11443,11573,11445,11319,11321,11322,11323,11326,11327,11199,11833,11962,11965,11841,11714,11968,11843,11845,10952,12229,12359,12360,12232,12235,11982,12365,12237,12493,12366,11985,12240,12244,12118,12120,12119,12121,12123,11997,11998,11999,12000,11996,11746,10976,11364,11365,11238,11110,11111,11240,11368,11497,11752,11753,11627,11500,11501,11502,11503,11375,11376,11377,11378,11379,11251,11252,11253,11254,11383,11255,11256,11257,11258,11259,11260,11261,11262,11263,11520,11521,11394,11395,11396,11397,11525,11526,11527,11528,11529,11530,11403,11531,11532,11533,11534,11535,11536,11665,11666,11538,11539,11668,11669,11670,11799,11800,11672,11673,11419,11292,11293,11166,11040,11295,11296,10917,11048,11682,11939,12456,11813,11944,12074,11309,11311,11440,11312,11570,11569,11568,12209,11698,12339,11699,11829,12471,12472,12473,12603,12475,12605,12606,12351,12095,12226,12483,12611,12612,12613,12742,12616,12744,12745,12746,12875,12747,12877,12879,12880,12881,12501,12248,12377,12378,12251,12124,12125,12128,12127,12122,11995,11874,11227,11620,11237,10972,11239,11112,11496,11624,11880,11754,11755,11628,11629,11630,11631,11632,11504,11505,11506,11507,11508,11380,11381,11382,11511,11512,11384,11385,11386,11387,11388,11389,11390,11391,11648,11649,11522,11523,11524,11652,11653,11654,11655,11656,11657,11658,11787,11659,11660,11661,11662,11663,11664,11793,11794,11795,11667,11796,11797,11798,11927,11928,11929,11801,11547,11420,11421,11294,11422,11423,11043,11047,11177,11176,11683,12455,11180,11943,12329,11946,11947,11439,12205,12333,12462,12592,12464,12594,12595,12596,12726,12599,12600,12730,12602,12604,12733,12734,12607,12736,12737,12866,12739,12740,12741,12869,12870,12871,12872,12873,12874,13003,12876,13006,13008,13009,13010,12885,12379,12380,12253,12126,12252,12257,12255,11352,11737,11481,11611,11491,11355,11228,11366,11367,11623,11879,11881,11882,11883,11756,11884,11757,11758,11759,11760,11633,11634,11635,11636,11637,11509,11510,11639,11640,11641,11513,11514,11515,11516,11517,11518,11519,11776,11777,11650,11651,11779,11780,11781,11782,11783,11784,11785,11786,11915,11916,11788,11789,11790,11791,11792,11921,11922,11923,11924,12053,11925,11926,12055,12056,12057,11930,11674,11675,11548,11549,11550,11551,11424,11425,11306,11179,11563,12325,11942,11818,12328,12458,12587,12588,12718,12717,12846,12849,12465,12466,11447,11958,11959,11453,12728,11455,12731,12859,12861,12862,12863,12864,12993,12994,12867,12995,12868,11726,12618,12743,12491,12619,10831,12748,12878,11346,13007,13136,13138,13141,12508,12507,12381,12509,12254,12256,11991,11479,11480,12250,12129,11619,11492,11493,11494,11495,11751,12007,12008,12009,12010,12011,12012,11885,11886,11887,11888,11761,11762,11763,11764,11765,11766,11638,11767,11768,11769,11770,11642,11643,11644,11645,11646,11647,11904,11905,11778,11906,11907,11908,11909,11910,11911,11912,11913,11914,12043,12044,12045,11917,11918,11919,11920,12049,12050,12051,12052,12181,12182,12054,12183,12184,12185,12058,11802,11803,11676,11677,11678,11679,11552,11305,11433,11307,11435,12197,12198,12071,12457,12585,12714,12843,12845,12974,12976,12591,11446,11700,11450,11452,11830,11582,11329,11832,11713,11205,11078,11204,12735,12865,12738,10953,10955,10954,12615,11853,10957,10829,12238,10959,10960,12494,10961,11090,13134,13263,13266,13269,12887,12506,12634,12636,12382,12510,11862,11478,11607,12249,12130,11747,11748,11621,11622,11750,12006,12135,12136,12137,12138,12139,12140,12013,12014,12015,12016,12017,11889,11890,11891,11892,11893,11894,11895,11896,11897,11898,11899,11771,11772,11773,11774,11775,12032,12161,12033,12034,12035,12036,12037,12038,12039,12040,12041,12042,12171,12172,12173,12174,12046,12047,12048,12177,12178,12179,12180,12309,12310,12311,12312,12441,12313,12314,12186,11931,11804,11805,11806,11680,11681,11809,11434,11436,11308,11941,12841,11438,12201,12330,12842,12972,12973,13102,12975,11701,11448,11574,11451,11454,11449,11328,11331,11330,11203,11206,11207,11080,11079,11846,11081,11082,11083,11084,12489,10956,11086,10958,11599,11087,11088,11217,11089,11218,13391,13264,13267,13140,12504,12761,12762,12635,12511,12505,11733,11605,11993,12384,12383,12002,11875,11876,11749,11878,12134,12263,12264,12265,12266,12267,12268,12141,12142,12143,12144,12145,12146,12018,12019,12020,12021,12022,12023,12024,12025,12026,12027,12028,11900,11901,11902,11903,12160,12289,12290,12162,12163,12164,12165,12166,12167,12168,12169,12170,12299,12300,12301,12302,12303,12175,12176,12305,12306,12307,12308,12437,12438,12439,12440,12569,12442,12443,12315,12059,11932,11933,11934,11807,11808,11937,11810,11562,11437,11819,12583,11566,12200,11567,12715,12971,13101,13229,13103,12848,11575,11576,11578,11580,11581,11456,11458,11459,11332,11333,11334,11335,11208,11719,11209,11210,11211,11212,11850,11213,11085,11214,11472,11215,11216,11473,11345,13261,13262,13394,13139,13013,12886,12760,12633,12763,12638,12376,11477,11734,12764,12513,12512,12637,12003,12004,11877,12005,12261,12390,12392,12393,12394,12395,12396,12269,12270,12271,12272,12273,12274,12275,12147,12148,12149,12150,12151,12152,12153,12154,12155,12156,12157,12029,12030,12031,12288,12417,12418,12419,12291,12292,12293,12294,12295,12296,12297,12298,12427,12428,12429,12430,12431,12432,12304,12433,12434,12435,12436,12565,12566,12567,12568,12697,12698,12570,12571,12187,12060,12061,12062,11935,11936,12065,11938,11690,11564,11820,12326,12072,11822,11695,12586,12716,12844,13231,13104,13105,11702,11703,11577,11579,11708,11583,11457,11586,11460,11461,11462,11463,11336,11721,11337,11338,11339,11340,11722,11341,11342,11343,11598,11344,11600,11601,13259,13260,13390,13265,13011,12757,12503,12632,12889,12892,12765,11604,11861,12247,12639,12640,12766,12385,12258,12131,12132,12133,12262,12391,12519,12520,12522,12523,12524,12397,12398,12399,12400,12401,12402,12403,12404,12276,12277,12278,12279,12280,12281,12282,12283,12284,12285,12286,12158,12159,12416,12545,12546,12547,12548,12420,12421,12422,12423,12424,12425,12426,12555,12556,12557,12558,12559,12560,12561,12562,12563,12692,12564,12693,12694,12695,12696,12826,12827,12828,12699,12444,12188,12189,12190,12063,12064,12066,12067,11940,11692,11565,12454,12970,11694,11948,11949,12077,12589,13230,13232,13234,13362,11831,11704,11706,11707,11709,11584,11585,11587,11588,11589,11591,11464,11720,11465,11466,11467,11468,11723,11597,11469,11470,13128,11471,13513,13258,13388,13389,13392,13137,12113,12241,12375,12888,13017,13020,12890,11732,11990,12893,12768,12641,12894,12514,12386,12259,12260,12388,12389,12518,12647,12521,12650,12651,12652,12525,12526,12527,12528,12529,12530,12531,12532,12533,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12287,12544,12673,12674,12675,12676,12677,12549,12550,12551,12552,12553,12554,12683,12684,12685,12686,12687,12688,12689,12690,12691,12820,12821,12822,12823,12824,12825,12954,12955,12956,12829,12700,12316,12317,12318,12191,12192,12193,12194,12068,11691,11693,12199,13098,11950,11696,11823,11697,11827,12461,13360,13233,13106,13107,13364,11834,13239,13367,11710,11712,11963,11716,11717,11590,11592,11718,11593,11594,11595,11596,13252,11724,11725,12492,13384,13385,13386,13387,13518,13519,13393,12884,12243,12758,13015,12631,13145,13147,12246,11860,12891,12767,12896,13019,12895,12897,12769,12387,12515,12516,12517,12646,12648,12649,12778,12779,12780,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12534,12535,12664,12536,12537,12538,12539,12540,12541,12542,12543,12672,12801,12802,12803,12804,12805,12806,12678,12679,12680,12681,12682,12811,12812,12813,12814,12815,12816,12817,12818,12819,12948,12949,12950,12951,12952,12953,13083,13084,13085,12957,12830,12572,12445,12446,12319,12320,12321,12195,12196,12070,11821,12075,13227,12204,12078,11824,12079,11826,12208,12335,13361,12977,13235,12979,13109,12856,12986,13114,13370,11966,13372,11967,11715,13503,13504,13377,13505,13250,12361,13123,12998,12999,13382,13383,13257,13515,13516,13517,13132,13395,13012,12370,13014,12759,12373,13272,13401,12117,12245,13022,13023,13148,13021,13024,13025,12642,12770,12771,12644,12645,12775,12776,12777,12906,12907,12908,12781,12782,12783,12784,12785,12786,12787,12788,12789,12790,12791,12663,12792,12793,12665,12666,12667,12668,12669,12670,12671,12800,12929,12930,12931,12932,12933,12934,12935,12807,12808,12809,12810,12939,12940,12941,12942,12943,12944,12945,12946,12947,13076,13077,13078,13079,13080,13081,13082,13212,13213,13088,13086,12701,12573,12447,12448,12449,12322,12323,12324,12453,12076,12203,12968,12332,11951,11952,11825,12080,11956,11828,12338,13491,13363,13108,12853,11960,13241,13243,12220,12474,12222,12094,12224,12225,12227,12228,12357,12358,12104,12233,12362,12490,12364,13255,13256,13514,13644,13131,12754,12883,12369,12628,12371,12372,13144,13527,13274,12116,13146,13149,13150,13278,13151,13152,12898,13026,12643,12899,12772,12773,12774,12904,12905,13034,13035,13036,12909,12910,12911,12912,12913,12914,12915,12916,12917,13045,12918,12919,12920,12921,12922,12794,12795,12796,12797,12798,12799,12928,13057,13058,13059,13060,13061,13062,13063,13064,12936,12937,12938,13067,13068,13069,13070,13071,13072,13073,13074,13075,13205,13206,13207,13208,13209,13210,13211,13340,13214,13215,13089,12958,12575,12574,12576,12577,12450,12451,12452,12581,12202,12331,12711,12713,12206,11953,11954,11955,12082,12084,11957,12341,12850,13493,12470,12088,11961,12090,12092,12349,12476,12223,12353,12354,12355,12356,12485,12486,12231,11847,12234,12363,13254,13511,13127,13643,13645,13520,13521,12496,12498,13268,12500,13271,13399,13655,13018,12374,13404,13277,13276,13279,13280,13153,13281,13154,13155,12900,12901,12902,12903,13032,13033,13162,13163,13164,13037,13038,13039,13040,13041,13042,13043,13044,13172,13173,13046,13047,13048,13049,13050,13051,12923,12924,12925,12926,12927,13056,13185,13186,13187,13188,13189,13190,13191,13192,13193,13065,13066,13195,13196,13197,13198,13199,13200,13201,13202,13203,13204,13334,13335,13336,13337,13338,13339,13341,13342,13343,13344,12962,12702,12703,12704,12705,12578,12579,12580,12582,12710,12459,12712,12460,12334,12207,12081,12210,12083,12212,12085,12086,12851,12469,12729,12089,12601,12091,12093,12221,12350,12478,12608,12609,12481,12992,12484,12614,12230,12488,13124,13253,13381,13126,13641,13129,13646,13647,12367,12368,12497,13523,12499,12629,13400,13783,12502,13402,13532,13405,13406,13407,13408,13409,13282,13283,13027,13028,13029,13030,13031,13160,13161,13290,13291,13292,13165,13166,13167,13168,13169,13170,13171,13299,13300,13301,13174,13175,13176,13177,13178,13179,13180,13052,13053,13054,13055,13184,13313,13314,13315,13316,13317,13318,13319,13320,13321,13322,13194,13323,13324,13325,13326,13327,13328,13329,13330,13331,13332,13333,13463,13464,13465,13466,13467,13469,13470,13471,13345,13220,12831,12832,12833,12706,12707,12708,12709,12837,12838,12584,12840,13486,12590,12463,12336,12337,12211,12340,12213,12214,12087,12343,12216,12217,12218,12347,12219,12732,12477,12479,12352,12480,12482,12610,13121,12996,12487,12617,13251,13380,13510,13000,13512,12620,13002,13774,12495,12624,12755,12626,12627,13143,13782,13656,12630,13658,13530,13533,13534,13535,13536,13537,13410,13411,13156,13157,13286,13158,13159,13288,13289,13418,13419,13420,13293,13294,13295,13296,13297,13298,13426,13427,13428,13429,13302,13303,13304,13305,13306,13307,13308,13309,13181,13182,13183,13312,13441,13442,13443,13444,13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,13458,13459,13460,13461,13462,13591,13592,13593,13594,13468,13597,13598,13472,13473,13347,12960,12959,12961,12834,12835,12836,12964,12966,12839,12967,12969,13225,13099,12719,12720,12593,12467,12468,12597,12342,12598,12215,12344,12345,12346,12987,12348,12989,12860,12990,12991,13119,13120,13376,13633,13122,13378,13507,13379,13125,13639,13001,13771,12621,12622,12751,12623,12882,12625,13397,13398,13654,13908,13016,13273,13785,13787,13661,13662,13663,13665,13538,13539,13412,13284,13285,13414,13415,13287,13416,13417,13546,13547,13548,13421,13422,13423,13424,13425,13553,13554,13555,13556,13557,13430,13431,13432,13433,13434,13435,13436,13437,13438,13310,13311,13440,13569,13570,13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586,13587,13588,13589,13590,13719,13720,13721,13595,13596,13725,13599,13600,13474,13475,13348,13087,13090,12963,13091,13093,12965,13094,13095,13096,13097,13226,13228,13100,12847,12721,12722,12723,12724,12725,12727,12855,12983,12857,12858,13116,12988,13117,13373,13245,13118,13246,13375,13248,13249,13506,12997,13635,13636,13765,13509,13768,13770,12749,12750,13005,12752,12753,13524,13651,13779,14036,13910,12756,13912,13913,13403,13275,13790,13664,13793,13666,13667,13540,13541,13413,13542,13543,13544,13545,13673,13674,13675,13676,13549,13550,13551,13552,13680,13681,13682,13683,13684,13685,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13439,13568,13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712,13713,13714,13715,13716,13717,13718,13847,13848,13722,13723,13724,13726,13727,13728,13601,13602,13477,13216,13217,13218,13092,13222,13221,13223,13224,13354,13353,13355,13484,13356,13357,13358,12978,12852,12980,12981,12854,12982,12984,12985,13115,13495,13244,13753,13755,13247,13501,13629,13631,13632,13760,13889,13890,13634,13892,13894,13638,13896,13898,13004,13648,13649,13522,13904,13396,13525,13781,14163,13784,13142,14039,13529,13788,13789,13791,13792,13921,13794,13795,13668,13669,13670,13798,13671,13672,13800,13801,13802,13803,13804,13677,13678,13679,13807,13808,13809,13810,13811,13812,13813,13686,13687,13688,13689,13690,13691,13692,13820,13693,13694,13695,13696,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839,13840,13841,13842,13843,13844,13845,13846,13975,13849,13850,13851,13852,13853,13854,13855,13729,13730,13605,13476,13346,13219,13349,13350,13351,13352,13481,13482,13609,13483,13485,13742,13487,13359,13488,13489,13236,13237,13110,13111,13112,13113,13878,13371,14008,14009,13627,13883,13884,14013,14014,14015,14016,14145,14146,14019,13891,14149,13895,14025,13642,13130,13133,13135,13650,13778,14160,13780,14162,14164,13270,13528,14166,14041,13915,14171,13919,13920,14049,13922,13923,13796,13797,13925,13926,13799,13927,13928,13929,13930,13931,13932,13805,13806,13934,13935,13936,13937,13938,13939,13940,13941,13814,13815,13816,13817,13818,13819,13947,13948,13821,13822,13823,13824,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967,13968,13969,13970,13971,13972,13973,13974,13976,13977,13978,13979,13980,13981,13982,13856,13857,13858,13731,13603,13604,13606,13478,13607,13479,13480,13608,13610,13740,13611,13612,13613,13614,13615,13616,13617,13490,13365,13366,13238,13240,13242,13496,13624,13880,13500,14010,14267,14268,14141,14142,14271,14144,14274,14147,14148,13508,13637,13767,14024,13773,13901,13775,13777,14030,14159,13907,14033,14291,14038,13526,14165,14167,13657,14044,14300,14174,14047,14177,14050,14051,13924,14052,14053,14054,14055,14056,14184,14057,14058,14059,14060,13933,14061,14062,14063,14064,14065,14066,14067,14068,14069,13942,13943,13944,13945,13946,14074,14075,14076,13949,13950,13951,13952,14081,14082,14083,14084,14085,14086,14087,14088,14089,14090,14091,14092,14093,14094,14095,14096,14097,14098,14100,14101,14102,14103,14104,14105,14106,14107,14108,14109,14110,13983,13984,13985,13859,13862,13734,13732,13733,13735,13736,13990,13738,13737,13739,13993,13866,13741,13743,13744,13745,13618,13619,13492,13620,13494,13368,13369,13497,13498,13752,13374,13502,14011,14140,14269,14398,14400,14272,14017,14275,13764,14278,13766,13640,13899,13772,13902,13903,13776,14157,14286,13906,14290,14418,13653,13911,14292,14040,14295,14296,14429,14302,14176,13531,14305,14178,14179,14180,14181,14182,14183,14311,14312,14185,14186,14187,14188,14316,14189,14190,14191,14192,14193,14194,14195,14196,14197,14070,14071,14072,14073,14201,14202,14203,14204,14077,14078,14079,14080,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218,14219,14220,14221,14222,14223,14224,14225,14099,14228,14229,14230,14231,14232,14233,14234,14235,14236,14237,14238,14111,14112,14113,13986,13987,13988,13860,13861,13863,13864,14118,14119,13865,13869,13867,13994,13996,13870,13871,13872,13746,13747,13748,13621,13749,13622,13623,13625,13626,13499,13628,13630,14012,14396,14397,14399,13761,14529,14402,14404,13893,14022,13769,14023,14026,13900,14154,14155,14031,13905,14034,14287,14416,14417,13652,14421,14422,14294,14552,14554,14555,14303,13918,13659,14432,14559,14306,14307,14309,14310,14438,14439,14440,14313,14314,14315,14443,14444,14317,14318,14319,14320,14321,14322,14323,14324,14325,14198,14199,14200,14328,14329,14330,14331,14332,14205,14206,14207,14208,14337,14338,14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,14351,14352,14226,14227,14356,14357,14358,14359,14360,14361,14362,14363,14364,14365,14366,14239,14240,14241,14114,14115,14116,14117,13989,13991,13992,14121,13995,14248,13868,13997,14250,14123,14124,13999,14000,13873,13874,13875,13876,13877,13750,13751,13879,13881,13754,13756,13757,13758,13886,14270,13888,14530,13762,13763,14021,14151,14405,14153,13897,14027,14028,14029,14156,14413,14032,14415,14543,14673,14035,13909,14548,14549,14550,14551,14681,14557,14430,13786,13660,14688,14560,14433,14435,14564,14565,14566,14567,14568,14441,14442,14570,14571,14572,14445,14446,14447,14448,14449,14450,14451,14452,14453,14326,14327,14455,14456,14457,14458,14459,14460,14333,14334,14335,14336,14465,14466,14467,14468,14469,14470,14471,14472,14473,14474,14475,14476,14477,14478,14479,14353,14354,14355,14484,14485,14486,14487,14488,14489,14490,14491,14492,14493,14494,14367,14368,14369,14242,14243,14244,14245,14246,14500,14120,14122,14247,14376,14505,14377,13998,14251,14125,14126,14127,14001,14002,14130,14003,14004,14005,14006,14007,14136,13882,14266,13885,13759,13887,14526,14655,14018,14531,14020,14150,14662,14534,14152,14281,14408,14410,14284,14539,14158,14161,14542,14672,14545,14037,14546,14547,14676,14678,14679,14682,14812,13914,13916,13917,14048,14816,14686,14434,14563,14437,14694,14695,14696,14569,14697,14698,14699,14700,14573,14574,14575,14576,14577,14578,14579,14580,14581,14454,14582,14583,14584,14585,14586,14587,14588,14461,14462,14463,14464,14593,14594,14595,14596,14597,14598,14599,14600,14601,14602,14603,14604,14605,14606,14480,14481,14482,14483,14612,14613,14614,14615,14616,14617,14618,14619,14620,14621,14622,14495,14623,14496,14497,14370,14371,14373,14374,14375,14501,14249,14378,14252,14253,14255,14254,14379,14507,14381,14128,14257,14129,14131,14132,14133,14134,14262,14135,14264,14265,14138,14139,14143,14525,14273,14527,14403,14276,14406,14660,14279,14280,14407,14664,14282,14283,14667,14285,14288,14414,14671,14799,14289,14293,14674,14803,14675,14677,14937,14938,14813,14042,14043,14045,14046,14817,14941,14687,14308,14819,14693,14821,14823,14824,14825,14826,14827,14828,14701,14829,14702,14703,14704,14705,14706,14707,14708,14709,14710,14711,14712,14713,14714,14715,14716,14589,14590,14591,14592,14721,14722,14723,14724,14725,14726,14727,14728,14729,14730,14731,14732,14733,14607,14608,14609,14610,14611,14740,14741,14742,14743,14744,14745,14746,14747,14748,14749,14750,14751,14879,14752,14624,14625,14498,14372,14503,14628,14502,14504,14634,14380,14506,14382,14383,14635,14636,14509,14256,14384,14258,14259,14260,14388,14261,14390,14263,14137,14393,14395,14523,14528,14401,14658,14659,14532,14533,14277,14535,14536,14537,14409,14538,14411,14412,14796,14540,14541,14544,14798,14928,14419,14420,14930,14931,15061,15063,15064,15195,14169,14170,14172,14173,14175,15072,15070,14814,14561,14436,14820,14822,14950,14951,14952,14953,14954,14955,14956,14957,14830,14831,14832,14833,14834,14835,14836,14837,14838,14839,14840,14841,14842,14843,14844,14717,14718,14719,14720,14849,14850,14851,14852,14853,14854,14855,14856,14857,14858,14859,14860,14734,14735,14736,14737,14738,14739,14868,14869,14870,14871,14872,14873,14874,14875,14876,14877,14878,15006,15007,15008,14880,15009,14626,14499,14627,14629,14630,14632,14631,14508,14638,14639,14511,14510,14763,14764,14637,14512,14385,14386,14387,14516,14389,14518,14391,14392,14394,14522,14524,14652,14781,14654,14915,14788,14661,14786,14663,14790,14666,14665,14792,14795,14922,14668,14669,14670,14926,14925,14800,14801,14802,14929,15189,15190,15062,15193,14168,14297,14298,14299,14301,14304,14947,15073,14942,14815,14562,14691,14948,15078,15079,15080,15081,15082,15083,15084,15085,14958,14959,14960,14961,14962,14963,14964,14965,14966,14967,14968,14969,14970,14971,14972,14845,14846,14847,14848,14977,14978,14979,14980,14981,14982,14983,14984,14985,14986,14987,14861,14862,14863,14864,14865,14866,14867,14996,14997,14998,14999,15000,15001,15002,15003,15004,15005,15133,15134,15135,15136,15137,15138,14753,14754,14755,14756,14758,14759,14633,15020,14766,14895,14767,14513,14891,14892,14765,14640,14641,14514,14515,14644,14517,14646,14519,14520,14521,14651,14653,14656,14785,14657,14784,14787,14789,14916,14918,14919,14793,14791,14794,14920,14921,15051,14797,14924,15054,15053,14927,15056,15057,15187,15188,15319,15321,14423,14424,14425,14426,14427,14428,14431,15329,15197,15069,14943,14689,14690,14692,15077,15206,15207,15208,15209,15210,15211,15213,15086,15087,15088,15089,15090,15091,15092,15093,15094,15095,15096,15097,15098,15099,15100,14973,14974,14975,14976,15105,15106,15107,15108,15109,15110,15111,15112,15113,15114,14988,14989,14990,14991,14992,14993,14994,14995,15124,15125,15126,15127,15128,15129,15130,15131,15132,15261,15262,15263,15264,15265,15394,15266,14881,14882,14883,14757,14886,14760,14762,14761,15022,14894,15023,14897,14770,14893,15021,14768,14769,14642,14643,14772,14645,14647,14648,14649,14650,14779,14780,15297,14782,14783,15043,14914,15045,15046,15047,15048,14917,15050,14923,15177,15049,15307,15180,15052,15310,15182,15055,15184,15314,15315,15316,15448,14804,14806,14680,14553,14683,14556,14684,14558,15323,15326,15198,15071,14944,14818,14946,14949,15205,15335,15336,15337,15338,15339,15212,15214,15215,15216,15217,15218,15219,15220,15221,15222,15223,15224,15225,15226,15227,15228,15101,15102,15103,15104,15233,15234,15235,15236,15237,15238,15239,15240,15241,15115,15116,15117,15118,15119,15120,15121,15122,15123,15252,15253,15254,15255,15256,15257,15258,15259,15260,15389,15391,15392,15393,15522,15523,15524,15010,15527,14884,14885,14888,14887,14889,14890,15277,15279,15152,15280,14898,15149,15150,14896,15024,15025,14771,14773,14774,14775,14776,14777,14778,14907,14908,14909,14910,14911,14912,14913,15171,15042,15173,15044,15174,15178,15176,15175,15435,15306,15179,15308,15438,15181,15183,15312,15442,15443,15446,14932,14805,14807,14808,14809,14810,14811,14685,15196,15585,15324,15325,15199,15200,14945,15075,15076,15333,15334,15464,15465,15466,15467,15340,15341,15342,15343,15344,15345,15346,15348,15349,15350,15351,15352,15353,15354,15355,15356,15229,15230,15231,15232,15361,15362,15363,15364,15365,15366,15367,15368,15242,15243,15244,15245,15246,15247,15248,15249,15250,15251,15380,15381,15382,15383,15384,15385,15386,15387,15388,15390,15519,15520,15521,15650,15652,15653,15269,15011,15144,15013,15015,15016,15018,15019,15148,15406,15407,15409,15154,15026,15278,15151,14899,15153,14900,14901,14902,14903,14904,14905,14906,15035,15037,15036,15038,15039,15040,15041,15169,15170,15299,15172,15301,15302,15303,15304,15305,15563,15434,15436,15437,15309,15311,15570,15573,15702,15058,15059,14933,14934,14935,14936,15065,14939,14940,15451,15452,15453,15454,15327,15328,15074,15202,15203,15204,15462,15463,15592,15594,15595,15468,15469,15470,15471,15472,15473,15474,15347,15477,15478,15479,15480,15481,15482,15483,15484,15357,15358,15359,15360,15489,15490,15491,15492,15493,15494,15495,15369,15370,15371,15372,15373,15374,15375,15376,15377,15378,15379,15508,15509,15510,15511,15512,15513,15514,15516,15517,15518,15647,15648,15649,15651,15780,15782,15526,15012,15785,15272,15014,15146,15017,15147,15276,15405,15408,15537,15410,15282,15535,15536,15027,15281,15028,15029,15030,15031,15032,15033,15034,15163,15164,15165,15293,15166,15167,15168,15554,15556,15685,15300,15558,15430,15431,15560,15432,15433,15692,15564,15693,15565,15694,15697,15829,15185,15186,15060,15317,15318,15191,15192,15066,15067,15068,15579,15580,15581,15582,15455,15456,15201,15330,15459,15332,15461,15591,15720,15593,15723,15596,15597,15598,15599,15600,15601,15602,15475,15476,15606,15607,15608,15609,15610,15611,15612,15485,15486,15487,15488,15617,15618,15619,15620,15621,15622,15496,15497,15498,15499,15500,15501,15502,15503,15504,15505,15506,15507,15636,15637,15638,15639,15640,15641,15515,15644,15645,15646,15775,15776,15778,15779,15781,15910,15783,15139,15142,15786,15143,15145,15274,15275,15404,15534,15663,15665,15538,15411,15283,15284,15664,15156,15155,15157,15158,15159,15160,15161,15162,15291,15292,15294,15680,15425,15295,15296,15424,15298,15555,15427,15429,15686,15559,15688,15690,15561,15562,15691,15820,15822,15823,15824,15440,15313,15571,15444,15572,15445,15447,15320,15194,15322,15450,15707,15708,15709,15710,15583,15584,15457,15458,15331,15460,15589,15590,15848,15721,15722,15724,15725,15726,15727,15728,15729,15730,15603,15604,15605,15735,15736,15737,15738,15739,15740,15613,15614,15615,15616,15745,15746,15747,15748,15749,15623,15624,15625,15626,15627,15628,15629,15630,15631,15632,15633,15634,15635,15764,15765,15766,15767,15768,15642,15643,15772,15773,15774,15903,15777,15906,15907,15909,15911,15655,15140,15141,15271,15658,15402,15273,15403,15533,15662,15791,15793,15666,15667,15540,15539,15412,15414,15285,15286,15287,15288,15289,15290,15418,15420,15808,15421,15936,15422,15423,15552,15553,15682,15426,15684,15428,15557,15687,15816,15817,15689,15818,15819,15948,16077,16208,15439,15568,15441,15698,15699,15700,15574,15575,15576,15449,15577,15834,15706,15836,15837,15838,15711,15712,15713,15586,15587,15588,15717,15718,15719,15849,15850,15851,15852,15854,15855,15856,15857,15858,15731,15732,15733,15734,15864,15865,15866,15867,15868,15741,15742,15743,15744,15873,15874,15875,15876,15750,15751,15752,15753,15754,15755,15756,15757,15758,15759,15760,15761,15762,15763,15892,15893,15894,15895,15769,15770,15771,15900,15901,15902,15904,15905,16034,15908,16037,16039,15267,15268,15270,15400,15401,15787,15531,15660,15532,15661,15792,15921,15922,15795,15796,15668,15541,15542,15794,15413,15415,15416,15417,15545,15419,15547,15548,15549,15550,15551,15678,15679,16065,15681,15810,15683,15813,15942,15814,15943,15815,15945,15946,16075,16204,16335,15566,15567,15569,15825,15827,15828,15701,15830,15703,15704,15705,15578,15962,15835,15964,16094,15966,15839,15840,15841,15714,15715,15716,15845,15846,15847,15977,15978,15979,15980,15853,15983,15984,15985,15986,15859,15860,15861,15862,15863,15993,15994,15995,15996,15869,15870,15871,15872,16001,16002,16003,15877,15878,15879,15880,15881,15882,15883,15884,15885,15886,15887,15888,15889,15890,15891,16020,16021,16022,15896,15897,15898,15899,16028,16029,16030,16032,16033,16035,16036,16038,16040,15395,15397,15398,15399,15529,15530,16043,15788,15789,15918,15790,16048,16049,15923,15924,15797,15669,15670,15671,16053,15543,15544,15672,15546,15674,16062,15676,16061,15677,15933,15806,15807,16064,15809,15938,15811,15812,15940,15941,16071,16072,15944,16201,16203,16334,15821,15695,15696,15952,15826,15955,15956,15957,15958,15831,15832,15833,16089,16090,15963,16093,16224,15965,15967,15969,15968,15842,15843,15844,15973,15974,15975,15976,16106,16107,16108,15981,15982,16112,16113,16114,15987,15988,15989,15990,15991,15992,16122,16123,16124,15997,15998,15999,16000,16129,16130,16004,16005,16006,16007,16008,16009,16010,16011,16012,16013,16014,16015,16016,16017,16018,16019,16148,16149,16023,16024,16025,16026,16027,16156,16157,16031,16160,16161,16163,16164,16166,16167,15525,15396,15656,15528,15657,15659,16299,16044,15917,16301,16302,16176,15920,16051,16179,16052,15925,15926,15798,15927,15799,15800,15673,15801,15802,15675,15803,15804,15932,15805,15934,15935,16063,16321,16066,15939,16067,16068,16069,16070,16199,16328,16330,15947,16076,15949,15950,15951,15953,15954,16083,16084,16085,16086,15959,15960,15961,16345,16217,16091,16092,16221,16222,16095,16096,15970,15971,15972,16100,16101,16102,16103,16104,16105,16235,16236,16109,16110,16111,16241,16242,16115,16116,16117,16118,16119,16120,16121,16251,16252,16125,16126,16127,16128,16257,16131,16132,16133,16134,16135,16136,16137,16138,16139,16140,16141,16142,16143,16144,16145,16146,16147,16276,16150,16151,16152,16153,16154,16155,16284,16158,16159,16288,16162,16291,16165,16294,16296,15654,15912,15784,15913,16042,15914,15915,15916,16300,16045,16047,15919,16177,16050,16307,16180,16181,16182,16054,16055,16056,15928,15929,16057,15930,16058,15931,16059,16060,16188,16189,16190,16191,16192,15937,16194,16195,16196,16197,16198,16327,16329,16074,16332,16205,16078,16079,16080,16081,16082,16210,16211,16212,16213,16087,16088,16215,16216,16218,16219,16220,16350,16353,16223,16097,16226,16098,16099,16228,16229,16230,16231,16232,16233,16234,16364,16237,16238,16239,16240,16370,16243,16244,16245,16246,16247,16248,16249,16250,16380,16253,16254,16255,16256,16258,16259,16260,16261,16262,16263,16264,16265,16266,16267,16268,16269,16270,16271,16272,16273,16274,16275,16277,16278,16279,16280,16281,16282,16283,16285,16286,16287,16289,16290,16292,16293,16295,16297,16168,16169,16041,16298,16170,16171,16172,16173,16174,16046,16303,16175,16304,16305,16306,16178,16308,16309,16310,16311,16183,16184,16312,16185,16313,16186,16314,16187,16315,16316,16317,16318,16319,16320,16193,16322,16323,16324,16325,16326,16200,16073,16202,16331,16333,16206,16207,16336,16209,16337,16338,16339,16340,16341,16214,16342,16343,16344,16346,16347,16348,16349,16351,16352,16225,16354,16355,16227,16356,16357,16358,16359,16360,16361,16362,16363,16365,16366,16367,16368,16369,16371,16372,16373,16374,16375,16376,16377,16378,16379,16381,16382,16383]
```
## /presets/blackhole/output.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/presets/blackhole/output.png
## /presets/blackhole/source.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/presets/blackhole/source.png
## /presets/blackhole/target.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/presets/blackhole/target.png
## /presets/cat/assignments.json
```json path="/presets/cat/assignments.json"
[1,2,3,5,6,7,9,10,11,12,13,15,16,17,18,19,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,37,38,39,40,41,42,43,44,45,174,46,47,175,48,49,50,51,52,180,181,54,182,184,57,58,59,60,188,62,190,61,63,192,64,66,194,67,193,68,198,70,199,71,73,201,75,74,76,77,204,206,78,80,209,81,82,83,84,212,85,86,87,88,217,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,107,108,109,110,112,113,114,115,117,118,119,121,122,123,125,126,0,130,131,4,134,135,8,138,139,140,141,14,144,145,146,147,20,150,151,152,153,155,156,157,158,159,160,161,162,163,164,36,165,166,167,169,170,171,172,173,302,430,303,176,305,177,306,307,308,436,437,55,439,183,438,441,442,315,316,189,445,191,318,320,448,321,65,322,323,195,454,453,326,327,72,457,202,203,459,461,333,205,79,335,208,337,338,211,340,341,213,214,215,216,345,346,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,106,235,236,237,111,240,241,242,116,245,246,120,249,250,124,253,127,128,129,259,132,133,263,136,137,267,268,269,142,143,273,274,275,148,149,279,280,281,154,284,285,286,287,288,289,290,291,292,293,294,295,296,168,297,298,299,300,301,429,431,560,304,561,434,179,435,564,53,311,312,56,185,314,186,443,187,317,446,319,576,450,449,578,324,580,196,69,197,325,581,455,456,200,329,330,588,460,332,334,207,592,336,593,210,467,339,468,469,470,471,472,473,474,475,347,348,349,350,351,352,353,354,355,356,357,358,359,233,234,363,364,238,239,368,369,243,244,373,247,248,377,251,252,254,255,256,257,258,260,261,262,264,265,266,396,397,270,271,272,402,403,276,277,278,408,409,282,283,413,414,415,416,417,418,419,420,421,422,423,551,424,425,426,427,428,556,558,559,432,688,433,178,563,818,565,309,567,440,313,568,569,570,573,827,701,574,447,575,704,577,451,706,708,579,709,452,582,712,583,584,585,586,458,587,331,717,462,719,463,464,465,466,723,596,597,342,343,599,600,601,602,603,604,476,477,478,479,480,481,482,483,484,485,486,360,361,362,491,365,366,367,496,370,371,372,374,375,376,378,379,380,381,382,385,386,387,388,390,391,392,393,394,395,525,398,399,400,401,531,404,405,406,407,537,410,411,412,542,543,544,545,546,547,548,549,550,679,680,681,553,554,555,683,557,812,813,687,689,817,562,691,692,693,566,694,310,696,697,698,572,444,828,956,829,703,830,832,831,705,834,835,707,837,838,328,710,839,841,713,842,843,715,716,845,589,590,591,720,721,850,594,595,724,598,726,727,728,729,730,731,732,733,605,606,607,608,609,610,611,612,613,487,488,489,490,492,493,494,495,497,498,499,500,501,502,504,505,506,508,509,383,384,514,515,516,389,519,520,521,522,523,524,526,527,528,529,530,532,533,534,535,536,538,539,540,541,671,672,673,674,675,676,677,678,807,808,552,809,682,811,684,685,686,814,815,816,945,690,819,820,821,1204,695,822,823,824,699,571,954,825,955,702,957,958,960,833,961,1090,963,836,964,1094,967,966,968,711,840,970,714,972,844,973,846,718,975,848,849,722,979,852,725,853,854,344,855,856,857,858,859,860,861,734,735,736,737,738,739,740,614,615,616,617,618,619,620,621,623,624,625,627,628,629,503,632,633,507,636,510,511,512,513,643,644,517,518,648,649,650,652,653,654,655,657,658,659,660,662,663,664,665,666,667,668,669,670,800,801,802,803,804,805,806,935,936,937,810,938,939,940,941,942,1070,944,1200,1328,946,947,948,1332,949,950,951,1207,952,826,1082,1083,1084,1085,1086,1213,1087,1088,959,1218,962,1093,1091,1092,965,1095,1224,1096,1225,969,1227,971,1100,1101,1102,974,847,1104,976,977,978,1107,851,1108,981,982,983,984,985,1114,986,987,988,989,862,863,864,865,866,867,741,742,743,744,745,746,747,748,622,751,752,626,755,756,630,631,760,634,635,637,638,639,640,641,642,772,645,646,647,777,778,651,781,782,783,656,786,787,788,661,791,792,793,794,795,796,797,798,799,929,930,931,932,933,934,1062,1063,1064,1065,1066,1067,1068,1197,1069,943,1199,1455,1073,1457,1075,1203,1077,1205,1078,1079,1208,1080,1209,1210,953,700,1211,1342,1215,1216,1343,1089,1345,1217,1219,1221,1220,1350,1222,1223,1352,1097,1226,1098,1099,1357,1228,1229,1230,1103,1231,1233,1105,1106,1234,1236,980,1109,1110,1111,1240,1113,1241,1242,1115,1116,1117,990,991,992,993,994,995,868,869,870,871,872,874,875,749,750,879,753,754,883,757,758,759,761,762,763,764,765,766,768,769,770,771,773,774,775,776,906,779,780,910,911,784,785,915,916,789,790,920,921,922,923,924,925,926,927,928,1058,1059,1060,1061,1190,1191,1319,1192,1193,1194,1195,1196,1324,1453,1198,1071,1072,1329,1456,1458,1459,1331,1333,1206,1590,1335,1336,1081,1337,1212,1339,1214,1340,1341,1344,1472,1346,1473,1474,1347,1348,1349,1477,1351,1479,1480,1353,1355,1354,1484,1356,1614,1486,1358,1359,1360,1232,1362,1235,1363,1364,1365,1237,1238,1367,1112,1369,1370,1371,1243,1244,1245,1118,1119,1120,1121,1122,1123,996,997,998,999,873,1002,876,877,878,880,881,882,884,885,886,887,888,890,891,892,893,767,897,898,899,900,901,902,903,904,905,907,908,909,1039,912,913,914,1044,917,918,919,1049,1051,1052,1053,1054,1055,1056,1057,1186,1187,1188,1189,1317,1318,1320,1321,1449,1322,1451,1452,1325,1454,1326,1327,1584,1585,1712,1074,1076,1460,1461,1462,1463,1464,1465,1338,1847,1466,1467,1468,1469,1597,1598,1471,1600,1601,1603,1604,1475,1476,1478,1606,1607,1608,1481,1611,1483,1482,1612,1613,1485,1615,1487,1488,1746,1361,1490,1491,1749,1621,1622,1366,1239,1624,1368,1498,1499,1500,1372,1373,1246,1247,1248,1249,1250,1251,1124,1125,1126,1000,1001,1003,1004,1005,1006,1007,1009,1010,1011,1013,1014,1015,889,1018,1019,1020,894,895,896,1026,1027,1028,1029,1030,1031,1032,1034,1035,1036,1037,1038,1040,1041,1042,1043,1045,1046,1047,1048,1050,1180,1181,1182,1183,1184,1185,1314,1315,1316,1445,1446,2204,1447,1448,1577,1450,1323,1580,1581,1709,1582,1583,1201,1330,1202,1586,1587,1588,1716,1718,1334,1591,1719,1721,1594,1595,1724,1596,1725,1470,1599,1727,1728,1729,1730,1602,1733,1731,1605,1734,1735,1609,1737,1738,1739,1610,1740,1870,2000,1871,1872,1744,1616,1489,1618,1747,1620,1492,1493,1494,1495,1496,1625,1497,1895,1627,1628,1501,1374,1375,1376,1377,1378,1379,1252,1253,1127,1128,1129,1130,1131,1133,1134,1008,1137,1138,1012,1141,1142,1016,1017,1146,1147,1021,1022,1023,1024,1025,1155,1156,1157,1158,1159,1160,1033,1163,1164,1165,1166,1168,1169,1170,1172,1173,1174,1176,1177,1178,1179,1309,1310,1311,1312,1313,1442,1443,1444,1573,2075,2074,1575,1576,1705,1578,1579,1707,1836,1837,1710,1711,1840,1713,1714,1715,1842,1844,1717,1846,1845,1592,1720,1593,1722,1723,1852,1980,1853,1854,1855,1726,1856,1986,1857,1987,1988,1989,1861,1990,1992,1864,1865,1866,1867,1996,1997,1869,1999,1742,2001,1873,1745,1874,1617,1619,1748,1877,1878,1879,1623,1880,1753,1626,1755,1883,1756,1629,1630,1502,1503,1504,1505,1506,1380,1254,1255,1256,1257,1258,1132,1261,1135,1136,1265,1139,1140,1269,1143,1144,1145,1274,1148,1149,1150,1151,1152,1153,1154,1284,1285,1286,1287,1288,1161,1162,1292,1293,1294,1167,1297,1298,1171,1301,1302,1175,1305,1306,1307,1308,1438,1439,1440,1441,1570,1571,1572,2073,2076,1574,1831,1704,1833,1706,1835,1708,1964,1965,1838,1839,1968,1841,1969,1970,1843,2100,1973,1589,1974,1848,1849,1850,1978,1851,1979,2108,1981,2109,2111,1984,2112,1985,2113,2115,1859,1860,1732,2119,1991,1993,1736,1994,2124,1995,1868,2126,1998,1741,2128,1743,2002,2131,1875,2004,1876,2005,2006,1750,1751,1752,1881,2149,1754,1884,2023,1757,1758,1631,1759,1632,1633,1507,1508,1381,1382,1383,1385,1259,1260,1262,1263,1264,1266,1267,1268,1270,1271,1272,1273,1275,1276,1277,1278,1279,1280,1281,1282,1283,1413,1414,1415,1416,1289,1290,1291,1421,1422,1295,1296,1426,1299,1300,1430,1303,1304,1434,1435,1436,1437,1567,1568,1569,1698,1699,1700,1701,2203,1702,1703,1832,1961,1834,1963,2206,2093,1966,2094,2095,1967,2096,2097,1971,2098,2099,1972,2101,2102,1975,1976,2106,2234,2235,2236,2364,1982,2365,2237,2239,2114,2242,2243,2116,2244,2117,2118,1862,2120,1863,2121,2122,2123,2252,2254,2125,2255,2256,2257,2129,2258,2130,2003,2389,2132,2133,2134,2135,2007,2008,2009,1882,2022,2021,2012,1769,1885,1886,1887,1760,1761,1634,1635,1509,1510,1384,1386,1387,1388,1390,1391,1393,1394,1395,1396,1398,1399,1400,1401,1402,1403,1405,1406,1407,1408,1409,1410,1411,1412,1542,1543,1544,1417,1418,1419,1420,1550,1423,1424,1425,1427,1428,1429,1431,1432,1433,1564,1565,1566,1695,1696,1697,1954,1827,1828,2202,1958,1830,1960,2089,1962,2090,2091,2092,2220,2221,2349,2222,2223,2224,2225,2353,2226,2227,2228,2229,2103,2230,2104,1977,2107,2362,2363,2105,2238,2110,1983,2366,2368,2240,2241,2371,2372,2245,2246,2374,2247,2248,2250,2249,2251,2380,2383,2384,2511,2127,2514,2386,2515,2387,2516,2259,2388,2261,2390,2262,2263,2136,2137,2010,2275,1896,2148,1897,2013,2014,2015,1888,1889,1762,1636,1637,1511,1512,1513,1515,1389,1518,1392,1521,1522,1523,1397,1526,1527,1528,1529,1530,1404,1533,1534,1535,1536,1537,1538,1539,1540,1541,1671,1672,1545,1546,1547,1548,1549,1551,1552,1553,1554,1555,1557,1558,1560,1562,1563,1693,1694,1823,1824,1825,1826,1956,1946,1957,1829,1959,2088,2216,2218,2219,2347,2348,2476,2477,2350,2478,2351,2479,2352,2354,2355,2482,2483,2484,2357,2358,2231,2359,2233,2361,2490,2491,2492,2493,2494,2367,2497,2369,2498,1858,2500,2501,2373,2502,2375,2376,2377,2378,2508,2509,2510,2382,2253,2512,2641,2513,2642,2385,2644,2645,2517,2260,2518,2519,2391,2264,2265,2138,2139,2150,2535,2269,2141,1770,1643,2016,2017,1890,1763,1764,1638,1640,1514,1516,1517,1519,1520,1649,1650,1524,1525,1654,1655,1656,1657,1531,1532,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1800,1673,1674,1675,1676,1677,1678,1679,1680,1682,1683,1556,1686,1559,1561,1691,1692,1822,1952,1953,2082,1945,1955,2084,2085,2086,2087,2215,2217,2474,2346,2475,2603,2604,2732,2605,2606,2607,2480,2608,2481,2609,2610,2356,2612,2485,2486,2487,2360,2232,2488,2489,2619,2620,2621,2622,2623,2495,2496,2625,2370,2499,2628,2630,2503,2632,2504,2505,2506,2507,2379,2638,2381,2639,2640,2769,2770,2772,2771,2643,2773,2774,2775,2646,2647,2648,2392,2393,2394,2277,2011,2140,2024,2409,2142,1771,1644,2144,2018,1891,1765,1639,1641,1642,1645,1646,1647,1648,1777,1651,1652,1653,1782,1783,1784,1658,1659,1660,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1801,1802,1803,1804,1805,1806,1807,1808,1681,1811,1684,1685,1687,1689,1690,1821,1950,1951,2072,2081,2211,2083,2212,2213,2214,2343,2472,2473,2345,2602,2731,2334,2857,2859,2860,2733,2861,2734,2735,2736,2737,2611,2738,2739,2613,2741,2614,2615,2744,2616,2617,2618,2747,2748,2749,2751,2752,2624,2626,2755,2627,2757,2629,2758,2631,2633,2762,2634,2635,2636,2637,2766,2767,2768,2897,2898,2900,3029,2902,3031,2901,2903,2529,2904,2776,2276,2520,2521,2266,2267,2151,2663,2281,2270,2143,2027,2273,2145,2019,1892,1766,1768,1772,1773,1774,1775,1776,1778,1779,1780,1781,1910,1911,1785,1786,1787,1788,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1936,1809,1810,1812,1813,1814,1688,1819,1820,2079,2080,1948,2337,2210,2340,1947,2330,2470,2471,2344,2601,2729,2858,2205,2592,2721,2850,2986,2988,2989,2862,2863,2864,2865,2866,2867,2740,2868,2742,2870,2743,2872,2873,2745,2746,2875,2876,2877,2750,2879,2880,2753,2754,2884,2756,2886,2759,2760,2761,2890,2763,2764,2893,2765,2895,2896,3024,3025,3027,3028,3030,3038,2911,2784,3032,2657,2530,2403,2531,2404,2649,2522,2523,2268,2408,2537,2282,2271,1894,2028,2274,2146,1893,1767,1898,1900,1902,1903,1904,1905,1906,1907,1908,1909,2038,1912,1913,1914,1915,1916,2045,2046,2047,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,1935,1937,1938,1939,1940,1941,1815,1816,1817,1818,2071,2209,2329,1944,2339,2341,2469,2342,2599,2600,2730,2332,2333,2462,2463,2849,3114,2987,3115,3116,2990,2991,2992,2993,2994,2995,2996,2997,2869,2998,2871,3000,3001,2874,3002,3003,3004,3005,2878,3007,3008,2881,2882,2883,3012,2885,2887,2888,2889,3018,2891,2892,3021,3022,2894,3023,2899,3154,3026,3157,3165,3166,3039,2912,2913,2785,2786,2658,2661,2660,2662,2906,2395,2396,2524,2397,2398,2399,2154,2155,2026,2147,2020,2025,1899,1901,2030,2031,2032,2033,2034,2035,2036,2037,2039,2040,2041,2042,2043,2044,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,2185,2186,2187,2188,2189,2190,2063,2064,2065,2066,2067,2068,2069,1942,1943,1949,2077,2208,2338,2201,2468,2597,2598,2727,2728,2856,2331,2985,2590,2719,2720,3106,2978,3242,3243,3117,3118,3246,3119,3120,3121,3122,3123,3124,3125,3126,3127,2999,3128,3129,3130,3131,3132,3133,3006,3135,3136,3009,3010,3011,3140,3013,3014,3015,3016,3017,3147,3019,3020,3150,3151,3152,3153,3155,3156,3158,3160,3293,3421,3167,3040,3041,2914,2915,2788,2789,2659,2777,2650,2651,2652,2525,2526,2527,2272,2411,2283,2156,2279,2152,2153,2029,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2191,2192,2193,2194,2195,2196,2197,2200,2199,2207,2078,2336,2466,2467,2596,2458,2726,2855,2984,2460,3113,2589,2461,2591,2848,2977,2979,3107,3244,3372,3245,3374,3247,3248,3377,3249,3250,3251,3252,3253,3254,3255,3256,3258,3259,3260,3261,3262,3134,3263,3264,3137,3138,3139,3268,3141,3142,3143,3144,3145,3146,3148,3277,3149,3279,3280,3281,3282,3285,3286,3420,3548,3292,3294,3295,3169,3042,3170,2916,2917,3430,2905,2778,2779,2536,2653,2922,2278,2400,2410,3050,2285,2284,2157,2286,2158,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,2440,2441,2442,2443,2444,2445,2446,2319,2320,2321,2322,2323,2452,2324,2328,2198,2070,2326,2456,2457,2335,2595,2724,2725,2983,2587,2459,2717,2588,2846,2847,3105,3370,3236,3235,3364,3373,3501,3502,3375,3503,3376,3378,3379,3380,3381,3382,3383,3384,3385,3257,3386,3387,3388,3389,3390,3391,3392,3265,3266,3267,3269,3398,3270,3271,3272,3273,3274,3275,3276,3407,3278,3408,3283,3410,3284,3159,3547,3675,3549,3422,3296,3168,3297,3043,3172,3045,3174,3033,2907,2534,2780,2656,2794,2402,2538,2401,2667,2539,2540,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2557,2558,2559,2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574,2447,2448,2449,2450,2451,2580,2455,2327,2454,2325,2453,2465,2723,2464,2852,2853,2854,2714,2715,3241,2716,2718,2974,2976,3104,3498,3371,3499,3500,3628,3629,3630,3631,3632,3504,3505,3506,3507,3508,3509,3510,3511,3512,3513,3514,3515,3516,3517,3518,3519,3520,3393,3394,3395,3396,3526,3527,3399,3400,3401,3402,3403,3404,3405,3406,3409,3411,3538,3413,3287,3674,3802,3676,3550,3423,3552,3298,3171,3299,3429,2918,3034,2532,3035,2908,2921,2781,2654,2405,2406,2280,3051,2795,2541,2542,2543,2672,2544,2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2685,2686,2687,2688,2689,2690,2691,2692,2693,2694,2695,2696,2697,2698,2699,2700,2701,2702,2575,2576,2577,2578,2579,2708,2711,2583,2584,2581,2837,2712,2594,2585,2713,2851,2982,3111,3112,2843,2845,2973,3102,3232,3233,3234,3755,3365,3627,3756,3757,3758,3759,3760,3761,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648,3521,3522,3523,3524,3397,3525,3528,3529,3530,3531,3532,3533,3534,3536,3535,3537,3539,3412,3414,3929,3803,3931,3930,3424,3425,3553,3426,3556,3044,3173,3161,3162,2790,2791,3048,2909,2782,2666,2665,2407,2923,2924,2668,2669,2670,2671,2801,2673,2674,2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830,2703,2704,2705,2706,2707,2836,2839,2582,2709,2964,2710,3093,2722,2980,2586,2981,3109,3239,3240,2971,2975,3101,3103,3231,3361,3362,3363,3620,3622,3751,3884,3886,3885,3887,3888,3889,3762,3763,3764,3765,3766,3767,3768,3769,3770,3771,3772,3773,3774,3775,3776,3649,3650,3651,3652,3653,3654,3655,3656,3657,3659,3660,3661,3662,3664,3663,3666,3540,3541,3801,4056,4057,4058,3677,3551,3679,3809,3427,3555,3300,3288,3289,3163,3176,3037,2920,3049,2533,2528,2793,2664,2796,3052,2925,2797,2798,2799,2800,2802,2931,2803,2804,2805,2806,2807,2808,2809,2810,2811,2812,2941,2942,2943,2944,2945,2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2831,2832,2833,2834,2835,3088,2838,2963,3092,3220,2840,2966,2593,2841,2842,3110,3367,3368,3369,2972,3100,3230,3359,3360,3489,3490,3491,3492,3493,3750,3880,4014,4012,4013,4015,4016,4017,3890,3891,3892,3893,3894,3895,3896,3897,3898,3899,3901,3902,3903,3904,3778,3777,3779,3780,3781,3783,3784,3785,3786,3658,3788,3789,3790,3791,3793,3665,3667,3796,3542,4183,3415,3804,3678,4190,4063,3681,3682,3683,3428,3416,3417,3290,3046,2910,3036,3177,2783,2655,2792,3180,3310,3179,3053,2926,2927,2928,2929,2930,3059,3060,2932,2933,2934,2935,2936,2937,2938,2939,2940,3069,3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084,3085,3086,2959,2960,2961,2962,3091,3216,3344,3345,3347,2965,2967,3095,2968,2969,2844,3238,3366,3494,3497,3626,3229,3358,3487,3488,3617,3618,3619,3749,3621,4009,4142,3879,4008,4141,4143,4144,4145,4018,4019,4020,4021,4022,4023,4024,4026,4027,3900,4029,4030,4031,4033,3905,3906,3907,3908,3909,3910,3782,3912,3913,3914,3787,3916,3918,3919,3792,3921,3794,3795,3797,4184,4185,4312,3932,4062,3808,3936,3810,3684,3557,3546,3301,3164,3302,3303,3304,3434,3306,2919,2787,3181,3183,3178,3307,3308,3054,3056,3057,3058,3187,3188,3061,3190,3062,3063,3064,3065,3066,3067,3068,3197,3198,3199,3200,3201,3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3087,3215,3089,3090,3219,3217,3346,3474,3731,3221,3094,3476,3605,3097,3108,2970,3495,3496,3625,3228,3357,3486,3743,3616,3745,3746,3747,3748,4270,4138,3878,4137,4269,4398,4399,4271,4272,4146,4147,4148,4149,4150,4151,4153,4025,4154,4156,4028,4157,4159,4032,4161,4034,4036,4035,4037,4039,4038,3911,4041,4043,3915,4044,4045,3917,4048,3920,4050,3924,3923,4313,3928,4059,4189,4061,3935,4064,3680,3554,3811,3685,3544,3418,3291,3431,3175,3433,3047,3564,3182,3565,3309,3435,3436,3438,3055,3184,3185,3186,3315,3316,3189,3318,3319,3191,3192,3193,3194,3195,3196,3325,3326,3327,3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3465,3338,3339,3340,3341,3342,3470,3343,3218,3473,3472,3601,3475,3348,3477,3222,3349,3096,3224,3353,3237,3226,3099,3227,3356,3485,3614,3872,3744,4140,4267,3875,4133,3877,4396,4395,4136,4265,4266,4657,4658,4400,4273,4275,4404,4276,4278,4279,4152,4282,4411,4155,4284,4414,4158,4289,4160,4162,4163,4292,4164,4165,4166,4167,4170,4171,4042,4172,4174,4046,4047,4177,4049,4055,3922,4182,4186,4187,4188,3543,3807,3937,3938,3939,4068,3672,3673,3686,3558,3687,3432,3305,4074,3563,4076,3694,3566,3311,3437,3439,3440,3312,3313,3314,3443,3444,3317,3446,3447,3448,3320,3321,3322,3323,3324,3453,3454,3455,3456,3457,3458,3459,3460,3461,3462,3463,3464,3592,3593,3466,3467,3468,3469,3597,3598,3471,3602,3599,3600,3728,3730,3603,3732,3604,3350,3478,3733,3098,3354,3624,3752,3753,3613,3754,3882,3883,3615,3874,4391,4397,3876,4005,4392,4135,4007,4523,4394,4785,4656,4659,4660,4274,4533,4406,4277,4407,4280,4281,4412,4283,4413,4671,4544,4672,4546,4288,4290,4293,4677,4549,4809,4938,4425,4685,4428,4173,4429,4686,4687,4311,4439,4310,4440,4051,3669,4314,4060,4316,4318,4191,4065,4066,3799,3812,3800,3419,3941,3559,3815,3560,3561,4075,3562,3693,3695,3822,3567,3568,3569,3441,3570,3442,3571,3572,3445,3574,3575,3576,3577,3449,3450,3451,3452,3581,3582,3583,3584,3585,3586,3587,3588,3589,3590,3591,3719,3720,3721,3594,3595,3596,3724,3725,3726,3727,3729,3855,3857,3859,3986,3223,4243,4115,3861,3352,3225,3481,3355,3483,3881,3484,3612,4010,3742,4011,3873,4520,4002,4003,4004,4006,4521,4651,4264,4652,4654,4655,4786,4787,4789,4401,4403,4661,4405,4663,4794,4408,4924,4925,4670,4285,4543,4673,4674,4547,4675,4291,4676,4678,4681,4296,4555,4040,4813,4300,4557,4558,4175,4689,4820,4438,4567,4178,3668,3925,4315,4317,4445,4319,4192,4195,4067,3940,3813,3545,4198,3814,3943,3688,3818,3691,4204,4077,3692,3951,3824,3696,3825,3697,3698,3699,3700,3701,3573,3702,3703,3704,3705,3706,3578,3579,3580,3709,3710,3711,3712,3713,3714,3715,3716,3717,3718,3846,3847,3848,3849,3722,3723,3851,3852,3853,3854,3858,3983,3856,3984,3985,3860,4244,4501,4373,3351,3479,3480,3608,3623,3611,3868,4518,3869,3870,3871,4139,4001,4129,4131,4132,4261,4262,4263,4522,4393,4781,4782,4783,4913,4914,4915,4529,4402,4790,4662,4923,4792,4665,4796,4797,4798,4799,4542,4415,4416,4803,4548,4805,4420,4807,4679,4810,4168,4684,4299,4556,4814,4688,4690,4176,4305,4692,4695,4568,4179,3670,3798,4444,3671,4320,4193,4194,4196,4323,3933,3805,3806,3934,3942,3816,3689,3819,3690,4332,4337,4078,3823,3952,3953,3954,3826,3827,3956,3828,3829,3830,3831,3832,3833,3834,3835,3707,3708,3837,3838,3839,3840,3841,3842,3843,3844,3845,3973,3974,3975,3976,3977,3850,3978,3979,3980,3981,3982,4114,4113,4111,4112,4241,3987,4372,4500,3606,3482,3607,3609,3738,4645,4517,4646,4647,3741,3999,4000,4268,4130,4258,4388,4259,4260,4134,4650,4907,4908,4909,4653,5040,4784,5043,5044,5174,4531,4918,4922,4791,4534,4793,4409,5053,4669,4800,4928,4801,4802,4287,4545,4418,4806,4937,4808,4682,4940,4169,4427,4301,4815,4302,4817,4818,4819,4821,4822,4434,4441,4052,3926,4054,4446,4448,4574,4321,4322,4443,4571,4453,4326,4199,4200,4071,3817,3946,3947,4206,3820,3950,4079,4080,4081,4082,4083,3955,4084,4085,3957,3958,3959,3960,3961,3962,3963,3964,3836,3965,3966,3967,3968,3969,3970,3971,3972,4100,4101,4102,4103,4104,4105,4106,4107,4108,4109,4110,4238,4242,4239,4240,4497,4369,4116,3988,4245,3735,3610,3736,3737,3739,4383,3867,3740,3997,4519,3998,4128,4649,4257,4516,4524,4389,4390,4778,4906,4779,4780,5038,5039,4910,5041,5042,5173,4528,4788,4917,5047,4920,4921,4664,4795,4410,4539,4927,5056,4929,4930,5062,4804,4934,4936,5065,4939,4812,4811,4297,4298,4942,4943,4303,4816,4946,4691,4948,4823,4306,4307,4180,4053,4181,3927,4447,4442,4449,4450,4570,4451,4325,4197,4327,4069,4201,4072,3945,4073,4203,3948,3949,3821,4208,4209,4338,4210,4211,4212,4213,4214,4086,4087,4088,4217,4089,4090,4091,4092,4093,4094,4095,4096,4097,4098,4099,4227,4228,4229,4230,4231,4232,4233,4234,4235,4236,4237,4365,4370,4499,4367,4496,4371,4368,4628,3734,3862,3864,3863,3865,4249,3866,3994,4123,3996,4775,4125,4126,4384,4776,4514,4386,4387,4643,4772,4526,4905,5035,5165,5166,5168,5299,5300,5301,5171,5045,4916,5175,4532,4919,5050,4536,4537,5181,4286,4926,5055,5057,4931,5060,5063,4935,5064,5066,4422,4295,4423,4941,5198,5069,4559,4945,4304,4947,5075,4433,4949,4824,4696,4827,4309,4308,4572,4575,4576,4577,4569,4578,4324,4701,4573,4582,4583,4328,4070,3944,4588,4205,4333,4334,4207,4336,4594,4466,4467,4339,4340,4341,4342,4343,4215,4216,4345,4346,4218,4219,4220,4221,4222,4223,4224,4225,4226,4354,4355,4356,4357,4358,4359,4360,4361,4362,4363,4364,4493,4366,4494,4498,4495,3990,4627,4624,4117,4756,4118,4247,3992,4119,4121,4122,3995,4124,4252,4253,4254,4255,4648,4385,4515,4644,4771,5033,5417,5034,5036,5291,5292,5294,5167,5428,4911,5169,4527,5172,4530,5302,5046,5048,5052,5049,5179,5054,5182,5184,5185,5058,5186,5191,5190,5061,4419,5192,4294,4550,4424,5068,5197,5071,4944,4561,5073,5202,4562,5076,4950,4951,4435,4953,4437,4828,4829,4830,4703,4704,4706,4580,4698,4452,4702,4454,4455,4711,4457,4586,4587,4202,4461,4462,4335,4464,4465,4722,4595,4596,4468,4469,4470,4471,4472,4344,4473,4474,4475,4347,4348,4349,4350,4351,4352,4353,4481,4482,4483,4484,4485,4486,4487,4488,4489,4490,4491,4492,4620,4621,4622,4626,4623,4753,4625,3989,4755,4374,3991,4120,4248,4250,3993,4251,4507,4380,4773,4508,4127,4639,4256,4513,4642,4904,4525,4901,5030,5290,5163,5419,5164,5293,5427,5037,5296,5426,5429,5170,5430,5304,5176,5303,5051,5180,4538,4666,4541,5183,5313,5059,5187,5188,5189,4933,4421,5194,5067,4551,4552,4426,4554,4430,4431,5074,4432,5329,5203,5204,5205,5334,4952,4693,4436,4956,4957,4831,4825,4707,4705,4579,4700,4832,5086,4959,4960,4584,4585,4330,4459,4329,4331,4590,4848,4720,4463,4593,4850,4723,4724,4725,4597,4598,4599,4600,4601,4602,4603,4604,4476,4477,4478,4479,4480,4608,4609,4610,4611,4612,4613,4614,4615,4616,4617,4618,4619,4748,4749,4750,4754,5139,4751,4883,4376,4375,4246,4502,4632,4885,5014,4504,4633,4378,4379,4381,4382,4636,4510,4511,4640,4641,4770,4777,5028,5029,5289,5544,5418,5545,5546,5421,5422,5554,5295,5553,4912,5298,5431,5558,5560,5432,5433,5309,5308,5436,4540,5310,5314,5312,4417,5316,5317,5319,5193,5320,5325,4680,4553,5326,5327,5072,5201,4560,5330,5331,5332,5457,5333,5465,5335,4566,4564,5084,5723,4958,5213,4961,4699,4708,4835,4581,4838,5088,4839,4456,4712,4714,4715,4458,4460,4591,4589,4716,4849,4592,4978,4851,4852,4853,4854,4726,4727,4728,4729,4730,4731,4732,4733,4605,4606,4607,4736,4737,4738,4739,4740,4741,4742,4743,4744,4745,4746,4747,4875,4876,4877,4878,5267,4882,4879,5011,4752,4881,5012,4629,4503,4757,4630,4377,4506,4512,4774,4634,4509,4638,4764,4903,4768,4769,4898,4902,4900,5156,5416,5676,5673,5548,5547,5420,5555,5556,5682,5557,5684,5685,5686,5687,4535,5559,5688,5437,5305,4668,5438,5566,5695,5315,5442,5444,5447,5318,5448,5321,5452,5453,4683,5579,5070,5199,5583,5328,5586,5584,5585,5456,5206,5464,5336,4954,5595,4955,4694,5085,5215,4833,4962,4834,4836,4709,5214,5217,5087,4840,4841,4969,4713,4844,5230,5103,4975,4718,4719,4721,5106,4979,4980,4981,4982,4983,4855,4856,4857,4858,4859,4860,4861,4862,4734,4735,4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,5002,5003,5004,5005,5006,5268,5007,5135,4880,5008,5136,5137,5141,4758,4631,4505,4760,4888,5539,4761,4635,4637,4765,4767,4894,4896,5031,5032,4899,5670,5671,5543,5672,5675,5803,5674,5804,5809,5937,5810,5681,5940,5813,5814,5815,5816,5817,5689,5947,5821,5822,5694,5567,5823,5824,5443,4932,5701,5830,5702,5707,5580,5581,5454,5582,5710,5200,5458,5712,5714,5455,5713,5842,5463,5592,5594,5082,5466,4565,4697,5343,5216,4826,5089,5218,5091,4837,4965,5222,5600,5220,4968,4710,5221,4843,5359,4845,4846,4717,4847,4977,5234,5235,5107,5108,5109,5110,5111,4984,4985,4986,4987,4988,4989,4990,4991,4863,4992,4993,4994,4995,4996,4997,4998,4999,5000,5001,5130,5131,5132,5133,5134,5395,5396,5519,5263,5397,5010,5009,4884,5013,4886,5270,4887,5015,5151,4762,4763,4766,4892,4893,4897,4895,5025,5026,5027,5157,5798,5542,5799,5932,5800,5801,5802,5683,5811,5938,5939,5812,6068,6069,5942,6071,5943,5944,5945,5946,4667,5948,5949,5950,5951,5952,5825,5828,5829,5958,5959,5835,5708,5836,5834,5964,5837,5967,5711,5839,5840,5969,5841,5970,5593,5722,5720,5337,5083,5596,5212,5342,5470,5344,5725,5090,4963,4964,4966,5094,5219,5095,4967,4970,4842,4971,5616,5102,4974,4972,4976,5105,5362,5363,5364,5236,5237,5238,5239,5240,5112,5113,5114,5115,5116,5117,5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5258,5259,5260,5261,5262,5523,5524,5525,5391,5140,5266,5265,5269,5526,4759,5271,5143,4889,5918,5666,4891,5023,5021,5022,5024,5154,5153,5159,5155,5160,5797,5927,5929,6058,6060,5928,6059,5931,6066,6194,6195,6067,6196,5941,6070,6072,6073,6201,6074,6075,6076,6078,6077,6079,5953,6080,5956,5957,6086,6087,5960,5962,5963,5709,6091,5838,5966,6094,6096,5968,6224,6225,6097,6098,5591,5721,5080,5081,5210,5211,5597,5724,5855,5345,5341,5475,5347,5092,5093,5351,5599,5728,5097,5098,5225,5099,5358,5487,5100,4973,5104,5233,5617,5490,5491,5492,5365,5366,5367,5368,5369,5241,5242,5243,5244,5245,5246,5247,5248,5249,5250,5251,5252,5253,5254,5255,5256,5257,5387,5388,5389,5390,5647,5651,5652,5779,5392,5394,5264,5138,5782,5393,5142,5527,5528,4890,5919,5018,5019,5020,5149,5277,5152,5286,5282,5158,5284,5925,5926,6188,6056,6186,6057,6316,5930,6449,6321,6322,6450,6323,6324,6197,6198,6199,6200,6202,6330,6203,6204,6205,6206,6207,6081,6208,6212,6213,6088,6214,6216,6217,6090,6218,5965,6093,6095,6223,6351,6609,6352,6481,6353,6482,6354,5849,6104,5977,6105,5850,5978,5979,5854,5980,5472,5474,5346,5348,5478,5350,5223,5096,5224,5353,5611,5227,5357,5229,5231,5228,5232,5361,5745,5618,5619,5620,5493,5494,5495,5496,5497,5498,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5381,5382,5383,5384,5385,5386,5515,5516,5518,5903,6032,6034,5907,5780,5517,5648,5522,5653,5910,5654,5398,5400,5016,5144,5017,5146,5147,5148,5150,5406,5279,5281,5283,5410,6052,6053,6054,6055,6187,6185,6314,6317,6447,6576,6577,6578,6707,6579,6708,6580,6453,6326,6327,6328,6329,6331,6332,6333,6334,6335,6336,6209,6339,6340,6597,6342,6343,6089,6345,6219,6092,6222,6221,6479,6608,6480,6737,6738,6610,6611,6483,6612,6613,6486,6359,6360,6233,6106,5851,6107,5853,5473,5471,5476,5477,5349,5479,5352,5610,5483,5226,5988,5486,5485,5356,5101,5360,5489,5872,5874,5747,5748,5621,5622,5623,5624,5625,5626,5627,5499,5500,5501,5502,5503,5504,5506,5507,5508,5380,5510,5511,5512,5513,5514,5772,5901,5902,6031,6033,6162,6035,5646,5645,5520,5521,5781,6038,5783,5399,5272,5529,5145,5274,5275,5276,5278,5535,5280,5408,5409,5413,5285,6181,6182,6312,6313,6315,6184,6445,6575,6705,6706,6448,6834,6451,6835,6452,6836,6581,6325,6457,6456,6458,6459,6460,6461,6462,6591,6463,6467,6595,6468,6596,6470,6471,6215,6344,6473,6220,6606,6607,6735,6863,6736,6865,6866,6739,5462,5077,6740,6867,6868,6615,6487,6232,6234,6361,6235,6108,5602,5603,5604,5605,5606,5607,5858,5857,6118,5481,5484,5998,5355,5354,5614,5488,5746,5873,6002,5875,5876,5749,5750,5751,5752,5753,5754,5755,5756,5628,5629,5630,5631,5633,5505,5636,5634,5637,5509,5639,5640,5770,5771,5900,6029,6030,6160,6161,6163,6164,5908,5644,5904,5650,6165,5778,6166,5656,5657,5401,5273,5403,5792,5532,5405,5534,5407,5537,5411,5541,5669,6180,6311,6443,6189,6444,6446,6574,6703,6704,6320,6833,6319,6963,6709,6964,6837,6965,6454,6585,6714,5177,6587,6586,6588,6589,6590,6592,6594,5441,6469,6341,6725,6600,6472,6601,6734,6733,6478,6350,6991,6226,5843,5715,6864,5459,5461,5078,5207,5209,6485,6742,6741,6614,6490,6488,6362,6236,5981,5730,5601,5733,5734,5736,5480,5865,5738,5609,6117,5612,5613,5870,5615,5744,6001,6000,6129,6003,6004,5877,5878,5879,5880,5881,5882,5883,5884,5885,5757,5758,5759,5632,5761,5764,5635,5765,5766,5638,5768,5769,5899,6028,6158,6159,6289,6290,6291,6292,5906,5775,6037,5909,6295,6294,5911,5784,5402,5785,5530,5531,5404,5533,5791,5662,5663,5536,5538,5412,5414,6310,6442,5415,6572,6573,5288,6318,6702,6832,6962,5549,5423,5297,6065,6193,6710,6838,6582,6839,6455,5565,5311,5440,6717,6718,6719,6593,6466,6338,6211,5571,6727,6599,6728,6346,6348,5445,5324,5195,5196,5971,5587,5588,5460,5718,5719,5590,5079,5208,5976,5467,5338,5598,6743,6616,6491,6363,5852,6109,5729,5859,5989,5735,5608,5737,5986,5987,6116,5482,5740,5742,5743,5999,6128,6257,6131,6259,6132,6133,6005,6006,6007,6008,6009,6010,6011,6012,6013,5886,5887,5760,5890,5762,5763,5893,5894,5767,5896,5897,5898,6157,6286,6288,6417,6418,6419,6293,6036,5774,5905,5649,6549,5912,5655,5913,6046,5658,5786,5660,5659,5661,5788,5790,6051,5664,5665,5796,5924,6440,6183,5668,5287,5161,5162,6567,6695,6697,5550,5677,5551,5424,5552,5425,6192,5680,5561,6712,5178,5439,6584,6713,6716,6715,6720,6721,6722,6724,5570,6598,6855,6856,6729,6730,6862,5446,5449,5322,5323,5844,5716,5717,5589,4563,5846,5847,6875,6876,6749,5339,5340,5468,5469,5726,6617,6489,5982,6110,5731,6111,5860,5732,5993,5864,5866,6115,5867,5739,5741,5871,6127,6384,6256,6385,6513,6387,6260,6388,6261,6134,6135,6136,6137,6138,6139,6140,6141,6014,6015,5888,5889,5891,5892,6021,6022,5895,6025,6026,6027,6156,6287,6416,6545,6546,6420,6421,6548,5776,5777,6296,6550,6423,6040,6039,6172,6044,5914,5787,6045,5789,6179,6050,5922,5793,5794,5923,6441,5540,6435,6563,6820,6564,6565,5805,6566,6568,6698,5678,6827,5679,6956,5806,5807,5808,5306,5307,5564,5820,5568,5696,6464,6847,6846,6848,6723,5826,5954,6726,6854,5955,5700,5831,6861,5576,5451,5577,5450,5973,5845,5974,7126,7127,6874,7001,6748,6877,6878,6750,6751,6622,6623,5856,6744,5984,6364,6241,6112,5983,5990,6119,5863,6249,6122,6246,6245,6375,6376,6126,6255,7022,6512,6640,6386,6641,6514,6515,6389,6262,6263,6264,6265,6266,6267,6268,6269,6142,6143,6016,6017,6018,6019,6020,6150,6023,6024,6154,6155,6285,6415,6544,6672,6673,6674,6547,6675,6676,6677,6552,6806,6422,6167,6171,6041,6042,6043,5915,5916,5917,6178,6049,5920,5921,5667,6309,5795,6689,6690,6562,6692,6821,6950,6951,6694,6696,6825,6826,6955,7085,6957,5934,5935,6063,5434,5435,5563,5693,5697,6841,5569,6842,6975,6976,6849,6852,6082,6853,6857,5827,5698,5573,5574,5575,5704,5578,5705,6101,5972,7253,6102,7000,6873,7129,7003,7004,7005,6879,7007,5848,6752,6753,5727,6618,6242,6237,6493,6240,6372,5861,5862,5992,6247,6244,6503,6250,5995,6893,5997,6125,7021,6258,6130,6642,6769,6643,6516,6390,6391,6392,6393,6394,6395,6396,6397,6270,6271,6144,6145,6146,6147,6148,6149,6151,6152,6153,6284,6414,6543,6410,6542,6541,5642,5773,6801,6803,6802,6424,6932,6678,6934,6807,6299,6683,6170,6174,6173,6175,6429,6176,6048,6047,6308,6433,6561,6817,6819,6948,7076,6949,6693,6822,6823,6824,6952,7083,6954,7342,6828,7214,7086,7215,7344,5562,5690,5819,6969,6465,6970,6843,7102,7105,6977,7106,6981,6980,6984,6210,5699,5572,5703,5961,5706,5833,6228,6100,6229,7125,6999,7255,7256,7130,7131,7257,7132,7133,6880,7135,6881,6882,6754,5985,6113,6365,6369,6238,6373,6501,5991,6248,6374,6755,5994,6884,6377,6763,6124,5996,5868,5869,6383,6896,6897,6771,6644,6517,6518,6519,6520,6521,6522,6523,6524,6398,6399,6273,6274,6275,6276,6277,6278,6279,6280,6281,6283,6413,6411,6671,6538,5641,5643,6539,7057,6929,6928,6930,6680,6931,6551,6168,6297,6169,6428,6301,6684,6556,6302,6303,6431,6306,6307,6434,6946,6945,6818,7461,6691,7077,7078,7080,7081,6569,7466,6953,5933,7084,7213,6062,7216,5936,6064,5818,5691,5692,6337,7229,7228,7103,7104,6978,6979,7233,7107,7112,6985,6083,6084,6085,5832,6475,6732,6604,6227,6356,6099,6998,6230,7383,6872,6103,5975,6747,7006,7134,7262,7008,7009,7010,7136,6883,6243,6492,6370,6367,6371,6500,6631,6120,6121,6885,6632,6123,6505,6251,6252,6253,6380,6254,6382,7024,7025,6899,6772,6645,6646,6647,6648,6649,6650,6651,6525,6526,6527,6272,6402,6403,6404,6405,6406,6407,6408,6409,6282,6412,6670,6800,7434,6667,6540,7058,7190,7186,7060,6804,6808,7061,7189,6425,6298,6811,6427,6300,7452,7451,6430,6304,6177,6305,6688,7203,6816,7459,7460,6947,7205,6437,7079,6830,6960,6061,6570,6190,7082,6699,6191,6829,6958,7345,6840,6583,6968,6967,7096,7227,7094,7099,7101,7232,6851,6982,6983,7113,7235,6858,6859,6602,6474,6347,6476,6477,6349,6605,7378,6355,6357,6990,6992,6995,6993,6994,6869,6231,7261,7263,7391,7264,7137,7138,6114,6497,6495,6366,6368,6239,6888,6889,6502,7270,7013,6504,6892,6635,6378,6379,6381,6511,6895,7023,7150,6898,6900,6773,6774,6775,6776,6777,6778,6652,6653,6654,6655,6400,6401,6531,6532,6533,6534,6535,6536,6537,6668,6669,6798,6799,6794,6926,6927,7185,7063,7062,7187,7315,7059,7188,6805,6553,6681,6682,6554,6426,6555,6812,6557,6432,6558,6815,7072,6560,7331,7074,6436,7075,6701,6831,7090,6961,7089,7218,6959,7092,6700,7088,7212,7600,7087,7217,7480,6711,7358,7485,7095,6966,7097,7098,7100,6845,6850,7109,7239,7238,7234,6986,7117,6987,6731,7115,7116,6860,6988,7251,7509,7510,7511,7384,6484,6871,6997,6358,6870,6745,6619,6746,6621,6624,7392,7011,6626,6625,6494,6498,6759,6630,6760,7656,7658,7012,7269,6634,7141,6507,6508,6510,6764,6770,6768,6894,7151,7281,7028,6901,6902,6903,6904,6905,6779,6780,6781,6782,6783,6528,6529,6530,6660,6661,6662,6663,6664,6665,6796,6797,7055,6666,7178,7183,7313,7571,7446,7445,7318,7191,7314,7317,6679,6943,6941,6809,6810,7580,7324,6685,7584,6813,6559,6944,6942,6687,7073,7202,6439,6571,6438,7209,7208,7462,7464,7336,7465,7594,7467,7468,7340,7599,7341,7343,7602,7474,7487,7488,7230,7093,7223,7222,6844,6972,7108,7111,7240,7241,7114,7365,7243,7494,7621,6603,7506,7379,7252,7508,7382,7254,7767,7128,7002,7770,7643,7642,7644,7518,7390,7260,7259,7389,6620,6627,7265,7267,6496,6499,6629,6628,7145,7657,7659,7139,7399,7140,6633,6506,6636,6509,6638,6639,7149,6766,7152,7280,7282,7029,7030,7031,7032,6906,6907,6908,6909,6910,6911,6656,6657,6658,6659,6789,6790,6791,6792,6923,6925,7054,6793,6795,7306,7056,7435,7699,7573,7700,7319,7064,6936,6935,6933,7070,6937,6938,7065,6939,7194,7067,7708,6940,7585,6686,6814,7328,7200,7329,7210,7206,7717,7204,7207,7463,7720,7592,7721,7722,7211,7595,7597,7469,7598,7471,7472,7729,7601,7473,7359,7221,7225,7226,6971,6973,7236,7110,7368,7361,7242,7372,7362,7618,7747,7889,7507,7761,7380,7381,7634,7638,7119,7895,7896,7120,7385,7771,7645,7646,7774,7519,7520,7516,7522,7523,7394,7266,6757,6758,6887,7655,7017,7785,7786,7268,7142,6762,6761,6890,6891,6637,6765,6767,7027,7791,7154,7153,7410,7283,7158,7159,7033,7034,7035,7036,7037,7038,7039,6784,6785,6786,6787,6788,6918,6919,6920,6921,6924,7053,6922,7051,7433,7184,7563,7562,7574,7447,7828,7449,7448,7572,7316,7071,7192,7323,7066,7193,7837,7195,7712,7713,7069,7456,7457,7455,7842,7201,7845,7332,7333,7718,7847,7591,7719,7337,7849,7850,7723,7724,7596,7346,7470,7984,7986,7730,7857,7858,7489,7224,7351,7350,7356,6974,7231,7237,7367,7497,7245,7364,7490,7620,7366,8017,7890,6989,8146,7247,7246,7118,7768,8024,7897,8025,7898,7899,7258,7772,8030,7775,7647,7776,7648,7650,7395,6756,7014,7907,8039,7527,7016,7787,7788,7271,7143,7015,7018,7019,7276,7403,7020,7277,7026,7534,7157,7407,7409,7411,7285,7160,7161,7162,7163,7164,7165,7166,7167,6912,6913,6914,6915,6916,6917,7047,7048,7049,7052,7311,7050,7182,7561,7441,7691,7690,7575,7829,7956,7957,7450,7958,7443,7199,7320,7321,7964,7322,7709,7068,7840,7966,8094,7969,7583,7327,7330,7716,7714,7846,7588,7589,7590,7091,7976,7848,7977,7978,7851,7852,7725,7856,8112,8113,7728,7985,7486,7616,7614,7352,7353,7354,7483,7355,7357,7624,7496,7625,7370,7498,7363,7244,7875,7499,8018,8145,8274,8147,7766,7637,7639,7640,7769,7124,7641,7514,7900,7901,8029,7902,8031,7903,7904,7906,7524,7651,7652,6886,7784,7528,7529,7912,7913,7398,7144,7146,7147,7275,7274,7404,7148,7405,7278,7662,7156,7284,7537,7412,7286,7287,7288,7289,7290,7291,7292,7293,7294,7040,7041,7042,7043,7044,7045,7046,7176,7177,7180,7309,7179,7181,7689,7312,7819,7818,7701,7576,7577,8085,7705,7579,7444,7198,8088,8089,8091,8092,7196,7965,7581,7197,7841,8095,7970,8098,7715,8101,7587,7975,7974,7334,8103,7338,7335,7593,7339,7980,7855,7726,7983,7727,8243,8372,8242,8114,7615,7744,7617,7871,7612,7482,7611,7739,7741,7360,7751,7495,7369,7491,7493,7619,8400,7622,7371,8144,8016,8272,7762,7635,7765,7894,7123,7512,7513,7386,7515,7893,7517,7773,8028,8157,8158,7649,7393,7778,7526,7780,7783,7272,7911,7914,7916,7396,7273,7401,7789,7530,7790,7661,7532,8175,7279,7919,7155,7408,7538,7413,7414,7415,7416,7417,7418,7419,7420,7421,7295,7168,7169,7170,7171,7172,7173,7174,7175,7305,7308,7438,7310,7307,7817,7442,7947,7946,7830,7704,7959,7578,8086,7836,8215,7454,8087,8217,8090,8219,8348,7325,8350,8096,7838,7971,8099,8100,7844,7458,7972,8232,8233,8363,7854,7475,8107,8104,8237,7979,8110,7853,8368,8111,8369,8370,8500,8371,7481,7743,7742,7872,7999,7610,7738,7998,8129,8000,7752,7753,7626,7492,7874,7746,7877,8528,8527,8273,8401,8529,8402,8019,8148,8530,8405,7248,7121,6996,7249,7636,8279,8280,7387,7388,8032,8160,7521,8159,7905,7525,8166,8167,8293,8168,8041,7397,7400,7402,7917,8172,8173,8046,8303,7533,7406,8047,7920,7536,7539,7540,7541,7542,7544,7545,7546,7547,7548,7422,7423,7296,7297,7298,7299,7300,7301,7302,7303,7304,7436,7437,7439,7440,7569,7570,8075,8074,7703,7960,7706,7707,7835,8214,8344,7582,8213,8345,8093,8220,8218,8349,7453,7710,7326,7586,8097,8228,7968,7973,7843,8230,8108,7981,8109,7347,7219,7982,7220,8115,7987,8496,8497,8239,8241,8240,8499,8374,7608,7484,7613,7736,7737,7869,7740,8257,8128,8001,7879,7745,7881,7754,7748,8003,7876,7627,8526,8655,8656,8275,8403,8276,8404,7633,7250,8022,7505,7122,7377,7764,8151,8412,8286,8287,8161,8288,8285,7777,7653,7908,8292,8294,8040,7915,8042,7654,7531,8426,8301,7660,7918,8174,8430,8560,7535,8432,7792,7665,7667,7668,7669,7543,7672,7673,7674,7675,7549,7550,7551,7424,7425,7426,7427,7428,7429,7430,7431,7432,7564,7565,7567,7568,7945,7697,8331,8202,7702,7833,7834,7962,7963,8471,8343,7839,8342,8216,8346,8347,8476,8477,8478,8479,7967,7711,8227,8225,8360,8226,8359,8235,8231,8102,8365,8367,8234,7603,8623,8624,8238,8752,8626,8625,8501,8373,8498,8247,7479,7609,7870,7478,7865,7995,7867,8256,8258,8132,7880,7873,7623,7750,8004,7749,7878,7373,8654,8399,8397,8398,8657,8784,8785,8023,8153,8154,8026,8027,8281,8155,8156,8284,8414,8415,8033,8416,8290,8418,8035,8165,7779,8038,8424,8043,8044,8553,7910,8299,8429,8428,8427,8302,8431,8559,7663,8433,7664,7666,7795,7796,7670,7671,7800,7801,7802,7676,7677,7678,7679,7552,7553,7554,7555,7556,7557,7558,7559,7560,7692,7693,7566,7696,8073,7953,8458,8330,7831,7832,7961,8852,8725,8212,8598,8599,8470,8472,8474,8221,8475,8604,8606,8607,8480,8865,8609,8610,8740,8741,8361,8229,8236,8366,8492,8493,8751,8106,8105,8753,8879,8880,8627,8502,8757,8119,8376,7349,8504,8120,8121,7864,7866,7868,8383,8386,8259,8260,8007,8009,8131,8005,7882,8006,7883,8525,7374,7500,8781,8782,8783,8658,8786,8531,8787,8152,8282,8532,8283,8411,8021,8150,8413,8541,8409,8162,8542,8034,8804,8419,8545,8550,8169,8297,8170,8808,7781,7782,8556,8554,8555,8300,8687,8558,8048,8688,7793,7794,7923,7797,7798,7799,7928,7929,7803,7804,7805,7806,7807,7680,7681,7682,7683,7684,7685,7686,7687,7688,7820,7821,7694,7695,7825,8459,8203,8586,8979,8851,8724,8597,7827,7698,8084,8726,8600,8473,8601,8602,8731,8605,8734,8481,8608,8866,8737,8738,8742,8358,8997,8871,8362,8364,8878,8494,8622,8495,8750,7859,8628,8629,8246,8885,8630,7348,7477,7607,7606,8249,7735,7994,7996,7997,8511,8385,8127,8261,8008,8137,8002,8133,8010,8139,8011,7755,7628,7501,7502,8910,8653,8659,7760,7375,7376,7504,7631,8788,8406,8277,8410,8278,8408,8537,8540,8417,8289,8930,8543,8163,8544,8546,8295,8425,8171,8036,7909,8557,8685,8810,8683,8684,8045,8686,8176,8561,7921,7922,7924,7925,7926,7927,8056,7930,7931,7932,7933,7934,7935,7808,7809,7810,7811,7812,7813,7814,7815,7816,7948,7949,7822,7823,7824,8715,8339,9106,8978,8723,8211,8340,8081,7826,7954,8854,8729,8730,8728,8603,8733,8732,8863,8351,8736,8864,8867,9122,8996,8869,8490,8489,8747,8619,8875,9005,8749,8621,8754,8244,7731,8884,7604,7476,7733,7605,7991,7863,7734,7992,7993,8124,8125,8255,8512,8514,8516,8130,8262,8136,8135,8138,8134,8521,8651,8652,8012,7756,7629,7630,7888,8911,7503,7632,7891,7759,7763,7892,8149,8533,8535,8407,8536,8927,8928,8539,8800,8931,8803,8670,8677,8806,8679,8807,8298,8037,8164,8812,8811,8937,8682,8943,9071,8304,8816,8177,8049,8050,8052,8053,8054,8055,8057,8058,8059,8060,8061,8062,8063,7936,7937,7938,7939,7940,7941,7942,7943,7944,8072,8077,7950,7951,7952,8714,8722,9233,9105,8850,8596,8083,7955,8082,8469,8853,8984,8857,8856,8859,8862,8861,8735,8993,8224,8868,9123,8995,8994,9125,8998,9126,8999,8491,8876,8748,8877,8881,7988,9008,8756,7732,7860,8503,8118,8758,7861,7862,8250,8122,8123,8252,8253,8126,8384,8515,8388,8389,8390,8265,8266,8264,8394,8522,8779,8909,8780,7757,7884,7885,8140,7758,8142,8660,8916,7887,8020,8661,8918,8534,9046,9179,9054,8538,9055,9183,8929,8668,9313,8932,8805,8549,8551,8552,8680,8291,8938,8940,9065,9068,9198,8942,9199,8689,8815,8178,8179,8051,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,8064,8065,8066,8067,8068,8069,8070,8071,8199,8200,8076,8078,8079,8080,8843,8587,9234,8977,8595,8467,8209,8468,8210,8341,8981,8855,9113,8858,8860,8991,8992,8989,8990,8739,8611,8356,9251,8870,9000,9254,9127,9129,9132,9003,9133,9004,9006,9010,9138,8883,8245,8886,8117,7989,7990,8375,8248,8377,8379,8251,8380,8382,8254,8513,8642,8387,8517,8518,8391,8263,8392,8393,8650,8778,8906,8267,8268,8141,8013,8269,8524,8014,7886,8015,8917,8789,9175,9176,8790,9180,9178,9181,9182,8664,8666,8795,9056,8802,8676,8934,8678,8420,9063,8296,8681,8939,8813,9067,8941,9197,9325,9327,8944,9200,8306,8307,8180,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8192,8193,8194,8195,8196,8197,8198,8326,8328,8201,8332,8205,8206,8204,8208,9232,9361,8976,8849,8337,8338,8594,8466,8983,8980,8727,8985,9116,9114,8988,9118,9121,8223,8352,8482,8357,9124,9381,9001,9252,9383,9256,9128,9131,9260,9009,9136,8620,8882,8116,9013,9014,8631,8887,9143,9015,8505,8378,8507,8637,8509,8381,8510,8770,8771,8644,8643,8645,8519,8648,8520,8649,8905,8523,8395,9036,9164,8396,8908,9168,8270,8271,9169,8143,9298,9047,8662,9304,9305,9308,9048,9053,8663,9184,8794,8667,8796,9059,8801,9314,9317,8672,8809,8421,9064,9066,9193,9195,8814,9196,9326,9328,9072,8305,8434,8435,8308,8437,8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8320,8321,8322,8323,8324,8325,8453,8327,8455,8329,8457,8333,8334,8207,8335,9359,9360,9363,8336,8464,8465,8593,9242,8982,9108,9110,9243,9117,9119,9115,9247,8222,9248,9249,8355,9380,8483,8488,9255,9253,9382,9384,9385,9259,9389,9137,9264,9518,9265,9267,9268,9395,8759,8632,9016,8633,8634,8506,8889,8636,9148,8508,8639,8640,8641,8772,9410,8646,8775,8647,9413,9034,8907,9416,9288,9291,9163,9035,9292,9296,9040,9297,9425,9427,9426,8791,9303,9433,9306,9309,9307,9310,8792,8665,9311,9051,8669,8797,9312,9315,9062,8547,8936,8422,9319,9191,9192,9194,9069,9070,9455,9454,9457,8690,8562,8563,8436,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8448,8449,8450,8451,8452,8580,8454,8582,8456,8584,8585,8461,8462,8460,8463,9487,9489,9104,8720,8592,8721,9622,9112,9235,9366,9239,9111,9245,8986,9244,8987,9376,9377,9378,8354,8485,8487,8872,9510,8618,9002,9511,9130,9386,9516,9390,9266,9392,9521,9522,9649,9523,9396,8888,8755,8762,8761,8635,8764,9021,8765,8638,8768,9406,8769,8899,8773,9411,8774,8904,8777,9287,9289,9415,9418,9419,9038,9293,9551,9680,9552,9424,9681,9553,9554,9555,9556,9686,9177,9434,9435,9436,9049,8793,9438,9439,9052,8798,9187,8673,8933,8674,8935,8423,9448,9316,9322,9321,9324,9451,9456,9584,9713,8817,8691,8692,8564,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8576,8577,8578,8579,8707,8581,8709,8583,8711,8712,8713,8588,8589,8590,8591,9231,9616,9364,8847,8848,9621,9371,9241,9107,9365,9109,9240,9501,9369,9120,9504,9632,9379,8353,9507,8484,8615,8743,9638,9639,9258,9641,9642,9517,9515,9391,9520,9519,9648,9776,9777,9650,9271,9142,9398,8760,8890,8763,9017,9149,8894,8895,8767,9535,8898,9151,8900,9537,8902,8903,9032,8776,9540,9414,9542,9417,9674,8912,9037,9421,9423,9808,9809,9810,9682,9683,9684,9687,9814,9561,8919,9437,9050,9565,8922,8923,8925,8926,9058,9441,9189,8675,9318,8548,9453,9574,9576,9323,9450,9583,9329,9585,9201,8946,8818,8819,8820,8821,8822,8823,8824,8825,8826,8827,8828,8829,8830,8831,8704,8705,8706,8835,8708,8836,8710,8838,8839,8840,8841,8842,8718,8717,8716,8719,9615,9488,9493,9749,9623,9625,9495,9362,9236,9367,9372,9373,9246,9375,9250,9505,9506,9633,8612,8613,8614,8616,8745,8617,9643,9768,9640,9512,9646,9774,9647,9775,9905,9778,9269,9270,9401,9530,9402,9524,9531,9532,9276,9277,8891,8766,9405,8897,9152,9026,9028,8901,9029,9538,9412,9033,9290,9541,9543,9544,9545,9673,9803,9039,9041,9422,9936,9937,9938,9939,9812,9685,9688,9816,9562,8920,9691,8921,9563,8924,8671,8799,9057,9185,9190,9060,9579,9580,9452,9443,9575,9320,9449,9711,9712,9714,9073,8945,8947,8948,8949,8950,9079,8951,8952,8953,8954,8955,8956,8957,8958,8959,8832,8833,8834,8962,8963,8837,8965,8967,8968,8969,8970,8972,8845,8846,8844,8975,9743,9617,9746,9494,9624,9753,9370,9490,9237,9238,9496,9374,9498,9760,9631,9761,9508,9635,9637,9636,8486,8744,9257,9898,9771,9644,9901,9772,9900,9903,9904,10032,10033,9140,9012,9657,9529,9399,9400,9274,9403,9533,9144,9020,8892,8893,8896,9024,9791,9665,9027,9157,9666,9030,9159,9031,9162,9669,9670,9800,9420,9547,9546,9675,8915,9166,9557,10065,10193,10066,9811,9940,9813,9942,9815,9819,9945,9946,9567,9693,9442,9564,9186,9188,9444,9061,9706,9581,9578,9702,9703,9577,9836,9838,9840,9843,9202,9074,9075,9076,9077,9078,9207,9208,9080,9081,9082,9083,9084,9085,9086,9087,8960,8961,9089,9090,8964,9092,8966,9095,9096,9097,9098,8971,8973,8974,9101,9103,9998,9745,9618,9492,9879,9754,9628,9491,9619,9497,9368,9500,9503,9759,10143,9762,9763,9634,9764,9765,9894,8873,9769,8874,8746,9773,9899,10028,10031,10159,10030,10160,9139,9011,9528,9656,9141,9651,9397,9273,9275,9404,9146,9145,9018,9150,9023,9025,9154,9409,9155,9156,9284,9158,9160,9161,10571,10444,9798,9679,10064,10192,9807,9165,8913,8914,9045,9170,10322,10194,10067,10068,10070,9941,9943,9944,9947,10074,9440,9820,9692,9950,10081,9696,9832,9446,9834,9708,9445,9447,10088,9704,9839,9837,9966,9842,9330,9331,9203,9204,9205,9206,9335,9336,9337,9209,9210,9211,9212,9213,9214,9215,9088,9216,9217,9091,9219,9093,9094,9222,9224,9225,9226,9099,9100,9102,9228,9229,9997,9870,10258,9744,9748,9626,9755,9747,9620,10391,10264,9499,9502,9887,10016,9888,10144,9892,9509,10022,9896,9897,9770,10025,9645,9902,10029,10155,10026,10156,10158,9394,9007,9655,10170,9527,10161,10162,10034,9906,9788,9272,9147,10552,9019,9022,9153,9279,9280,9922,9282,9283,9285,9286,10570,9925,10572,10445,10446,10319,10573,10574,10320,9294,9676,9804,9042,9173,9174,10323,10321,10195,10196,10069,10071,10072,10201,9568,10075,9821,9822,9949,10209,10082,9831,9833,9707,9835,9572,9573,9582,9961,9967,9963,10096,9715,9458,9459,9460,9332,9333,9334,9463,9464,9465,9466,9338,9339,9340,9341,9342,9343,9344,9345,9218,9347,9220,9221,9350,9223,9351,9352,9353,9227,9355,9356,9230,9358,9614,10126,9742,10256,10257,10132,10260,10261,10262,10263,10392,10137,10014,10142,10271,9889,10017,10145,10020,9891,10023,10660,10153,10027,10157,10286,10415,10154,10287,10288,9393,9263,9654,10169,9783,9525,10290,10419,10420,10291,10292,10421,10422,10550,10551,10680,10681,9278,9281,9920,9794,9795,10697,10698,10826,10569,10443,10318,10699,10700,10701,10702,10703,10448,9295,9167,10186,9043,9044,9428,10325,10451,10324,10197,10199,10198,10073,9695,10202,10076,9569,10080,10208,10210,9959,10472,10473,9571,9830,9709,9710,9841,10089,10095,9970,9965,9586,9587,9588,9589,9461,9462,9591,9592,9593,9594,9595,9467,9468,9469,9470,9471,9472,9473,9346,9475,9348,9349,9477,9478,9479,9480,9354,9482,9483,9357,9485,9486,9876,10125,10384,10129,10130,10131,10389,10133,10390,9627,10521,10136,10265,10394,10015,10272,10273,10146,9893,10659,10024,10661,10662,10664,10538,10414,10543,9767,10285,9514,9261,9135,9910,10297,9526,10289,10418,10676,10548,10677,10549,10678,10679,10553,10808,10809,10938,9407,9408,9792,10049,9924,10825,10696,9667,9668,9797,10827,10828,10829,10830,10575,10704,10705,9550,9549,9677,10060,9172,9302,9817,10328,10708,10326,10840,10841,10200,9566,10203,9823,10335,10077,10336,9954,10345,10601,10474,9828,9701,9705,10476,9968,10218,10097,10225,9964,10094,9971,9716,9717,9718,9590,9719,9720,9721,9722,9723,9724,9596,9597,9598,9599,9600,9601,9474,9603,9476,9604,9605,9606,9607,9481,9609,9611,9484,9612,9613,9875,9750,9877,10513,10385,10387,10643,10259,10134,10519,9629,10520,10393,10522,9758,10399,10018,10019,10274,10787,9766,10534,10663,10537,10536,10542,10670,10668,10541,9513,9387,9134,9782,10298,10040,9911,10417,10546,10675,10547,10805,10806,10807,10293,10810,9790,10682,9793,9921,9919,9536,10050,10824,9923,9796,9539,10180,10053,9926,9927,10447,10831,10576,10449,10450,10577,10579,9806,9932,9171,9299,9431,9432,9690,10327,10712,10713,10843,10844,10845,10463,9570,9700,10464,10337,10600,10729,10346,9960,10475,10603,10604,10605,10477,10098,9962,10092,10093,10099,9972,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9725,9726,9727,9728,9729,9602,9730,9731,9732,9733,9734,9608,9736,9610,9738,9739,9740,9741,9874,10005,9751,10640,10515,10386,10388,10644,10518,10649,9884,10135,9630,10266,10651,10523,9886,10400,10786,10915,10788,10535,10790,10789,10666,10669,10667,10796,10539,10540,9388,9781,10168,10296,9653,9652,10544,10416,10545,10163,10164,10935,10423,9917,9787,9789,9534,9662,10048,9663,9664,10051,10951,10052,10179,10181,10182,9672,9671,9799,9928,9802,9801,9548,9678,10578,10580,10452,9805,10188,9300,9430,9558,9560,10711,9818,10842,9951,9697,9698,9953,9699,10974,10975,10599,10344,10728,10602,9829,10730,10858,10732,10606,9969,10478,10090,10091,10222,10354,10100,10101,9973,9974,9975,9976,9977,9978,9979,9980,9981,9982,9854,9855,9856,9857,9858,9859,9860,9861,9862,9735,9863,9737,9865,9866,9867,9868,9872,9873,10004,9878,10006,10514,10642,10645,10517,10647,10773,9883,9752,10138,10778,10650,10524,10652,10785,9757,10147,9890,10916,10791,11047,10665,10795,10794,9895,10152,10282,9262,9909,10167,10039,9779,10035,10671,9912,9784,10171,10427,10426,10042,9785,9658,9659,9660,9661,9918,10046,10175,10176,10178,10306,10562,10309,10437,10439,10440,10310,10311,10312,10185,10832,10833,10706,10707,10835,9935,9429,9933,9301,9559,9689,10330,9694,9948,9824,9952,9826,9827,10973,10976,10852,10980,10982,10857,10856,9957,10347,10731,10859,10733,10734,10479,10219,10220,10223,10226,10227,10228,10229,10102,10103,10104,10105,10106,10107,10108,10109,10110,10111,9983,9984,9985,9986,9987,9988,9989,9990,9991,9864,9992,9993,9994,9995,9869,9871,10001,10003,10254,10383,10768,10516,10774,10646,10776,10011,9756,10777,9885,10139,10395,10780,10653,10913,10270,10914,11043,10918,10919,11175,11177,10923,10021,10151,10410,10283,9908,10038,9780,9907,10413,10799,10800,10672,10674,9913,10041,10300,10172,10043,9786,10299,9915,9916,10047,10177,10303,10304,10688,10433,10561,10817,10566,10438,10184,10183,10314,9929,9930,10191,9931,10190,10834,10709,10710,10063,9934,10061,10459,10331,10204,10205,10078,10972,9825,10465,10338,9955,9956,11108,10854,10981,10983,10855,10084,9958,11114,10987,10861,10860,10608,10349,10221,10224,10353,10355,10356,10357,10358,10230,10231,10232,10233,10234,10235,10236,10237,10238,10239,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,9996,10124,9999,10000,10002,10639,10767,10896,11154,11155,10775,10772,9882,10010,10648,10012,10013,10267,10779,11036,11041,10398,10401,11042,11046,11174,10917,10402,10275,10148,10149,10278,10281,10037,10166,10165,10924,10797,10801,10929,10802,10673,10803,10294,9914,10811,10295,10425,10555,10428,10174,10044,10301,10429,10943,10816,10689,10945,10820,10692,10436,10565,10056,10187,10058,10316,10317,10959,10961,10836,11090,10837,10839,10454,10582,10062,10460,10332,10334,10207,10079,10593,10339,10211,10083,10853,10470,10471,11109,10984,11110,10085,10086,10348,11115,10988,10607,10735,10736,10351,10352,10482,10483,10484,10485,10486,10487,10359,10360,10361,10362,10363,10364,10365,10366,10367,10240,10241,10242,10243,10244,10245,10246,10247,10248,10249,10377,10250,10251,10252,10253,10127,10128,10255,11024,11025,11026,11156,11158,10008,9881,11287,11163,11164,10141,10906,11035,10908,11168,11040,10527,10528,11172,11173,11176,10792,11050,10150,10277,10279,10280,10036,10284,10925,11053,10798,11185,10927,10928,10930,10804,10931,10939,10424,11196,11325,10045,10173,10556,10812,10685,10813,10814,10942,10944,10946,10308,10307,10956,10054,10055,10057,10315,10059,11088,10962,10960,11219,10838,11221,10967,10455,10329,10585,10586,10333,10462,10206,10594,10466,10467,10340,10851,10598,10726,10727,11104,10986,11112,10213,10087,10343,10989,11116,10862,10863,10350,10480,10481,10610,10611,10612,10613,10614,10615,10616,10488,10489,10490,10491,10492,10493,10494,10495,10368,10369,10370,10371,10372,10373,10374,10375,10376,10504,10505,10378,10379,10380,10381,10382,10510,10511,11153,11283,10897,10898,10007,9880,11286,11416,11417,11418,10140,10905,10396,11165,11169,10781,10654,10912,11170,11044,11302,11305,10533,10276,10406,10407,10409,10412,10922,11052,11181,11054,11055,11056,11057,11058,11059,11317,11448,11324,11450,11067,10554,10302,10557,10684,10430,10686,10687,10815,10818,10435,10564,11078,10950,10568,10693,10823,11087,11216,11217,11089,11218,10964,10453,11220,11349,10584,10456,10458,10587,10589,10461,10591,10721,10595,10468,10597,11103,10725,11236,11111,11233,10985,11240,11113,10215,10216,10217,11117,10990,11119,10864,10737,10609,10738,10739,10740,10741,10742,10743,10744,10745,10617,10618,10619,10620,10621,10622,10623,10496,10497,10498,10499,10500,10501,10502,10503,10631,10632,10633,10506,10507,10508,10509,10637,10638,10512,10895,10641,10770,10771,11027,11028,11157,10009,11159,11288,10269,11162,10907,11294,11166,10656,11039,11298,10784,10658,11304,11048,10532,10403,10404,10921,10411,10793,11051,11179,11180,11183,11184,10926,11186,11444,11187,10932,11068,11063,11449,11452,10683,11453,10940,10559,10431,10305,10432,10434,10690,10819,10691,11204,11205,10957,11338,10958,10442,11344,11345,11473,10963,11092,10965,11348,10583,10968,11223,10457,10716,10719,10590,10717,10849,10592,10722,10979,11107,10724,11237,11234,11365,11366,10212,10341,10342,11243,11244,11118,10991,10992,11120,10993,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10746,10747,10748,10749,10750,10751,10624,10625,10626,10627,10628,10629,10630,10758,10759,10760,10761,10634,10635,10636,10764,10765,10766,10894,11023,10769,10899,11285,10900,10901,11029,10902,10904,10268,10397,11161,11292,11293,11171,10782,10910,11297,11299,11045,11431,10657,10529,10530,10405,10920,11049,11435,11178,11308,11310,11182,11311,11440,11571,11572,11446,10933,11447,11576,11451,11580,11197,11454,10558,11582,11333,11587,11461,10560,10563,11459,11332,11211,11464,11595,10695,10567,11597,10441,11600,10189,11091,11475,11222,10966,11350,11096,11224,10714,10715,10588,10720,10847,10846,11105,10978,10723,11357,11239,11238,11364,11747,11367,10469,10214,11242,11371,11372,11245,11246,11247,11248,11121,11122,10994,10995,10996,10997,10998,10999,11000,11001,11002,11003,10875,10876,10877,10878,10879,10752,10753,10754,10755,10756,10757,10885,10886,10887,10888,10889,10762,10763,10891,10892,10893,11021,11022,11152,11281,11282,11284,11413,11414,11415,11545,10903,10525,10526,11160,11420,11422,11037,11038,11296,10911,11301,11303,11432,11427,11429,10531,11430,11433,11947,11434,11437,11436,11309,11568,11312,11570,11313,11443,11060,11061,11062,10934,10936,11581,11709,11711,11710,11838,11460,11583,11714,11715,11586,11717,11591,11465,11339,11596,11723,11724,11598,11472,11346,11474,11093,11603,11094,11477,10581,11095,10970,10969,10971,11101,10718,11231,11360,10977,11106,10850,10596,11363,11616,11745,11746,11368,11241,11498,11626,11499,11500,11373,11374,11375,11376,11249,11250,11251,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11004,11005,11006,11007,10880,10881,10882,10883,10884,11012,11013,11014,11015,11016,11017,10890,11018,11019,11020,11149,11150,11151,11280,11410,11411,11412,11541,11542,11543,11544,11030,11031,10655,11289,11291,11421,11682,11167,11553,11424,11426,11556,11558,11428,12072,10408,11818,11819,11948,11565,11307,11564,11438,11694,11695,11439,11441,11314,11699,11573,11445,11575,11835,11707,11708,11836,11966,11588,11334,11842,11843,11845,11718,11846,11210,10955,11212,11084,11469,11214,11599,11727,11601,11347,11602,11731,11476,11606,11478,11479,11481,11226,11097,11100,10848,11358,11232,11102,11362,11235,11492,11493,11494,11873,11872,11369,11370,11753,11754,11627,11628,11501,11502,11503,11504,11377,11378,11506,11379,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11133,11134,11135,11008,11009,11010,11011,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11276,11277,11278,11279,11408,11409,11539,11540,11670,11671,11673,11674,11672,11032,10783,11034,11419,11548,11681,11295,11423,11555,11425,11941,11814,12071,12073,12199,11562,12074,11949,11306,11563,11692,11566,11823,11567,11824,11569,11442,11188,11700,11574,10937,11834,11963,11964,11965,11837,11716,11589,11844,11462,11590,11337,11974,11973,12102,11975,12104,11725,12105,12109,12110,12111,11730,11985,11604,11732,11605,11733,11607,11480,11225,11483,11099,11230,11228,11359,11227,11361,11491,11620,11621,11622,11495,11878,11497,11752,11880,11881,11755,11756,11629,11630,11631,11632,11505,11633,11507,11508,11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11262,11263,11136,11137,11138,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11403,11404,11405,11406,11407,11536,11538,11667,11668,11669,11799,11800,11801,11675,11546,11033,10909,11547,11549,11680,11683,11300,11940,11554,11942,11943,12197,12326,12200,11945,12075,11946,12078,11951,11952,11693,11953,12082,12211,12212,12214,12088,12087,12089,12090,12091,12092,11326,11712,11840,11584,11839,11972,11971,11841,11713,11970,11458,11330,11331,10947,11203,10821,10694,12103,10822,12365,12368,12242,12114,12116,12117,11608,11736,11737,11612,11613,11229,11482,11486,11488,11484,11490,11749,11356,11744,12000,12002,11625,12006,12008,12009,11882,11883,11884,11757,11758,11759,11760,11761,11634,11635,11636,11509,11510,11511,11512,11513,11514,11515,11516,11517,11518,11519,11391,11264,11265,11393,11394,11395,11396,11397,11398,11399,11400,11401,11402,11531,11532,11533,11534,11662,11535,11537,11794,11795,11796,11797,11798,11928,11802,11803,11804,11290,11552,11676,11679,11678,11809,11684,12066,12068,11559,11944,11817,12325,12198,11820,12076,12204,12206,12335,12079,12337,12336,12465,12339,12341,12215,12345,12218,12219,11069,12221,11198,12093,12094,11967,11969,11968,12097,11071,11072,11456,11457,11585,11329,11202,11074,11075,10948,11076,11077,12232,10949,12496,10313,12370,12369,12373,12374,11610,12119,11739,11098,11740,11351,11353,11354,11617,11619,11743,11868,11877,11999,11624,11496,12007,12134,12136,12010,12011,12012,11885,11886,11887,11888,11889,11762,11763,11764,11637,11766,11638,11639,11640,11641,11642,11643,11644,11645,11646,11647,11392,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,11530,11659,11660,11661,11789,11663,11664,11665,11666,11923,11924,11926,11927,11929,11930,11932,11805,11806,11551,11550,11677,11810,11939,11811,12067,12196,12070,12069,11690,12455,12327,12331,12205,12459,12333,12460,12462,12464,12334,10941,12216,12340,12470,12084,12471,12472,11961,12095,11962,12346,11455,12224,11070,11327,11199,11200,11073,11328,11201,12098,11594,12100,12099,12108,12234,11086,12233,12366,11984,12364,12371,12500,12501,12372,12375,11609,12121,11738,11611,11735,11352,11355,11615,11487,11618,11748,12003,11870,11871,11623,11879,12131,12133,12135,12137,12138,12139,12013,12014,12015,12016,12017,11890,11891,11892,11893,11765,11895,11767,11768,11769,11770,11771,11772,11773,11774,11775,11648,11649,11650,11651,11652,11653,11654,11655,11656,11657,11785,11658,11786,11787,11788,11790,11791,11792,11793,11922,11925,12052,12054,12055,12056,11931,11933,11934,11807,12572,12064,11936,11937,11808,11685,11813,12324,11557,12454,11560,11561,12456,12457,12332,12587,12588,12201,12202,12203,12461,12342,12469,11696,12083,11189,11190,12473,12086,11064,12474,12475,11194,11323,12480,12222,12223,12352,11592,10952,11079,12101,11593,10953,10954,11981,11213,11085,12235,11215,11858,12492,12626,12627,12628,12499,12243,12245,12247,12122,12123,11734,11863,11866,11485,11489,11875,11876,11997,11998,12128,11751,12001,12130,12132,12263,12265,12266,12140,12141,12142,12143,12144,12145,12018,12019,12020,12021,12022,11894,12024,11896,11897,11898,11899,11900,11901,11902,11903,11776,11777,11778,11779,11780,11781,11782,11783,11784,11912,11913,11914,11915,11916,11917,11918,11919,11920,11921,12049,12051,12180,12053,12183,12057,12059,12061,12063,11935,12442,12573,12445,12446,12065,12322,11812,12323,12452,11815,11686,11691,12458,12328,11821,12463,12590,12330,12329,12589,12343,12217,11954,11315,11955,11316,11191,12085,11192,11065,11321,11322,11066,11195,11579,12609,12483,11207,11206,11080,11081,12354,11209,11082,11083,11468,11341,11342,11729,11343,11728,12363,12497,12498,12625,12113,12244,12246,12118,12502,11991,11862,11867,11995,11741,11742,11996,11869,12126,12382,12127,11750,12129,12259,12261,12262,12264,12394,12267,12268,12269,12270,12271,12272,12146,12147,12148,12149,12150,12151,12023,12152,12025,12026,12027,12028,12029,12030,12031,11904,11905,11906,11907,11908,11909,11910,11911,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12305,12050,12178,12309,12181,12182,12185,12058,12060,12062,12191,12570,12571,12444,12575,12576,12577,11938,12450,12582,12583,12453,11688,12585,12715,11950,12716,12080,12718,12717,12973,13103,12344,12213,11697,11698,11318,11319,11702,11320,11193,11577,11578,11705,11706,12478,12608,12482,11463,11335,11208,11336,12106,11466,11467,11340,11726,11470,11471,11856,11857,12362,12494,12493,12624,12495,12241,12115,11993,12248,12120,11992,11864,11865,11994,11614,12125,12380,11874,12004,12255,12256,12005,12257,12258,12260,12390,12392,12393,12395,12396,12397,12398,12399,12273,12274,12275,12276,12277,12278,12279,12280,12281,12153,12154,12155,12156,12157,12158,12159,12032,12033,12034,12035,12036,12037,12038,12166,12167,12168,12169,12170,12171,12172,12173,12174,12175,12176,12177,12434,12179,12308,12310,12311,12184,12186,12188,12190,12320,12441,12699,12443,12574,12447,12192,12194,12578,12708,12451,12711,11687,12586,12843,12591,12207,12208,12845,12720,12846,12847,12848,12468,11825,11827,11826,11701,11703,11830,11704,11960,11832,11833,12606,12607,12738,12611,11719,11720,11721,11850,11847,11722,11851,11852,11853,11855,11982,11983,12490,12361,12491,12623,12367,12112,11860,11988,11990,12503,12377,11861,12635,12506,12250,12253,12507,12254,12508,12381,12769,12901,12383,12384,12386,12388,12389,12391,12521,12523,12524,12525,12527,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12282,12283,12284,12285,12286,12287,12160,12161,12162,12163,12164,12165,12293,12294,12295,12296,12298,12299,12300,12301,12302,12431,12560,12304,12433,12306,12307,12436,12437,12438,12312,12313,12187,12189,12319,12569,12698,12829,12703,12705,12448,12193,12321,12707,12710,12712,12195,11816,12841,12971,11822,12592,12593,12849,12977,13104,13106,13107,13111,11956,11828,11829,11958,11831,11959,12733,12605,12734,12735,12610,12739,12612,12741,12742,11848,11849,11976,11978,11979,11980,12237,11854,12231,12359,12360,13134,12752,12622,11986,11859,11987,11989,12757,12376,12632,12762,12634,12379,12124,12252,12894,12898,12766,12767,12509,12903,12510,12385,12387,12516,12517,12519,12520,12522,12652,12526,12654,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539,12411,12412,12413,12414,12415,12288,12289,12290,12291,12292,12420,12421,12422,12423,12297,12425,12426,12427,12428,12429,12430,12303,12432,12561,12562,12435,12564,12565,12566,12439,12440,12314,12316,12318,12825,12697,12700,12957,13087,13088,12961,12449,12579,12709,12713,12580,11689,12842,12972,12077,12081,12594,12338,12210,12978,13105,13235,13108,12980,13239,11957,13110,12220,12604,12476,12479,12862,12736,12866,12867,12740,12613,12743,12870,12744,12355,11977,12107,12236,12228,12229,12230,13131,13132,12619,12751,12238,12239,12240,12884,12758,12883,12629,12889,12763,12633,12249,12251,12891,12896,12897,12764,12765,12636,12904,12511,12512,12514,12644,12518,12647,12649,12650,12651,12653,12655,12656,12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12540,12541,12542,12543,12416,12417,12418,12419,12547,12548,12549,12550,12424,12552,12553,12554,12555,12556,12557,12558,12559,12688,12689,12563,12691,12692,12693,12694,12567,12568,12696,12315,12317,12954,12826,12701,12956,12959,12704,13217,13218,12839,12840,12581,12584,13349,12844,13101,12719,12721,12209,12466,12595,12467,12979,13234,13236,13238,13109,13367,12982,13112,13240,13242,12477,12347,12737,12995,12351,12225,12226,12096,12353,12486,12356,12357,12358,12227,13382,13383,13259,13260,13133,12621,13006,12750,12885,13011,12886,12887,12882,12630,12759,12760,12505,12378,12892,13149,13025,12899,12900,13029,12902,13031,12638,12513,12515,12645,12646,12648,12777,12778,12779,12781,12782,12783,12784,12785,12787,12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12669,12670,12671,12544,12545,12546,12674,12675,12676,12677,12551,12679,12680,12681,12682,12683,12684,12685,12686,12687,12816,12690,12818,12819,12820,12821,12822,12695,12823,12824,12953,13083,13084,12955,12828,12836,12831,12706,13089,13090,12835,13092,13220,12969,13478,12714,13099,12976,12850,12722,12851,12852,12596,12597,12981,13365,13366,13494,13237,12599,13368,13241,12983,12348,12349,12864,12350,12481,12868,12996,12484,12614,12869,12615,12487,12746,12617,12489,13384,13130,13003,12620,12748,12878,13012,13013,13014,13015,13016,12753,12756,12761,12890,12631,12893,13150,13151,13026,13028,13156,13283,13158,13030,12639,12641,12643,12773,12775,12776,12907,12908,12780,12909,12910,12911,12912,12913,12786,12915,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926,12798,12799,12672,12673,12801,12802,12803,12804,12678,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12817,12945,12946,12947,12948,12949,12950,12951,12952,13081,13082,13212,13213,13085,12827,12702,12958,13216,12960,12833,13346,13091,13348,12970,13607,13482,13100,12975,13485,13612,13615,12723,12724,12853,12727,13363,13493,13364,12598,12600,12602,12731,12603,12984,13113,12987,13116,12865,12992,12993,13122,12485,12871,12872,12745,12616,12488,13512,12618,13129,13002,13004,12749,12877,13137,12879,13142,13141,13010,12754,13144,12888,12504,13019,13276,12895,13152,13027,13280,13284,13285,13159,12637,12640,12642,12772,12774,13033,12905,12906,13035,13036,13037,13038,13040,13041,13042,12914,13044,12916,13045,13046,13047,13048,13049,13050,13051,13052,13054,13055,12927,12800,12928,12929,12930,12931,12805,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942,12943,12944,13073,13074,13075,13076,13077,13078,13079,13080,13209,13210,13340,13214,13342,13211,12830,13086,12837,12834,12838,13347,13093,13477,13350,13355,13610,12974,13359,13611,13741,13742,13617,13745,12725,12726,12728,13492,12854,12856,12601,12859,12732,12861,12863,13114,13115,13245,13246,13119,13120,13251,13252,13893,12997,12998,12873,13126,12874,13256,13385,13258,13005,12876,13395,13523,13007,13270,13143,13271,12755,13273,13145,13020,13021,13277,13279,13024,13155,13282,13412,13157,13286,12768,12770,12771,13287,13160,13032,13162,13034,13163,13164,13165,13166,13039,13168,13169,13170,13043,13172,13173,13174,13175,13176,13177,13178,13179,13180,13053,13182,13183,13056,13057,13058,13059,12932,13060,13061,13062,13063,13064,13065,13066,13067,13068,13069,13070,13071,13072,13202,13203,13332,13204,13205,13206,13207,13208,13337,13339,13341,13215,13344,13469,12832,13472,12964,12965,13474,12967,12968,13476,13606,13098,13737,13102,13230,13613,13614,13869,13744,13872,13746,13874,13747,12729,12855,12857,12730,12858,12860,12990,12988,12986,13117,12994,13118,13123,13124,13121,13125,13765,12999,13000,13253,13255,13001,13257,12747,12875,13387,13393,13394,13396,13397,13526,13398,12880,13009,13528,13018,13017,13148,13404,13023,13153,13154,13408,13409,13537,13413,13410,13540,13414,13415,13288,13289,13161,13290,13291,13292,13293,13294,13167,13296,13297,13298,13171,13301,13302,13430,13304,13305,13433,13306,13307,13308,13181,13310,13311,13184,13185,13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201,13329,13330,13331,13461,13333,13334,13335,13336,13465,13338,13468,13343,13471,13596,13597,13598,13345,12963,12966,13219,13475,13604,13605,13736,13739,13738,13231,13233,13740,13743,13871,14000,14002,13875,14004,13878,14006,13879,14008,14012,12985,14142,12989,12991,13244,13758,13243,13247,13248,13249,13764,13636,13508,13380,13127,13254,13643,13386,13645,13516,13517,13647,13522,13524,13525,13269,13139,12881,13272,13529,13274,13275,13147,13278,13022,13534,13281,13405,13411,13535,13665,13538,13539,13541,13542,13543,13416,13417,13418,13420,13421,13422,13423,13295,13424,13425,13426,13299,13300,13429,13303,13432,13560,13434,13435,13436,13437,13309,13438,13439,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321,13322,13323,13324,13325,13326,13327,13328,13456,13457,13458,13459,13460,13462,13591,13463,13464,13594,13466,13467,13470,13599,13725,13724,12962,13600,13094,13601,13095,13097,13733,13734,13735,13484,13864,13229,13361,13997,13998,13870,13873,14001,14003,14132,14005,14134,13880,14007,14009,13752,13881,13625,13369,13370,13371,13372,13374,13375,13250,13378,13892,13379,13381,13640,13128,13641,13514,13771,13646,13388,13650,13651,13264,13136,13263,13008,13138,13655,13140,13146,13403,13659,13406,13407,13536,13664,13532,13792,13533,13793,13666,13667,13668,13669,13671,13544,13545,13546,13419,13549,13550,13551,13552,13553,13554,13555,13427,13428,13558,13431,13559,13561,13562,13563,13691,13564,13565,13566,13567,13440,13441,13442,13443,13444,13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13583,13584,13585,13586,13587,13588,13589,13590,13592,13721,13593,13723,13595,13727,13728,13726,13852,13980,13729,13473,13221,13602,13096,13351,13862,13227,13228,13863,13358,13232,13489,13868,13619,13999,14128,14130,14131,14259,14135,14136,14137,14139,14010,13623,13626,13497,13756,13627,13373,13502,13503,13376,13377,13511,13507,13638,13767,13897,13768,13513,13774,13515,13648,13777,13261,13652,13653,13265,13135,13268,13527,13401,13530,13531,13789,13662,13663,13791,13658,13794,13917,13919,13920,13923,13795,13796,13797,13670,13672,13673,13674,13547,13548,13678,13679,13680,13681,13682,13683,13684,13556,13557,13687,13688,13816,13689,13690,13692,13693,13821,13694,13695,13568,13569,13570,13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13710,13711,13712,13713,13714,13715,13716,13717,13718,13719,13720,13850,13722,13851,13854,13855,13857,13853,13979,13858,13732,13603,13223,13224,13353,13354,13226,13357,13865,13995,13360,13362,13490,14126,14127,14257,14129,14260,14262,14263,14264,14265,13622,14011,13495,13496,13883,13499,13628,13501,13505,13504,13506,13634,13510,13635,13509,13639,13637,13895,13770,13901,13903,14031,13778,13518,13262,13392,13266,13267,13780,13657,13400,13402,13788,13661,13790,13918,14047,13786,13787,13916,14045,14048,14049,14051,13924,13925,13798,13799,13800,13801,13675,13676,13677,13807,13808,13809,13810,13811,13812,13813,13685,13686,13815,13817,13945,13818,13819,13820,13949,13822,13823,13696,13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13837,13838,13839,13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13978,13981,13982,13856,13985,14240,14107,13988,13861,13730,13222,13352,13480,13481,13992,13356,13486,14251,13487,13488,13491,14125,14256,14385,14386,14258,14390,14391,14392,14140,13621,13751,13624,13882,13754,13498,13500,13629,13631,13632,13890,13762,14018,14019,14025,13896,14023,13769,13898,13642,13775,13644,13389,13390,13519,13781,13391,13654,13908,13399,13914,13915,14172,13660,14046,14175,13921,13922,14306,14304,14303,14176,14177,14050,14052,14053,13926,13927,13928,13802,13803,13804,13805,13806,13935,13937,13938,13939,13940,13941,13942,13814,13943,13944,14073,13946,13947,13948,14077,13950,13951,13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13964,13965,13966,13967,13968,13969,13970,13971,13972,13973,13974,13975,13976,13977,14108,14109,13983,13984,13986,13987,14368,14367,13860,13859,13731,13479,13225,13609,13483,13993,14250,14378,14124,13616,13618,13748,14255,13876,14387,14514,14389,14261,14266,14269,13750,13753,14650,14143,14144,13755,13757,13630,13761,13633,13760,13763,14147,13891,13766,13894,14028,13899,13900,13772,13902,13776,13905,13649,13779,13521,13520,13782,13911,14042,14043,14171,14173,14174,14686,14687,13656,14945,14816,14564,14305,14432,14433,14178,14179,14180,14054,14055,13929,13930,13931,13932,13933,13934,14064,13936,14065,14066,14067,14068,14069,14070,14071,14072,14201,14074,14075,14076,14205,14078,14079,13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,14091,14092,14093,14094,14095,14096,14097,14098,14099,14100,14101,14102,14103,14104,14105,14106,14236,14111,14112,14114,14115,14366,14493,14117,13990,13991,14499,13608,14118,14120,13866,13867,14123,14252,13996,14382,14254,14384,13620,14133,14388,14519,14393,14267,14268,14270,14013,14271,14778,14145,13884,14523,13759,13888,14146,13889,14532,14404,14276,14022,14283,14279,14024,14029,14026,13773,13904,14033,13906,14035,14545,14546,13907,14296,14425,14426,14427,14685,14815,14814,13912,13784,14944,14946,14692,14565,14688,14561,14434,14307,14308,14181,14056,14057,14058,14059,14060,14061,14062,14063,14192,14193,14194,14195,14196,14197,14198,14199,14200,14329,14202,14203,14204,14333,14206,14207,14080,14081,14082,14083,14084,14085,14086,14087,14088,14089,14090,14218,14219,14221,14222,14223,14224,14353,14225,14226,14227,14228,14229,14230,14231,14232,14233,14234,14237,14110,14241,14113,14243,14495,14494,14116,13989,14627,14626,14884,14246,14119,13994,14121,14122,14508,14380,14253,14511,14383,14515,14516,13749,14518,14138,14520,14397,14141,14395,14014,14522,14015,14016,13885,13886,13887,14275,14660,14021,14403,14533,14661,14153,14284,14156,14027,14030,14287,14416,14032,14034,14673,14802,14037,13909,14297,15191,14555,14556,15325,15198,14943,13783,13785,15327,14817,14693,14821,14566,14183,14562,14435,14436,14309,14182,14184,14186,14187,14188,14189,14190,14191,14320,14321,14450,14322,14323,14324,14325,14326,14327,14328,14330,14331,14332,14461,14334,14335,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14345,14346,14220,14348,14349,14350,14351,14352,14354,14355,14484,14485,14357,14358,14359,14360,14361,14235,14364,14238,14239,14370,14242,14624,14752,14244,14375,14249,14245,15012,14885,14247,14248,14635,14507,14765,14379,14509,14637,14510,14640,14512,13877,14517,14776,14394,14524,14396,14398,14399,14905,14272,14273,14402,14017,14651,14020,14148,14278,14150,14788,14789,14281,14280,14151,14152,14155,14544,14160,14161,14162,14674,14675,14036,14803,14424,15320,15321,15322,15326,15199,13910,14039,13913,14170,15201,15072,14694,14567,14312,14689,14690,14563,14437,14310,14185,14315,14316,14317,14446,14318,14319,14448,14449,14578,14579,14451,14452,14453,14454,14455,14456,14457,14458,14459,14460,14462,14463,14336,14337,14338,14339,14340,14341,14342,14343,14344,14473,14474,14347,14475,14476,14477,14478,14480,14481,14482,14483,14356,14613,14614,14615,14488,14489,14362,14363,14491,14492,14365,14369,14371,14623,14880,14753,14374,14376,14754,14630,15270,14886,14634,14892,15020,14894,14636,14381,14767,14638,14639,14645,14901,15029,14521,14904,14777,14652,14526,14527,14400,14528,14401,14779,14274,14531,14659,14277,14406,14917,14535,14409,14405,14407,14408,14282,14154,14157,14159,14288,14289,14931,14163,14164,15190,15192,15448,15323,15577,15324,15070,14038,14040,14041,14044,15328,15075,15074,14695,14696,14440,14439,14313,14311,14438,14314,14443,14444,14445,14574,14575,14447,14576,14577,14706,14707,14708,14580,14581,14582,14584,14585,14586,14587,14588,14589,14590,14591,14464,14465,14466,14467,14468,14469,14470,14471,14472,14600,14601,14602,14603,14605,14606,14479,14607,14608,14609,14610,14611,14612,14486,14487,14616,14617,14490,14618,14619,14620,14621,14497,14498,14879,15008,15137,14373,14377,14883,15011,15014,15142,15146,14764,14893,15022,14763,14513,14766,14896,14770,14643,14902,14646,15031,14649,14780,14525,14654,14655,14656,14907,14529,14785,14658,14530,14915,14534,14149,14663,14665,14537,14538,14410,14411,14412,14285,14286,14158,14415,14417,14930,14290,15061,15319,15447,15449,15450,15452,15453,14166,14167,14168,14169,14301,15329,15203,15076,14822,14823,14568,14569,14441,14570,14442,14571,14572,14701,14573,14702,14703,14704,14705,14833,14834,14835,14836,14709,14710,14583,14712,14713,14714,14715,14716,14717,14718,14719,14592,14593,14594,14595,14596,14597,14598,14726,14599,14728,14729,14731,14604,14733,14734,14735,14736,14737,14866,14738,14739,14740,14741,14742,14743,14744,14745,14746,14747,14748,14622,14496,14751,15009,15138,15010,14372,14504,14505,15140,15013,14506,15271,15274,15531,15150,15023,14641,14642,14768,14897,14900,14773,15030,15032,15158,14908,14653,14782,14783,15035,14657,15040,15168,14787,15042,14916,14790,15173,14920,15046,14666,14536,14918,14539,15180,14540,14413,14542,14414,15059,14418,14801,15444,15574,15575,15576,15578,15580,14165,14294,14295,14298,14300,14302,15330,15204,15202,15077,14949,14948,14818,14691,14698,14699,14828,14700,14829,14830,14958,14831,14832,14960,14961,14962,14963,14964,14837,14838,14711,14840,14841,14842,14843,14844,14845,14846,14847,14720,14721,14722,14723,14724,14725,14853,14854,14727,14856,14730,14858,14732,14861,14862,14863,14864,14865,14994,14867,14868,14997,14869,14870,14871,14872,14873,14874,14875,14876,14749,14750,14878,15007,15136,14503,14625,14501,14882,15139,15141,15272,15529,15402,15530,15533,15151,14895,15024,15153,14771,15025,14644,15285,14903,14647,14909,14781,14910,14911,15167,14784,15041,14786,14914,15043,15171,15170,15044,14662,14664,14793,15174,15175,15047,15435,14669,14541,14668,14543,15440,15569,15572,15573,15702,15703,15451,15579,14292,14293,14422,14423,14299,14430,14431,15456,15455,15078,14950,15073,15071,14820,14819,14697,14827,14956,15212,14957,15085,15086,14959,15087,15088,15089,15090,15091,15092,14965,14966,14839,14968,14969,14970,14971,14972,14973,14974,14975,14848,14849,14850,14851,14852,14980,14981,14855,14983,14857,14985,14859,14860,14989,14990,14991,14992,15121,14993,14995,15124,14996,15126,14998,14999,15000,15001,15002,15003,15004,14877,15005,15006,15135,15397,14502,14881,14755,14633,15267,15398,15399,15021,15400,15532,15404,15534,15407,15152,14769,15026,14898,14772,14774,14648,15163,15036,15037,15159,15166,15039,14912,14913,15425,15553,15426,15299,15298,14791,15048,14792,15045,14794,14795,15432,15563,14667,14797,14798,14670,15568,15570,15700,15828,15830,15704,15705,14291,14420,14421,14551,14553,14428,14429,14560,15457,15331,15079,14951,15200,14947,15846,14824,15338,15211,15084,15339,15340,15213,15341,15214,15215,15216,15217,15218,15219,15093,15094,15095,14967,15096,15097,15098,15099,15100,15101,15102,15103,14976,14977,14978,14979,15107,15108,14982,15111,14984,15112,14986,14987,14988,15117,15118,15247,15119,15120,15250,15122,15123,15253,15125,15255,15127,15128,15129,15130,15131,15132,15261,15133,15134,15265,15525,14500,15523,15266,14631,15396,15268,15269,15273,15528,15659,15660,15662,15536,15280,15410,15282,15028,15154,14899,14775,15291,15165,15293,15038,15294,15295,15296,15162,15034,14906,15172,15554,15427,15302,14919,15300,15431,14921,14922,15561,14796,14923,15564,14925,15309,15697,15571,15701,15957,15831,15959,14547,14419,14549,14550,14552,14554,14557,14558,14559,15458,15584,15332,15454,15843,15718,15719,14952,14825,14955,15466,15593,15594,15467,15468,15469,15342,15343,15344,15345,15347,15220,15221,15222,15223,15224,15225,15226,15227,15228,15229,15230,15231,15104,15105,15106,15235,15236,15109,15110,15239,15240,15113,15114,15115,15116,15244,15245,15246,15376,15248,15249,15379,15251,15252,15254,15383,15256,15385,15257,15258,15259,15260,15390,15262,15263,15524,15526,14628,14632,15394,14758,14762,15019,15782,15401,15784,15785,15535,15661,15793,15538,15409,15281,15412,15156,15027,15157,15164,15419,15546,15548,15418,15423,15424,15552,15033,15807,15809,15681,15682,15430,15428,15558,15176,15688,15049,15050,15051,14924,15692,15695,15696,15698,15699,15956,15829,15958,14672,14548,14677,14678,14680,14681,14682,14683,14684,15968,15459,15583,15205,15206,15207,15844,15592,15081,15082,14826,15720,15847,15721,15722,15595,15596,15470,15471,15472,15474,15346,15348,15349,15350,15351,15352,15353,15354,15355,15356,15357,15358,15359,15232,15233,15234,15363,15364,15237,15238,15367,15368,15241,15242,15370,15243,15372,15373,15374,15375,15505,15377,15378,15380,15381,15510,15382,15384,15513,15514,15386,15387,15516,15388,15393,15264,15652,15527,14756,14629,15657,15395,14760,15781,15143,15912,15403,15663,15786,15658,15790,15666,15539,15537,15413,15411,15283,15674,15292,15547,15422,15549,15676,15290,15551,15804,15805,15680,15808,15810,15811,15683,15303,15559,15177,15304,15817,15689,15691,15693,15052,15822,15825,15824,15827,16085,16086,14671,14800,14676,14805,14679,14808,14809,14811,14812,14813,15706,15708,15581,15333,15334,15335,15969,15971,15080,14953,14954,15083,15975,15848,15849,15723,15724,15597,15599,15600,15473,15475,15476,15477,15478,15479,15480,15481,15482,15483,15484,15485,15486,15487,15360,15361,15362,15490,15492,15365,15366,15495,15496,15369,15497,15498,15371,15500,15501,15502,15503,15504,15506,15507,15508,15509,15638,15511,15512,15641,15642,15643,15515,15644,15774,15904,15779,15653,15654,15391,14759,14761,15656,14887,15144,15909,15911,15276,15913,15792,15791,15916,15920,15667,15668,15540,15286,15284,15155,15802,15420,15421,15550,15677,15673,15934,15806,15297,15169,15935,15556,15301,15938,15555,15686,15814,15560,15818,15433,15178,15820,15821,15823,15952,15953,16084,16214,14799,14928,14929,14804,14806,14807,14936,14810,14940,14941,14942,15835,15707,15582,15587,15460,15841,15842,15970,16099,15208,15209,15210,16101,15976,15977,15850,15851,15725,15598,15728,15601,15602,15603,15605,15606,15607,15608,15609,15610,15611,15612,15613,15614,15615,15488,15489,15617,15491,15620,15493,15494,15622,15624,15753,15625,15626,15499,15628,15629,15630,15631,15632,15633,15634,15635,15636,15637,15767,15639,15640,15770,15771,15772,15773,15903,15902,15906,15908,15655,15389,14757,14888,14890,15780,15651,15147,16039,16171,16040,16042,15914,15787,15788,15922,15924,15796,15414,15800,15928,15675,15801,15160,15803,15161,15678,15679,16062,16063,16064,16065,16066,15936,15937,15429,15943,15687,16073,15945,15948,15947,15951,16080,15826,15955,16212,16342,14926,14927,15056,14932,14933,14934,14935,14937,14938,14939,15069,15832,15834,15964,15710,15586,15839,15461,15463,15336,15972,15973,15337,15974,16102,16103,16104,15978,15979,15853,15726,15727,15729,15730,15604,15733,15734,15735,15736,15737,15738,15739,15740,15741,15742,15743,15616,15745,15618,15619,15748,15621,15749,15750,15623,15752,15882,15754,15627,15756,15757,15758,15759,15760,15761,15762,15763,15764,15765,15766,15896,15768,15769,15899,15901,16030,16031,16034,16035,16036,15783,15518,15392,15015,14889,14891,16037,15275,15910,15405,16169,16041,16044,15915,15918,15917,15919,15795,15287,16055,16183,16184,16056,15929,15289,15930,15545,16189,16190,16191,16192,16193,15939,16321,16194,15815,16072,16200,16071,16202,16076,16077,16335,15954,16338,16340,16341,15053,15054,15055,15057,15058,15060,15063,15065,15066,15067,15068,16355,15833,15963,15836,15709,15585,15840,15967,16096,15464,16225,16228,16100,15465,16232,16231,16233,16105,16106,15852,15854,15855,15857,15731,15732,15861,15862,15863,15864,15865,15866,15867,15868,15869,15870,15871,15744,15872,15746,15747,15875,15876,15877,15878,15751,15880,15881,15755,15883,15884,15885,15886,15887,15888,15889,15890,15891,15892,15893,15894,15895,15897,15898,15900,16029,16028,16159,16161,16163,16291,16294,15517,15519,15520,15016,15018,15148,16165,16038,16172,16168,15664,16043,16174,16046,16175,15789,16049,15794,15541,15927,15544,16312,15288,15417,15931,16316,16317,16318,16061,15933,16319,16320,15684,16322,15557,16199,15946,16203,15949,15950,16207,16081,16083,16211,16332,15179,15181,15182,15183,15185,15186,15187,15062,15064,15195,15197,16227,16345,15961,15962,16091,15837,16347,15966,15713,16224,15589,16354,15845,16356,16229,16362,15983,16361,16234,16107,15980,15981,15856,15858,15859,15860,15989,15990,15991,15992,15993,15994,15995,15996,15997,15998,15999,16000,15873,15874,16002,16003,16004,16005,16006,15879,16008,16009,16010,16011,16012,16013,16014,16015,16016,16017,16018,16019,16020,16021,16022,16023,16024,16025,16026,16027,16158,16160,16162,16164,16293,16295,15645,15647,15521,15522,15017,15149,15277,16166,16298,16296,16170,15921,16050,16045,16176,16304,16047,16048,15415,15797,16054,15925,15799,15672,16057,16314,16058,16315,16188,16067,15812,15940,15813,16327,15685,15944,16074,16204,16206,16079,16336,16082,16339,15306,15307,15308,15310,15311,15184,15313,15314,15188,15189,15193,15194,15196,16098,15960,16216,16089,16219,15711,15838,16094,16223,15714,15588,15462,15591,16359,16357,16230,16111,16112,15985,16235,16108,15982,15984,15986,15987,15988,16117,16118,16119,16120,16121,16122,16123,16124,16125,16126,16127,16128,16001,16129,16130,16131,16132,16133,16007,16135,16136,16137,16138,16139,16140,16141,16142,16143,16144,16145,16146,16147,16148,16149,16150,16151,16152,16153,16154,16155,16157,16287,16289,16292,16285,16167,15646,15648,15649,15777,15650,15145,15278,15279,16297,16173,16299,15665,16178,16303,16052,16179,16181,16177,15542,15669,15670,16053,15671,15416,16313,16185,16186,16059,16195,16068,16197,16069,15941,15942,15816,16330,16075,16333,16334,16208,16210,16337,15305,15434,15436,15437,15438,15439,15312,15441,15315,15316,15317,15318,16097,16226,16343,16087,16088,16090,16218,15965,15712,16222,16350,16352,16353,15717,15590,16364,16237,16358,16360,16240,16241,16113,16109,16110,16114,16243,16115,16116,16245,16246,16247,16248,16249,16250,16251,16252,16253,16254,16255,16256,16257,16258,16259,16260,16261,16134,16262,16263,16264,16265,16266,16267,16268,16269,16270,16271,16272,16273,16274,16275,16276,16277,16278,16279,16280,16281,16282,16283,16156,16288,16290,16286,16284,16032,15775,15776,15905,16033,15778,15907,16301,15406,15408,16300,16302,16305,16306,16051,15923,16310,16311,16309,16182,16180,16307,16308,15798,15926,15543,16060,15932,16187,16323,16196,16324,16325,16198,16326,16070,16329,16201,16205,16078,16209,16331,16328,15562,15690,15819,15565,15566,15694,15567,15442,15443,15445,15446,16348,16349,16346,16213,16215,16344,16217,16092,16093,16220,16221,16095,16351,15715,15716,16363,16365,16366,16367,16238,16239,16368,16369,16236,16370,16242,16371,16372,16244,16373,16374,16375,16376,16377,16378,16379,16380,16381,16382,16383]
```
## /presets/cat/output.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/presets/cat/output.png
## /presets/cat/source.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/presets/cat/source.png
## /presets/cat/target.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/presets/cat/target.png
## /presets/cat2/output.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/presets/cat2/output.png
## /presets/cat2/source.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/presets/cat2/source.png
## /presets/cat2/target.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/presets/cat2/target.png
## /presets/colorful/output.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/presets/colorful/output.png
## /presets/colorful/source.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/presets/colorful/source.png
## /presets/colorful/target.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/presets/colorful/target.png
## /presets/wisetree/obama128_order.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/presets/wisetree/obama128_order.png
## /presets/wisetree/output.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/presets/wisetree/output.png
## /presets/wisetree/source.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/presets/wisetree/source.png
## /presets/wisetree/target.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/presets/wisetree/target.png
## /rust-toolchain
``` path="/rust-toolchain"
# If you see this, run "rustup self update" to get rustup 1.23 or newer.
# NOTE: above comment is for older `rustup` (before TOML support was added),
# which will treat the first line as the toolchain name, and therefore show it
# to the user in the error, instead of "error: invalid channel name '[toolchain]'".
[toolchain]
channel = "1.85" # Avoid specifying a patch version here; see https://github.com/emilk/eframe_template/issues/145
components = [ "rustfmt", "clippy" ]
targets = [ "wasm32-unknown-unknown" ]
```
## /src/app/arrow-right.svg
```svg path="/src/app/arrow-right.svg"
<svg xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="white"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
class="icon icon-tabler icons-tabler-outline icon-tabler-arrow-right">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M5 12l14 0" />
<path d="M13 18l6 -6" />
<path d="M13 6l6 6" />
</svg>
```
## /src/app/calculate/blank.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/src/app/calculate/blank.png
## /src/app/calculate/drawing_process.rs
```rs path="/src/app/calculate/drawing_process.rs"
use crate::app::SeedColor;
use crate::app::calculate;
use crate::app::calculate::SWAPS_PER_GENERATION_PER_PIXEL;
use crate::app::preset::UnprocessedPreset;
use std::error::Error;
use std::sync::Arc;
use std::sync::atomic::AtomicU32;
use std::sync::mpsc;
use super::ProgressMsg;
use super::GenerationSettings;
#[derive(Clone, Copy)]
pub struct PixelData {
pub stroke_id: u32,
pub last_edited: u32,
}
impl PixelData {
pub(crate) fn init_canvas(frame_count: u32) -> Vec<PixelData> {
vec![
PixelData {
stroke_id: 0,
last_edited: frame_count
};
DRAWING_CANVAS_SIZE * DRAWING_CANVAS_SIZE
]
}
}
pub const DRAWING_CANVAS_SIZE: usize = 128;
use super::heuristic;
#[derive(Clone, Copy)]
pub(crate) struct DrawingPixel {
pub(crate) src_x: u16,
pub(crate) src_y: u16,
pub(crate) h: i64, // current heuristic value
}
impl DrawingPixel {
pub(crate) fn new(src_x: u16, src_y: u16, h: i64) -> Self {
Self { src_x, src_y, h }
}
pub(crate) fn update_heuristic(&mut self, new_h: i64) {
self.h = new_h;
}
#[inline(always)]
pub(crate) fn calc_drawing_heuristic(
&self,
target_pos: (u16, u16),
target_col: (u8, u8, u8),
weight: i64,
colors: &[SeedColor],
proximity_importance: i64,
) -> i64 {
heuristic(
(self.src_x, self.src_y),
target_pos,
{
let rgba =
colors[self.src_y as usize * DRAWING_CANVAS_SIZE + self.src_x as usize].rgba;
(
(rgba[0] * 256.0) as u8,
(rgba[1] * 256.0) as u8,
(rgba[2] * 256.0) as u8,
)
},
target_col,
weight,
proximity_importance,
)
}
}
pub(crate) const STROKE_REWARD: i64 = -10000000000;
pub(crate) fn stroke_reward(
newpos: usize,
oldpos: usize,
pixel_data: &[PixelData],
pixels: &[DrawingPixel],
frame_count: u32,
) -> i64 {
let x = (newpos % DRAWING_CANVAS_SIZE) as u16;
let y = (newpos / DRAWING_CANVAS_SIZE) as u16;
// look at 8-connected neighbors
// if any has the same stroke_id, return true
let data = pixel_data
[pixels[oldpos].src_x as usize + pixels[oldpos].src_y as usize * DRAWING_CANVAS_SIZE];
let stroke_id = data.stroke_id;
let _age = frame_count - data.last_edited;
for (dx, dy) in [
//(-1, -1),
(0, -1),
//(1, -1),
(-1, 0),
(1, 0),
//(-1, 1),
(0, 1),
//(1, 1),
] {
let nx = x as i16 + dx;
let ny = y as i16 + dy;
if nx < 0 || nx >= DRAWING_CANVAS_SIZE as i16 || ny < 0 || ny >= DRAWING_CANVAS_SIZE as i16
{
continue;
}
let npos = ny as usize * DRAWING_CANVAS_SIZE + nx as usize;
if pixel_data
[pixels[npos].src_x as usize + pixels[npos].src_y as usize * DRAWING_CANVAS_SIZE]
.stroke_id
== stroke_id
{
return STROKE_REWARD;
}
}
0
}
#[allow(clippy::too_many_arguments)]
pub fn drawing_process_genetic(
source: UnprocessedPreset,
settings: GenerationSettings,
tx: mpsc::SyncSender<ProgressMsg>,
colors: Arc<std::sync::RwLock<Vec<SeedColor>>>,
pixel_data: Arc<std::sync::RwLock<Vec<PixelData>>>,
frame_count: u32,
my_id: u32,
current_id: Arc<AtomicU32>,
) -> Result<(), Box<dyn Error>> {
let source_img =
image::ImageBuffer::from_raw(source.width, source.height, source.source_img.clone())
.unwrap();
let (source_pixels, target_pixels, weights) =
calculate::util::get_images(source_img, &settings)?;
let mut pixels = {
let read_colors: Vec<SeedColor> = colors.read().unwrap().clone();
//let read_pixel_data: Vec<PixelData> = pixel_data.read().unwrap().clone();
source_pixels
.iter()
.enumerate()
.map(|(i, _)| {
let x = (i as u32 % settings.sidelen) as u16;
let y = (i as u32 / settings.sidelen) as u16;
let mut p = DrawingPixel::new(x, y, 0);
let h = p.calc_drawing_heuristic(
(x, y),
target_pixels[i],
weights[i],
&read_colors,
settings.proximity_importance,
// &read_pixel_data,
) + STROKE_REWARD;
p.update_heuristic(h);
p
})
.collect::<Vec<_>>()
};
let mut rng = frand::Rand::with_seed(12345);
fn max_dist(age: u32) -> u32 {
(((DRAWING_CANVAS_SIZE / 4) as f32) * (0.99f32).powi(age as i32 / 30)).round() as u32
}
let swaps_per_generation = SWAPS_PER_GENERATION_PER_PIXEL * pixels.len();
loop {
let colors: Vec<SeedColor> = {
let r = colors.read().unwrap();
r.clone()
};
let pixel_data = {
let r = pixel_data.read().unwrap();
r.clone()
};
let mut swaps_made = 0;
for _ in 0..swaps_per_generation {
let apos = rng.gen_range(0..pixels.len() as u64) as usize;
let ax = apos as u16 % settings.sidelen as u16;
let ay = apos as u16 / settings.sidelen as u16;
//let stroke_id = pixel_data[apos].stroke_id as usize;
let max_dist_a = max_dist(frame_count.saturating_sub(pixel_data[apos].last_edited));
let bx = (ax as i16 + rng.gen_range(-(max_dist_a as i16)..(max_dist_a as i16 + 1)))
.clamp(0, settings.sidelen as i16 - 1) as u16;
let by = (ay as i16 + rng.gen_range(-(max_dist_a as i16)..(max_dist_a as i16 + 1)))
.clamp(0, settings.sidelen as i16 - 1) as u16;
let bpos = by as usize * settings.sidelen as usize + bx as usize;
let max_dist_b = max_dist(frame_count.saturating_sub(pixel_data[bpos].last_edited));
if (bx as i32 - ax as i32).abs() > max_dist_b as i32
|| (by as i32 - ay as i32).abs() > max_dist_b as i32
{
continue;
}
let t_a = target_pixels[apos];
let t_b = target_pixels[bpos];
let a_on_b_h = pixels[apos].calc_drawing_heuristic(
(bx, by),
t_b,
weights[bpos],
&colors,
settings.proximity_importance,
) + stroke_reward(bpos, apos, &pixel_data, &pixels, frame_count);
let b_on_a_h = pixels[bpos].calc_drawing_heuristic(
(ax, ay),
t_a,
weights[apos],
&colors,
settings.proximity_importance,
) + stroke_reward(apos, bpos, &pixel_data, &pixels, frame_count);
let improvement_a = pixels[apos].h - b_on_a_h;
let improvement_b = pixels[bpos].h - a_on_b_h;
if improvement_a + improvement_b > 0 {
// swap
pixels.swap(apos, bpos);
pixels[apos].update_heuristic(b_on_a_h);
pixels[bpos].update_heuristic(a_on_b_h);
swaps_made += 1;
}
}
//println!("swaps made: {}", swaps_made);
// let img = make_new_img(&source_pixels, &assignments, target.width());
// if swaps_made < 10 || cancelled.load(std::sync::atomic::Ordering::Relaxed) {
// let dir_name = save_result(target, base_name, source, assignments, img)?;
// tx.send(ProgressMsg::Done(PathBuf::from(format!(
// "./presets/{}",
// dir_name
// ))))?;
// return Ok(());
// }
// tx.send(ProgressMsg::UpdatePreview(img))?;
if swaps_made > 0 {
let assignments = pixels
.iter()
.map(|p| p.src_y as usize * settings.sidelen as usize + p.src_x as usize)
.collect::<Vec<_>>();
tx.send(ProgressMsg::UpdateAssignments(assignments))?;
}
if my_id != current_id.load(std::sync::atomic::Ordering::Relaxed) {
tx.send(ProgressMsg::Cancelled).unwrap();
return Ok(());
}
//max_dist = (max_dist as f32 * 0.99).max(4.0) as u32;
}
}
```
## /src/app/calculate/target128.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/src/app/calculate/target128.png
## /src/app/calculate/target256.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/src/app/calculate/target256.png
## /src/app/calculate/util.rs
```rs path="/src/app/calculate/util.rs"
use crate::app::calculate::ProgressMsg;
use image::imageops;
use serde::Deserialize;
use serde::Serialize;
use uuid::Uuid;
use std::error::Error;
// pub(crate) fn save_result(
// target: image::SourceImg,
// base_name: String,
// source: image::SourceImg,
// assignments: Vec<usize>,
// img: image::SourceImg,
// ) -> Result<String, Box<dyn Error>> {
// let mut dir_name = base_name.clone();
// let mut counter = 1;
// while std::path::Path::new(&format!("./presets/{}", dir_name)).exists() {
// dir_name = format!("{}_{}", base_name, counter);
// counter += 1;
// }
// std::fs::create_dir_all(format!("./presets/{}", dir_name))?;
// img.save(format!("./presets/{}/output.png", dir_name))?;
// source.save(format!("./presets/{}/source.png", dir_name))?;
// target.save(format!("./presets/{}/target.png", dir_name))?;
// std::fs::write(
// format!("./presets/{}/assignments.json", dir_name),
// serialize_assignments(assignments),
// )?;
// Ok(dir_name)
// }
pub trait ProgressSink {
fn send(&mut self, msg: ProgressMsg);
}
// Native-friendly adapter
impl ProgressSink for std::sync::mpsc::SyncSender<ProgressMsg> {
fn send(&mut self, msg: ProgressMsg) {
let _ = std::sync::mpsc::SyncSender::send(self, msg);
}
}
// Allow using closures as progress sinks in WASM
impl<T> ProgressSink for T
where
T: FnMut(crate::app::calculate::ProgressMsg),
{
fn send(&mut self, msg: crate::app::calculate::ProgressMsg) {
self(msg);
}
}
#[allow(clippy::type_complexity)]
pub(crate) fn get_images(
source: SourceImg,
settings: &GenerationSettings,
) -> Result<(Vec<(u8, u8, u8)>, Vec<(u8, u8, u8)>, Vec<i64>), Box<dyn Error>> {
let source = settings.source_crop_scale.apply(&source, settings.sidelen);
let source_pixels = source
.pixels()
.map(|p| (p[0], p[1], p[2]))
.collect::<Vec<_>>();
let (target, weights) = settings.get_target()?;
let target_pixels = target
.pixels()
.map(|p| (p[0], p[1], p[2]))
.collect::<Vec<_>>();
assert_eq!(source_pixels.len(), target_pixels.len());
Ok((source_pixels, target_pixels, weights))
}
#[derive(Clone, Copy, Serialize, Deserialize, PartialEq)]
pub struct CropScale {
pub x: f32, // -1: all left, 0: center, 1: all right
pub y: f32, // -1: all top, 0: center, 1: all bottom
pub scale: f32, // 1: fit within frame, >1: zoom in, <1: not allowed
}
impl CropScale {
pub fn identity() -> Self {
Self {
x: 0.0,
y: 0.0,
scale: 1.0,
}
}
pub fn apply(&self, img: &SourceImg, sidelen: u32) -> SourceImg {
let (w, h) = img.dimensions();
let s = self.scale.max(1.0);
let base_side = w.min(h) as f32;
let mut crop_side = (base_side / s).floor().max(1.0);
crop_side = crop_side.min(w as f32).min(h as f32);
let max_x_off = (w as f32 - crop_side).max(0.0);
let max_y_off = (h as f32 - crop_side).max(0.0);
let xn = (self.x.clamp(-1.0, 1.0) + 1.0) * 0.5;
let yn = (self.y.clamp(-1.0, 1.0) + 1.0) * 0.5;
let x0 = (xn * max_x_off).floor() as u32;
let y0 = (yn * max_y_off).floor() as u32;
let cs = crop_side as u32;
let cropped = imageops::crop_imm(img, x0, y0, cs, cs).to_image();
if cs == sidelen {
cropped
} else {
imageops::resize(&cropped, sidelen, sidelen, imageops::FilterType::Lanczos3)
}
}
}
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
pub enum Algorithm {
Optimal,
Genetic,
}
#[derive(Serialize, Deserialize, Clone)]
pub struct GenerationSettings {
pub id: Uuid,
pub name: String,
pub proximity_importance: i64,
pub algorithm: Algorithm,
pub sidelen: u32,
custom_target: Option<(u32, u32, Vec<u8>)>,
pub target_crop_scale: CropScale,
pub source_crop_scale: CropScale,
}
pub type SourceImg = image::RgbImage;
impl GenerationSettings {
pub fn default(id: Uuid, name: String) -> Self {
Self {
name,
proximity_importance: 13, // 20
algorithm: Algorithm::Genetic,
id,
sidelen: 128,
custom_target: None,
target_crop_scale: CropScale::identity(),
source_crop_scale: CropScale::identity(),
}
}
pub fn get_target(&self) -> Result<(SourceImg, Vec<i64>), Box<dyn std::error::Error>> {
let target = self.get_raw_target();
let target = self.target_crop_scale.apply(&target, self.sidelen);
let weights = if self.custom_target.is_some() {
vec![255; (self.sidelen * self.sidelen) as usize] // uniform weights
} else {
let target_weights =
image::load_from_memory(include_bytes!("weights256.png"))?.to_rgb8();
let target_weights = self.target_crop_scale.apply(&target_weights, self.sidelen);
load_weights(target_weights)
};
Ok((target, weights))
}
pub(crate) fn get_raw_target(&self) -> SourceImg {
if let Some((w, h, data)) = &self.custom_target {
image::ImageBuffer::from_vec(*w, *h, data.clone()).unwrap()
} else {
image::load_from_memory(include_bytes!("target256.png"))
.unwrap()
.to_rgb8()
}
}
pub(crate) fn set_raw_target(&mut self, img: SourceImg) {
let (w, h) = img.dimensions();
let data = img.into_raw();
self.custom_target = Some((w, h, data));
}
pub fn clone_with_new_id(&self) -> Self {
let mut new = self.clone();
new.id = Uuid::new_v4();
new.name = if let Some(v_pos) = self.name.rfind(" v") {
let potential_version = &self.name[v_pos + 2..];
if let Ok(version) = potential_version.parse::<u32>() {
let base_name = &self.name[..v_pos];
format!("{} v{}", base_name, version + 1)
} else {
format!("{} v2", self.name)
}
} else {
format!("{} v2", self.name)
};
new
}
}
pub fn load_weights(source: SourceImg) -> Vec<i64> {
let (width, height) = source.dimensions();
let mut weights = vec![0; (width * height) as usize];
for (x, y, pixel) in source.enumerate_pixels() {
let weight = pixel[0] as i64;
weights[(y * width + x) as usize] = weight;
}
weights
}
```
## /src/app/calculate/weights128.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/src/app/calculate/weights128.png
## /src/app/calculate/weights256.png
Binary file available at https://raw.githubusercontent.com/Spu7Nix/obamify/refs/heads/main/src/app/calculate/weights256.png
## /src/app/calculate/worker/mod.rs
```rs path="/src/app/calculate/worker/mod.rs"
use eframe::wasm_bindgen::prelude::*;
use serde::{Deserialize, Serialize};
use web_sys::DedicatedWorkerGlobalScope;
use web_sys::js_sys;
#[derive(Serialize, Deserialize)]
pub enum WorkerReq {
Process {
source: crate::app::preset::UnprocessedPreset,
settings: super::GenerationSettings,
},
}
use crate::app::calculate::ProgressMsg;
use crate::app::calculate::process;
// thread_local! {
// static CANCELLED: Rc<Cell<bool>> = Rc::new(Cell::new(false));
// }
#[wasm_bindgen]
pub fn worker_entry() {
let global: DedicatedWorkerGlobalScope = js_sys::global().unchecked_into();
let global_for_handler = global.clone();
let handler = Closure::wrap(Box::new(move |e: web_sys::MessageEvent| {
// Deserialize the incoming request
let req: WorkerReq = match serde_wasm_bindgen::from_value(e.data()) {
Ok(v) => v,
Err(err) => {
let _ = global_for_handler.post_message(
&serde_wasm_bindgen::to_value(&ProgressMsg::Error(format!("bad req: {err}")))
.unwrap(),
);
return;
}
};
match req {
WorkerReq::Process { source, settings } => {
// Run job; if you need to keep the UI responsive in the worker,
// wrap in an async task and yield occasionally.
let global2 = global_for_handler.clone();
// progress sink -> postMessage
let mut sink = |msg: ProgressMsg| {
let _ = global2.post_message(&serde_wasm_bindgen::to_value(&msg).unwrap());
};
// If you need to yield, you can insert tiny awaits between steps.
// Here we just call the portable sync fn:
if let Err(e) = process(source, settings, &mut sink) {
sink(ProgressMsg::Error(e.to_string()));
}
}
}
}) as Box<dyn FnMut(_)>);
global.set_onmessage(Some(handler.as_ref().unchecked_ref()));
handler.forget();
}
```
## /src/app/preset.rs
```rs path="/src/app/preset.rs"
use serde::{Deserialize, Serialize};
#[derive(Clone, Serialize, Deserialize)]
pub struct Preset {
pub inner: UnprocessedPreset,
pub assignments: Vec<usize>,
}
#[derive(Clone, Serialize, Deserialize)]
pub struct UnprocessedPreset {
pub name: String,
pub width: u32,
pub height: u32,
pub source_img: Vec<u8>,
}
```
## /src/lib.rs
```rs path="/src/lib.rs"
#![warn(clippy::all, rust_2018_idioms)]
mod app;
pub use app::ObamifyApp;
#[cfg(target_arch = "wasm32")]
pub use app::worker_entry;
```
## /src/main.rs
```rs path="/src/main.rs"
#![warn(clippy::all, rust_2018_idioms)]
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in release
// When compiling natively:
#[cfg(not(target_arch = "wasm32"))]
fn main() -> eframe::Result {
env_logger::init(); // Log to stderr (if you run with `RUST_LOG=debug`).
let native_options = eframe::NativeOptions {
viewport: egui::ViewportBuilder::default()
.with_inner_size([1024.0, 1024.0])
.with_min_inner_size([400.0, 400.0])
.with_icon(
// NOTE: Adding an icon is optional
eframe::icon_data::from_png_bytes(&include_bytes!("../assets/icon128.png")[..])
.expect("Failed to load icon"),
),
..Default::default()
};
eframe::run_native(
"obamify",
native_options,
Box::new(|cc| Ok(Box::new(obamify::ObamifyApp::new(cc)))),
)
}
// When compiling to web using trunk:
#[cfg(target_arch = "wasm32")]
fn start_app() {
use eframe::wasm_bindgen::JsCast as _;
std::panic::set_hook(Box::new(console_error_panic_hook::hook));
//web_sys::console::log_1(&"Starting obamify...".into());
// Redirect `log` message to `console.log` and friends:
eframe::WebLogger::init(log::LevelFilter::Warn).ok();
let web_options = eframe::WebOptions {
wgpu_options: egui_wgpu::WgpuConfiguration {
// Force WebGL backend for maximum compatibility
wgpu_setup: egui_wgpu::WgpuSetup::CreateNew(egui_wgpu::WgpuSetupCreateNew {
instance_descriptor: egui_wgpu::wgpu::InstanceDescriptor {
backends: egui_wgpu::wgpu::Backends::GL,
..Default::default()
},
power_preference: egui_wgpu::wgpu::PowerPreference::HighPerformance,
device_descriptor: std::sync::Arc::new(|_adapter| {
let mut limits = egui_wgpu::wgpu::Limits::downlevel_webgl2_defaults();
// Clamp texture size to 2048 for WebGL compatibility
limits.max_texture_dimension_2d = 4096;
egui_wgpu::wgpu::DeviceDescriptor {
label: Some("egui_device"),
required_features: egui_wgpu::wgpu::Features::default(),
required_limits: limits,
memory_hints: egui_wgpu::wgpu::MemoryHints::default(),
trace: Default::default(),
}
}),
native_adapter_selector: None,
}),
..Default::default()
},
..Default::default()
};
wasm_bindgen_futures::spawn_local(async {
let document = web_sys::window()
.expect("No window")
.document()
.expect("No document");
let canvas = document
.get_element_by_id("the_canvas_id")
.expect("Failed to find the_canvas_id")
.dyn_into::<web_sys::HtmlCanvasElement>()
.expect("the_canvas_id was not a HtmlCanvasElement");
let start_result = eframe::WebRunner::new()
.start(
canvas,
web_options,
Box::new(|cc| Ok(Box::new(obamify::ObamifyApp::new(cc)))),
)
.await;
// Remove the loading text and spinner:
if let Some(loading_text) = document.get_element_by_id("loading_text") {
match start_result {
Ok(_) => {
loading_text.remove();
}
Err(e) => {
use web_sys::js_sys::JsString;
loading_text.set_inner_html(&format!(
"<div> Please enable hardware acceleration in your browser :) </div> <div class=\"error\"> Error: {} </div>",
std::convert::Into::<JsString>::into(e.clone())
));
panic!("Failed to start eframe: {e:?}");
}
}
}
});
}
#[cfg(target_arch = "wasm32")]
pub fn main() {
use wasm_bindgen::JsCast as _;
console_error_panic_hook::set_once();
// If we have a Window, we’re on the page → run the app.
if web_sys::window().is_some() {
start_app();
return;
}
// Otherwise, if we have a DedicatedWorkerGlobalScope, we’re in a worker → install worker.
if web_sys::js_sys::global()
.dyn_ref::<web_sys::DedicatedWorkerGlobalScope>()
.is_some()
{
obamify::worker_entry(); // <- your existing function that sets onmessage, etc.
return;
}
// Fallback: unknown environment
web_sys::console::warn_1(
&"Unknown global (not Window / not DedicatedWorkerGlobalScope)".into(),
);
}
```
## /worker.js
```js path="/worker.js"
const params = new URLSearchParams(self.location.search)
const scriptName = params.get("script") || "./obamify.js"
try {
const obamifyModule = await import(scriptName)
const wasmName = scriptName.replace(".js", "_bg.wasm")
await obamifyModule.default(wasmName)
} catch (e) {
console.error("worker failed to initialize:", e)
throw e
}
```
The content has been capped at 50000 tokens. The user could consider applying other filters to refine the result. The better and more specific the context, the better the LLM can follow instructions. If the context seems verbose, the user can refine the filter using uithub. Thank you for using https://uithub.com - Perfect LLM context for any GitHub repo.