diff --git a/.gitignore b/.gitignore index 0743618..96ffe44 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,55 @@ +# Build & binary files +build/ +dist/ +bin/ +target/ +*.exe +*.dll +*.so +*.dylib +*.test +*.out +*.elf + +# Circuit artifacts +*.r1cs +*.sym +*.wasm +*.wtns +*.zkey +*.ptau +circuit_js/ +circuit_cpp/ +circuit_data/ +proof.json +public.json +verification_key.json +witness.wtns + +# Dependencies node_modules/ +package-lock.json +Cargo.lock +**/*.rs.bk + +# IDE +.idea/ +.vscode/ +*.swp +*.swo +*~ + +# Logs & debug +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# OS files +.DS_Store +Thumbs.db + +# Environment variables .env -target/ -params/ \ No newline at end of file +.env.local +.env.*.local \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..86ed021 --- /dev/null +++ b/Makefile @@ -0,0 +1,51 @@ +.PHONY: all clean gnark_groth16 snarkjs_groth16 risc0 sp1 plonky2 gnark_plonk halo2_kzg halo2_kzg_evm setup + +setup: + @bash setup.sh && npm install && node test_credentials.js + +all: setup gnark_groth16 snarkjs_groth16 risc0 sp1 plonky2 gnark_plonk halo2_kzg halo2_kzg_evm + +gnark_groth16: + cd circuits/gnark_groth16 && go run circuit.go + node quantum_test.js --scheme gnark_groth16 + +snarkjs_groth16: + cd circuits/snarkjs_groth16 && ./build.sh + node quantum_test.js --scheme snarkjs_groth16 + +risc0: + cd circuits/risc0 && cargo run -r --package risc0 --bin risc0 + node quantum_test.js --scheme risc0 + +sp1: + cd circuits/sp1/program && cargo prove build --output-directory ../elf + cd circuits/sp1 && cargo run -r --package sp1 --bin sp1 + node quantum_test.js --scheme sp1 + +plonky2: + cd circuits/plonky2 && cargo run -r --package plonky2:0.1.0 --bin plonky2 + node quantum_test.js --scheme plonky2 + +gnark_plonk: + cd circuits/gnark_plonk && go run circuit.go + node quantum_test.js --scheme gnark_plonk + +halo2_kzg: + cd circuits/halo2_kzg && cargo run -r --package halo2_kzg --bin halo2_kzg + node quantum_test.js --scheme halo2_kzg + +halo2_kzg_evm: + cd circuits/halo2_kzg_evm && cargo run -r --package halo2_kzg_evm --bin halo2_kzg_evm + node quantum_test.js --scheme halo2_kzg_evm + +clean: + cd circuits/risc0 && cargo clean + cd circuits/sp1 && cargo clean + cd circuits/plonky2 && cargo clean + cd circuits/halo2_kzg && cargo clean + cd circuits/halo2_kzg_evm && cargo clean + cd circuits/snarkjs_groth16 && \ + rm -f *.ptau *.zkey *.r1cs *.sym witness.wtns proof.json public.json verification_key.json input.json && \ + rm -rf circuit_js circuit_data && \ + cd circuit_cpp && make clean && cd .. && \ + rm -rf circuit_cpp/circuit \ No newline at end of file diff --git a/README.md b/README.md index de24460..49da1b1 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,32 @@ # quantum-demo -Contains demos for different proving schemes supported by Quantum. +This repo contains demos for different proving schemes supported by Quantum. -### Test Quantum API (Circuit Registration + Proof Submission) +## Quick Start +Install dependencies and setup credentials +```bash +make setup +``` +To clean build artifacts, run: +```bash +make clean +``` -- schemes = {gnark_groth16, snarkjs_groth16, risc0, sp1, plonky2, gnark_plonk, halo2_kzg, halo2_kzg_evm} -- `node quantum_test.js --scheme gnark_groth16` +## Testing Individual Schemes -### Generate circuit data +You can build and test individual proving schemes using: + +```bash +make +``` + +Available schemes: +- `gnark_groth16` +- `snarkjs_groth16` +- `risc0` +- `sp1` +- `plonky2` +- `gnark_plonk` +- `halo2_kzg` +- `halo2_kzg_evm` -- gnark_groth16 - - `cd circuits/gnark_groth16` - - `go run circuit.go` -- snarkjs_groth16 - - circuits/snarkjs_groth16/circuit.circom -- risc0 - - `cd circuits/risc0` - - `cargo run -r --package risc0 --bin risc0` -- sp1 - - `cd circuits/sp1/program` - - `cargo prove build --output-directory circuits/sp1/elf` - - `cd ..` - - `cargo run -r --package sp1 --bin sp1` -- plonky2 - - `cd circuits/plonky2` - - `cargo run -r --package plonky2:0.1.0 --bin plonky2` -- gnark_plonk plonky2 - - cd `circuits/gnark_plonk` - - `go run circuit.go` -- halo2_kzg - - `cd circuits/halo2_kzg` - - `cargo run -r --package halo2_kzg --bin halo2_kzg` -- halo2_kzg_evm - - `cd circuits/halo2_kzg_evm` - - `cargo run -r --package halo2_kzg_evm --bin halo2_kzg_evm` diff --git a/circuits/gnark_groth16/circuit_data/pis.json b/circuits/gnark_groth16/circuit_data/pis.json deleted file mode 100644 index d2980b8..0000000 --- a/circuits/gnark_groth16/circuit_data/pis.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "35" -] \ No newline at end of file diff --git a/circuits/gnark_groth16/circuit_data/proof.bin b/circuits/gnark_groth16/circuit_data/proof.bin deleted file mode 100644 index 6bc6d7b..0000000 Binary files a/circuits/gnark_groth16/circuit_data/proof.bin and /dev/null differ diff --git a/circuits/gnark_groth16/circuit_data/vKey.bin b/circuits/gnark_groth16/circuit_data/vKey.bin deleted file mode 100644 index 6af1b27..0000000 Binary files a/circuits/gnark_groth16/circuit_data/vKey.bin and /dev/null differ diff --git a/circuits/gnark_plonk/circuit_data/pis.json b/circuits/gnark_plonk/circuit_data/pis.json deleted file mode 100644 index d2980b8..0000000 --- a/circuits/gnark_plonk/circuit_data/pis.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "35" -] \ No newline at end of file diff --git a/circuits/gnark_plonk/circuit_data/proof.bin b/circuits/gnark_plonk/circuit_data/proof.bin deleted file mode 100644 index fe7ae66..0000000 Binary files a/circuits/gnark_plonk/circuit_data/proof.bin and /dev/null differ diff --git a/circuits/gnark_plonk/circuit_data/vKey.bin b/circuits/gnark_plonk/circuit_data/vKey.bin deleted file mode 100644 index 5447469..0000000 Binary files a/circuits/gnark_plonk/circuit_data/vKey.bin and /dev/null differ diff --git a/circuits/halo2_kzg/circuit_data/instances.json b/circuits/halo2_kzg/circuit_data/instances.json deleted file mode 100644 index 9f3093c..0000000 --- a/circuits/halo2_kzg/circuit_data/instances.json +++ /dev/null @@ -1 +0,0 @@ -[["a00ec4c200000000000000000000000000000000000000000000000000000000"]] \ No newline at end of file diff --git a/circuits/halo2_kzg/circuit_data/proof.bin b/circuits/halo2_kzg/circuit_data/proof.bin deleted file mode 100644 index 072bf52..0000000 Binary files a/circuits/halo2_kzg/circuit_data/proof.bin and /dev/null differ diff --git a/circuits/halo2_kzg/circuit_data/protocol.json b/circuits/halo2_kzg/circuit_data/protocol.json deleted file mode 100644 index 1de2536..0000000 --- a/circuits/halo2_kzg/circuit_data/protocol.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":{"k":8,"n":256,"n_inv":"0100105c9e139eb220b73f3160b40bcb04d7ffca70f5978e896e506e24ea3330","gen":"816c525a1ecc92666a33d25d9e5a67d8dbf2130aff960b8285e59b523da85810","gen_inv":"0ba1ab283f433be66a84b58ef4512c43799de8b0c9f32598841450df80714d1f"},"domain_as_witness":null,"preprocessed":["a533dcf259bb271dfc1e6b572dedbcd8d123a9370e67e470f86b9270f61e1d2d","7d522fb5fb3f35e8f11dfd7ec6cc93c24e6d7c78002d3321c305dd299a7ee10b","3dc55540966b0c364972c1978a2731550df9c82a0a03ae0b4c9440f2335ad40b","c6991b66423ccbcd542c8e7a0e64591d3fc02335455c92f414bcaa09297fdc1a","e2c106e49c5a5fddd7997831bcae11bdd890da5501384ab2357c40d3467c4e6e","e74cbc9fa1abcfbee8c79ea968988bb3cbf748b3396b76f48e27c0cbea152b5a","04e1aaddcf2d77ff42c8d03823b7f7725a3dc32600d4b2e031e326dce82b5f28","ca5969fbd51c2e649593046cffab7c6d89fb745bd62f9a52fa0572bf6cda6245"],"num_instance":[1],"num_witness":[3,0,3],"num_challenge":[1,2,1],"evaluations":[{"poly":9,"rotation":0},{"poly":10,"rotation":0},{"poly":11,"rotation":0},{"poly":0,"rotation":0},{"poly":1,"rotation":0},{"poly":2,"rotation":0},{"poly":3,"rotation":0},{"poly":4,"rotation":0},{"poly":14,"rotation":0},{"poly":5,"rotation":0},{"poly":6,"rotation":0},{"poly":7,"rotation":0},{"poly":12,"rotation":0},{"poly":12,"rotation":1},{"poly":12,"rotation":-6},{"poly":13,"rotation":0},{"poly":13,"rotation":1}],"queries":[{"poly":9,"rotation":0},{"poly":10,"rotation":0},{"poly":11,"rotation":0},{"poly":12,"rotation":0},{"poly":12,"rotation":1},{"poly":13,"rotation":0},{"poly":13,"rotation":1},{"poly":12,"rotation":-6},{"poly":0,"rotation":0},{"poly":1,"rotation":0},{"poly":2,"rotation":0},{"poly":3,"rotation":0},{"poly":4,"rotation":0},{"poly":5,"rotation":0},{"poly":6,"rotation":0},{"poly":7,"rotation":0},{"poly":15,"rotation":0},{"poly":14,"rotation":0}],"quotient":{"chunk_degree":1,"numerator":{"DistributePowers":[[{"Sum":[{"Sum":[{"Sum":[{"Sum":[{"Sum":[{"Product":[{"Polynomial":{"poly":0,"rotation":0}},{"Polynomial":{"poly":9,"rotation":0}}]},{"Product":[{"Polynomial":{"poly":1,"rotation":0}},{"Polynomial":{"poly":10,"rotation":0}}]}]},{"Product":[{"Polynomial":{"poly":2,"rotation":0}},{"Polynomial":{"poly":11,"rotation":0}}]}]},{"Product":[{"Product":[{"Polynomial":{"poly":3,"rotation":0}},{"Polynomial":{"poly":9,"rotation":0}}]},{"Polynomial":{"poly":10,"rotation":0}}]}]},{"Polynomial":{"poly":4,"rotation":0}}]},{"Polynomial":{"poly":8,"rotation":0}}]},{"Product":[{"CommonPolynomial":{"Lagrange":0}},{"Sum":[{"Constant":"0100000000000000000000000000000000000000000000000000000000000000"},{"Negated":{"Polynomial":{"poly":12,"rotation":0}}}]}]},{"Product":[{"CommonPolynomial":{"Lagrange":-6}},{"Sum":[{"Product":[{"Polynomial":{"poly":13,"rotation":0}},{"Polynomial":{"poly":13,"rotation":0}}]},{"Negated":{"Polynomial":{"poly":13,"rotation":0}}}]}]},{"Product":[{"CommonPolynomial":{"Lagrange":0}},{"Sum":[{"Polynomial":{"poly":13,"rotation":0}},{"Negated":{"Polynomial":{"poly":12,"rotation":-6}}}]}]},{"Product":[{"Sum":[{"Sum":[{"Constant":"0100000000000000000000000000000000000000000000000000000000000000"},{"Negated":{"CommonPolynomial":{"Lagrange":-6}}}]},{"Negated":{"Sum":[{"Sum":[{"Sum":[{"Sum":[{"CommonPolynomial":{"Lagrange":-5}},{"CommonPolynomial":{"Lagrange":-4}}]},{"CommonPolynomial":{"Lagrange":-3}}]},{"CommonPolynomial":{"Lagrange":-2}}]},{"CommonPolynomial":{"Lagrange":-1}}]}}]},{"Sum":[{"Product":[{"Polynomial":{"poly":12,"rotation":1}},{"Product":[{"Sum":[{"Sum":[{"Polynomial":{"poly":9,"rotation":0}},{"Product":[{"Challenge":1},{"Polynomial":{"poly":5,"rotation":0}}]}]},{"Challenge":2}]},{"Sum":[{"Sum":[{"Polynomial":{"poly":10,"rotation":0}},{"Product":[{"Challenge":1},{"Polynomial":{"poly":6,"rotation":0}}]}]},{"Challenge":2}]}]}]},{"Negated":{"Product":[{"Polynomial":{"poly":12,"rotation":0}},{"Product":[{"Sum":[{"Sum":[{"Polynomial":{"poly":9,"rotation":0}},{"Product":[{"Product":[{"Challenge":1},{"Constant":"0100000000000000000000000000000000000000000000000000000000000000"}]},{"CommonPolynomial":"Identity"}]}]},{"Challenge":2}]},{"Sum":[{"Sum":[{"Polynomial":{"poly":10,"rotation":0}},{"Product":[{"Product":[{"Challenge":1},{"Constant":"a2e933e5bb560e87253f965e8e895f5b716ec8d4aa26ec64caf0c6226e6b2209"}]},{"CommonPolynomial":"Identity"}]}]},{"Challenge":2}]}]}]}}]}]},{"Product":[{"Sum":[{"Sum":[{"Constant":"0100000000000000000000000000000000000000000000000000000000000000"},{"Negated":{"CommonPolynomial":{"Lagrange":-6}}}]},{"Negated":{"Sum":[{"Sum":[{"Sum":[{"Sum":[{"CommonPolynomial":{"Lagrange":-5}},{"CommonPolynomial":{"Lagrange":-4}}]},{"CommonPolynomial":{"Lagrange":-3}}]},{"CommonPolynomial":{"Lagrange":-2}}]},{"CommonPolynomial":{"Lagrange":-1}}]}}]},{"Sum":[{"Product":[{"Polynomial":{"poly":13,"rotation":1}},{"Sum":[{"Sum":[{"Polynomial":{"poly":11,"rotation":0}},{"Product":[{"Challenge":1},{"Polynomial":{"poly":7,"rotation":0}}]}]},{"Challenge":2}]}]},{"Negated":{"Product":[{"Polynomial":{"poly":13,"rotation":0}},{"Sum":[{"Sum":[{"Polynomial":{"poly":11,"rotation":0}},{"Product":[{"Product":[{"Challenge":1},{"Constant":"2b3710dfba7d273c73bd81a2877b4211c2988f038160d1fe15e92fe8d460b313"}]},{"CommonPolynomial":"Identity"}]}]},{"Challenge":2}]}]}}]}]}],{"Challenge":3}]}},"transcript_initial_state":"7800de471058f7c564ff61b80b6b599d72f76b4c18e28a137b4a8e5d93913003","instance_committing_key":null,"linearization":null,"accumulator_indices":[]} \ No newline at end of file diff --git a/circuits/halo2_kzg/circuit_data/sg2.json b/circuits/halo2_kzg/circuit_data/sg2.json deleted file mode 100644 index 4fe2084..0000000 --- a/circuits/halo2_kzg/circuit_data/sg2.json +++ /dev/null @@ -1 +0,0 @@ -"d93d5210945b6cdb2938b281d0ae00bc62f736bbd152339c547b7af75a81df0ebebe6241dad59f03e933b8fc801168b6faf5f4525b27f702ddcca60f9c363d66" \ No newline at end of file diff --git a/circuits/halo2_kzg_evm/circuit_data/instances.json b/circuits/halo2_kzg_evm/circuit_data/instances.json deleted file mode 100644 index de6418c..0000000 --- a/circuits/halo2_kzg_evm/circuit_data/instances.json +++ /dev/null @@ -1 +0,0 @@ -[["976a44a000000000000000000000000000000000000000000000000000000000"]] \ No newline at end of file diff --git a/circuits/halo2_kzg_evm/circuit_data/proof.bin b/circuits/halo2_kzg_evm/circuit_data/proof.bin deleted file mode 100644 index 08d51f9..0000000 Binary files a/circuits/halo2_kzg_evm/circuit_data/proof.bin and /dev/null differ diff --git a/circuits/halo2_kzg_evm/circuit_data/protocol.json b/circuits/halo2_kzg_evm/circuit_data/protocol.json deleted file mode 100644 index 7323032..0000000 --- a/circuits/halo2_kzg_evm/circuit_data/protocol.json +++ /dev/null @@ -1 +0,0 @@ -{"domain":{"k":8,"n":256,"n_inv":"0100105c9e139eb220b73f3160b40bcb04d7ffca70f5978e896e506e24ea3330","gen":"816c525a1ecc92666a33d25d9e5a67d8dbf2130aff960b8285e59b523da85810","gen_inv":"0ba1ab283f433be66a84b58ef4512c43799de8b0c9f32598841450df80714d1f"},"domain_as_witness":null,"preprocessed":["9b1d8a70f6ae06abe9b99275b5faf7b39d456812291dddba64d2c65e1c4a8714","4af768e77fc5cc76bcf79577785e0907843b65eca20ff2c3ad57974e9f3efd4a","f9665399f3708da49e6ab873a3ec9680b4ac0446603907bf28dae6932ea79650","b32ccb10fd6acb8d018415a578bc3258c75f6baf32fd1c73d47b5be915fac742","7d6c7033cf60cf60ead2878029a2ffe18a8136d116df490bc2329593c7bbcf65","7077259143145236e1f40cbbc9235371dcdd6e21b3eb38b6dd5d9d443831ac0d","197538a8af3b936308ff72fa0af5b2864e091bcaa31c0afc5ce1348368eabb25","12056d9dca7177fdfe666258afb26f9d6df1202a81c0bfc2323a79f45f81aa43"],"num_instance":[1],"num_witness":[3,0,3],"num_challenge":[1,2,1],"evaluations":[{"poly":9,"rotation":0},{"poly":10,"rotation":0},{"poly":11,"rotation":0},{"poly":0,"rotation":0},{"poly":1,"rotation":0},{"poly":2,"rotation":0},{"poly":3,"rotation":0},{"poly":4,"rotation":0},{"poly":14,"rotation":0},{"poly":5,"rotation":0},{"poly":6,"rotation":0},{"poly":7,"rotation":0},{"poly":12,"rotation":0},{"poly":12,"rotation":1},{"poly":12,"rotation":-6},{"poly":13,"rotation":0},{"poly":13,"rotation":1}],"queries":[{"poly":9,"rotation":0},{"poly":10,"rotation":0},{"poly":11,"rotation":0},{"poly":12,"rotation":0},{"poly":12,"rotation":1},{"poly":13,"rotation":0},{"poly":13,"rotation":1},{"poly":12,"rotation":-6},{"poly":0,"rotation":0},{"poly":1,"rotation":0},{"poly":2,"rotation":0},{"poly":3,"rotation":0},{"poly":4,"rotation":0},{"poly":5,"rotation":0},{"poly":6,"rotation":0},{"poly":7,"rotation":0},{"poly":15,"rotation":0},{"poly":14,"rotation":0}],"quotient":{"chunk_degree":1,"numerator":{"DistributePowers":[[{"Sum":[{"Sum":[{"Sum":[{"Sum":[{"Sum":[{"Product":[{"Polynomial":{"poly":0,"rotation":0}},{"Polynomial":{"poly":9,"rotation":0}}]},{"Product":[{"Polynomial":{"poly":1,"rotation":0}},{"Polynomial":{"poly":10,"rotation":0}}]}]},{"Product":[{"Polynomial":{"poly":2,"rotation":0}},{"Polynomial":{"poly":11,"rotation":0}}]}]},{"Product":[{"Product":[{"Polynomial":{"poly":3,"rotation":0}},{"Polynomial":{"poly":9,"rotation":0}}]},{"Polynomial":{"poly":10,"rotation":0}}]}]},{"Polynomial":{"poly":4,"rotation":0}}]},{"Polynomial":{"poly":8,"rotation":0}}]},{"Product":[{"CommonPolynomial":{"Lagrange":0}},{"Sum":[{"Constant":"0100000000000000000000000000000000000000000000000000000000000000"},{"Negated":{"Polynomial":{"poly":12,"rotation":0}}}]}]},{"Product":[{"CommonPolynomial":{"Lagrange":-6}},{"Sum":[{"Product":[{"Polynomial":{"poly":13,"rotation":0}},{"Polynomial":{"poly":13,"rotation":0}}]},{"Negated":{"Polynomial":{"poly":13,"rotation":0}}}]}]},{"Product":[{"CommonPolynomial":{"Lagrange":0}},{"Sum":[{"Polynomial":{"poly":13,"rotation":0}},{"Negated":{"Polynomial":{"poly":12,"rotation":-6}}}]}]},{"Product":[{"Sum":[{"Sum":[{"Constant":"0100000000000000000000000000000000000000000000000000000000000000"},{"Negated":{"CommonPolynomial":{"Lagrange":-6}}}]},{"Negated":{"Sum":[{"Sum":[{"Sum":[{"Sum":[{"CommonPolynomial":{"Lagrange":-5}},{"CommonPolynomial":{"Lagrange":-4}}]},{"CommonPolynomial":{"Lagrange":-3}}]},{"CommonPolynomial":{"Lagrange":-2}}]},{"CommonPolynomial":{"Lagrange":-1}}]}}]},{"Sum":[{"Product":[{"Polynomial":{"poly":12,"rotation":1}},{"Product":[{"Sum":[{"Sum":[{"Polynomial":{"poly":9,"rotation":0}},{"Product":[{"Challenge":1},{"Polynomial":{"poly":5,"rotation":0}}]}]},{"Challenge":2}]},{"Sum":[{"Sum":[{"Polynomial":{"poly":10,"rotation":0}},{"Product":[{"Challenge":1},{"Polynomial":{"poly":6,"rotation":0}}]}]},{"Challenge":2}]}]}]},{"Negated":{"Product":[{"Polynomial":{"poly":12,"rotation":0}},{"Product":[{"Sum":[{"Sum":[{"Polynomial":{"poly":9,"rotation":0}},{"Product":[{"Product":[{"Challenge":1},{"Constant":"0100000000000000000000000000000000000000000000000000000000000000"}]},{"CommonPolynomial":"Identity"}]}]},{"Challenge":2}]},{"Sum":[{"Sum":[{"Polynomial":{"poly":10,"rotation":0}},{"Product":[{"Product":[{"Challenge":1},{"Constant":"a2e933e5bb560e87253f965e8e895f5b716ec8d4aa26ec64caf0c6226e6b2209"}]},{"CommonPolynomial":"Identity"}]}]},{"Challenge":2}]}]}]}}]}]},{"Product":[{"Sum":[{"Sum":[{"Constant":"0100000000000000000000000000000000000000000000000000000000000000"},{"Negated":{"CommonPolynomial":{"Lagrange":-6}}}]},{"Negated":{"Sum":[{"Sum":[{"Sum":[{"Sum":[{"CommonPolynomial":{"Lagrange":-5}},{"CommonPolynomial":{"Lagrange":-4}}]},{"CommonPolynomial":{"Lagrange":-3}}]},{"CommonPolynomial":{"Lagrange":-2}}]},{"CommonPolynomial":{"Lagrange":-1}}]}}]},{"Sum":[{"Product":[{"Polynomial":{"poly":13,"rotation":1}},{"Sum":[{"Sum":[{"Polynomial":{"poly":11,"rotation":0}},{"Product":[{"Challenge":1},{"Polynomial":{"poly":7,"rotation":0}}]}]},{"Challenge":2}]}]},{"Negated":{"Product":[{"Polynomial":{"poly":13,"rotation":0}},{"Sum":[{"Sum":[{"Polynomial":{"poly":11,"rotation":0}},{"Product":[{"Product":[{"Challenge":1},{"Constant":"2b3710dfba7d273c73bd81a2877b4211c2988f038160d1fe15e92fe8d460b313"}]},{"CommonPolynomial":"Identity"}]}]},{"Challenge":2}]}]}}]}]}],{"Challenge":3}]}},"transcript_initial_state":"987457789c1282d63dea5905b80ffee07a52b241d950e1cc1dfa0c3c905a220f","instance_committing_key":null,"linearization":null,"accumulator_indices":[]} \ No newline at end of file diff --git a/circuits/halo2_kzg_evm/circuit_data/sg2.json b/circuits/halo2_kzg_evm/circuit_data/sg2.json deleted file mode 100644 index 99d9ea4..0000000 --- a/circuits/halo2_kzg_evm/circuit_data/sg2.json +++ /dev/null @@ -1 +0,0 @@ -"a81f75d96ebbec08b9f1e8a9e43ac602260e5c72f09727e14d17857e62138311deb80fd49244ae5905cf4ce3e4477e9af6e17fd330216fde5375263bfdb47217" \ No newline at end of file diff --git a/circuits/plonky2/circuit_data/common_data.bin b/circuits/plonky2/circuit_data/common_data.bin deleted file mode 100644 index 746a3e2..0000000 Binary files a/circuits/plonky2/circuit_data/common_data.bin and /dev/null differ diff --git a/circuits/plonky2/circuit_data/proof.bin b/circuits/plonky2/circuit_data/proof.bin deleted file mode 100644 index 7513d0c..0000000 Binary files a/circuits/plonky2/circuit_data/proof.bin and /dev/null differ diff --git a/circuits/plonky2/circuit_data/verifier_only.bin b/circuits/plonky2/circuit_data/verifier_only.bin deleted file mode 100644 index 3860be3..0000000 Binary files a/circuits/plonky2/circuit_data/verifier_only.bin and /dev/null differ diff --git a/circuits/risc0/circuit_data/method_id.json b/circuits/risc0/circuit_data/method_id.json deleted file mode 100644 index 1759510..0000000 --- a/circuits/risc0/circuit_data/method_id.json +++ /dev/null @@ -1 +0,0 @@ -[3066276800,2588380153,4126938791,1020330500,4139102677,204678137,2235155291,2889800771] \ No newline at end of file diff --git a/circuits/risc0/circuit_data/receipt.bin b/circuits/risc0/circuit_data/receipt.bin deleted file mode 100644 index 0e62e5a..0000000 Binary files a/circuits/risc0/circuit_data/receipt.bin and /dev/null differ diff --git a/circuits/risc0/circuit_data/receipt.json b/circuits/risc0/circuit_data/receipt.json deleted file mode 100644 index e0b24f7..0000000 --- a/circuits/risc0/circuit_data/receipt.json +++ /dev/null @@ -1 +0,0 @@ -{"inner":{"Composite":{"segments":[{"seal":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1476394565,536870876,536870844,0,402652653,2013265825,1744830051,268435326,268434942,2013265377,2013265441,1073741560,1342177046,536870748,939523753,134217199,1342177110,1207959047,1342177238,536870716,1610612692,1879048146,805305850,1744830211,536870908,402653069,671088427,1476394821,402653005,1073741464,1879048146,1476394661,1476394693,1073741336,1879048178,1744829955,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134217679,1879048050,939523977,134217711,1342177142,1610612276,805306330,805306362,1476394725,671088139,268435006,2013265729,536870684,2013265569,1744830115,402652813,1207959367,402653101,1879047922,805306106,268435134,402653165,805306010,1207959335,2013265601,2013265761,1476394469,1879047730,671088619,134217231,268434974,1342177174,16,681455156,649568080,1713259102,1067191144,331192678,1719414150,550856080,1182198245,1276228203,149706043,1887420310,1043583812,640309094,756426791,1786033312,1062354297,105839343,1504181063,78084238,757915103,1903695047,378317649,1841838176,664032287,910039656,632984524,632667458,966509988,1331434271,816395739,1144736579,1726156628,1926096469,1924509865,752758055,1069244972,70309612,763571114,1039501859,1464859915,1544721024,559599799,1806192616,612093464,573760973,969107511,587989460,363262512,1505972616,57834548,12112187,379058277,705001441,118388368,1119922110,1081331210,1034556927,1214602558,5660461,1431181282,2182257,1961821712,486610685,23167662,1908471435,1627128515,97184130,5175144,1004686726,952567688,806161819,1733041385,381062813,487808342,752686654,986864154,822746074,1780550061,674233061,666604795,1233507641,1044350280,1262486389,427721706,605122289,1816590687,863168638,203280223,1313658803,1465362722,1002953965,194151809,751117772,889420187,1443405864,901535897,214628233,251193345,886879063,1663932452,1991363666,1176984491,1278845516,861259639,1202179040,158446664,780044550,518485802,698343847,1364024021,111978254,939190107,1372397601,375347637,1730241351,830163930,643029130,1103944149,1095563092,1409113006,1558910969,1106210666,1211337686,1003181266,272842971,949804737,1479854787,365336374,1068073168,780984501,918990271,1769488586,919670074,24282076,267542970,838183629,674592978,1556758477,1788184441,951136863,1397759683,184420881,1551898109,1533790081,226614606,1769530393,1438202810,1672782659,1700468313,689764016,576622837,1543220074,1534465223,25572062,95274471,299018027,1629720589,190863075,1890080163,309332524,581094444,580230200,947482941,1493764093,1801469130,1042999139,25542963,2000596909,1429706467,1341268450,373072530,1468499394,191869682,794874154,1063684498,870342101,36432135,1439816884,1614548320,240999760,1186859974,361880767,95485638,1098633005,1668400843,1570131458,386079135,633697108,1346795619,1860610310,1863397072,473270656,468445078,1479902039,46643708,1505969740,1718205741,341543512,1559525388,586046331,224905108,948440202,143563838,1964154516,84226257,651232632,629062595,1303164044,3506373,960231771,2007287364,667895652,912465112,177063117,965504000,1917407037,662066506,782519146,1315117531,645796225,1372403338,356934370,889185839,187851919,5536299,54187003,214311992,1406362726,1335582610,554381844,1331307398,979324349,1582455740,47990500,982008282,802501410,100927375,381873175,730071014,1425076414,813527177,60388002,529443054,1997587405,426670300,756286698,1255803916,1996925980,1939587636,1774733448,1341081255,1404468372,1662213983,468665627,1600566571,1386320698,66903641,999263756,1195552310,387959303,1553250247,136763777,871259753,532992917,580879420,1127553084,1474963210,1210974267,1941217614,1724338981,978616875,381239903,915877645,1449503454,173990551,1668692912,1603080874,173449081,1574586192,622158726,1114570129,135172659,1329864683,347728606,946992356,1009111186,819087426,413818606,1129534712,281129280,255469933,302305201,986415779,284456522,281169143,135623605,1990001406,869735335,506694426,407938447,129307683,1763185240,1428445626,329160416,1524610636,1019602143,833910392,1785849207,890822150,503921145,1659582636,1123665720,1397720908,51784609,1464742768,466099321,651981364,1457723211,1914149111,1661184609,224471388,1623006609,1649823932,1229440369,638852307,587891377,707643669,1308124324,432129363,1526685997,115596356,1901287075,895429851,1434860910,947014988,666734671,454012573,1121268086,144768528,596000720,1895926201,580005564,1282519949,623394169,1827136420,679543364,311629680,367314766,132208421,177234223,1708047400,1279253999,1848571349,557025560,691160427,1704782759,151112093,1499453031,1514924021,1684552649,1388646127,571955664,1036890075,829553872,1571518359,809383486,822751949,560739969,1741494128,266994373,1627837423,1580323033,109297727,1563220532,1480853412,1791134210,199286795,741744365,1531047998,786367884,1969786326,349697185,919492218,1567478996,1397167453,546116649,219378809,54699603,445288848,229403623,231179851,1206431239,241223459,458824672,1606765138,1192199725,18089931,535887645,461494014,577072420,839432916,426140432,93849715,1731956082,531288573,287349556,1848204832,948216898,1825313699,1394864833,181544513,1958880131,299539522,1823935383,830125453,673976250,53176783,646359454,274239287,146061263,235287042,85565154,1267319631,800763691,719553221,638435786,561368173,228115848,265121585,1011942739,747284106,1367765128,1400245679,967106078,119448128,717625965,1061876920,1277628910,384286472,902995820,393092752,507377669,112871885,591473890,162550573,474136671,502763488,1279904626,1136521751,710199082,26546268,1472131048,442262745,1203338977,1602945179,1949930487,41996943,178141305,937195491,1017794466,1122265341,1671727313,1912755107,912766713,29503451,1948094434,288200902,430936694,635234199,880901992,228901204,436726116,974291437,1258460158,850156285,1890574089,476223421,75899490,641221722,114136013,1096874105,1615229557,870511068,874317611,1717073627,434200815,547611557,686773689,1180305545,1674774720,738474894,1751970803,871226575,1617589770,670283563,1297167722,29303811,271669053,242307733,537493812,643709165,1331527109,1023798140,21285762,56467269,1191052249,1237915362,727397983,1247730689,1093528413,131271398,481047202,293706362,1993838787,329281976,1321165798,1631530886,1384376867,845708907,1010366162,485627572,1889067675,157488086,1416692463,1785925579,1979642206,1226294021,986005047,1271252990,334400383,733572546,1336621115,102694625,1427520876,1364101694,1675788004,418643535,1879942319,272145483,568347313,881851036,1841941384,717614053,326463461,674588186,1594078481,1107252023,561409173,689466564,776505966,1035170968,830234770,789344649,1787433564,441119532,2011381765,1752265419,1753430397,823080417,664743644,144943441,882997140,1315720455,1755698614,652562101,835407968,1019057738,1461977940,577557972,191066728,980466580,1744543115,1433853800,1837563622,2226791,894729438,669941476,378960565,1279355569,1118450632,1545733874,1313776519,86041035,649830891,599390765,242323307,945544180,1761434898,407174144,428950031,1588297209,867041068,1610028696,138884781,1308843664,1040794497,242864669,343674528,758836253,26066893,1663834382,701955918,45891080,1910024860,527571070,340362292,1042495872,1616431708,683745538,5941312,1657455585,1479060836,621460886,799966413,1263975503,1807040517,1789976342,708569446,1520919098,428141352,529198417,657984036,1057719049,801662348,1030309173,148555924,1314697507,694814499,141139976,773050343,1649759460,1991411023,258000295,1150211125,61495707,1876755685,1868135840,1963370288,749883575,1140332285,1736963156,1057093575,1866386741,790034033,1826883282,865553130,395629832,41762494,868975848,60632580,1956041046,382777733,1586326160,1976755358,271956797,1212476537,153112708,1050322,1801223245,1809023389,530491530,732620185,1556986725,1202926693,697070604,1282511756,45102183,732438635,1628137593,1667874461,842638951,395941883,1549269213,719896822,816948969,1570999830,1406546899,901262559,912399322,136622861,324878470,546032596,953489483,1231345218,1915649027,4059419,1282741361,346475859,745742644,156145929,1424036258,1948879530,91075140,732566159,1501158985,639621650,214908444,1689183066,1329134468,1789972350,1947861301,1488957788,550079177,242686635,984375563,562890180,1941895062,1845653080,1795725977,786772591,1285032625,69333286,1635815451,1323708703,1509276178,566976408,1911530772,622173793,1063443416,1777730138,208883771,1659752425,1146710932,119238645,1580189974,1979764753,871991325,273975158,1327219483,1862214971,1323239439,372804808,1104877701,42500352,307525548,1173242609,1360521599,871116234,1530693449,923341657,1796815558,166643482,928664317,1120558492,1144685689,1985452905,173565648,406861315,1863196422,1827951036,1633107169,1869579504,1771006332,187151262,1953059531,283921630,1517074189,1489053351,782497149,634902256,769433814,2003500088,763293058,1081447848,118818375,830429745,187205945,526616901,513917256,1352736354,1987492446,1466752963,1199675270,1842838715,1280993893,1271817500,625859846,1005547299,311047623,1171818760,1391884878,1251491652,1747567258,1161509915,257846303,428148498,356861446,278756618,211458279,1449101184,114765774,936490249,1007806970,1582251355,962691300,671561569,1948264030,1780642135,213778004,772155287,637032860,16634501,1605844480,744767560,794704007,733241612,1442937494,366188461,1789274785,1647052757,1258749617,1709212329,1171591278,1498585117,397911331,388130046,392544975,1281701283,1834672669,1195840719,1418686597,1398574142,344346879,166374756,1951533142,139068877,236735266,1085186059,268064422,976424179,1126089519,908763750,1215180380,1404492847,1956340872,1804803114,16990724,855316462,1163417552,1224184303,472129845,1797384362,1216022258,383883090,441400509,1489925105,1761623574,455077467,1561581010,1355775098,402781478,1420885700,476103710,756601536,1669846806,526387035,1865691723,1010448631,236216988,585743090,2503492,979061285,2009230868,1569969817,1357859958,1350304700,1308305190,863580175,809137322,1089294668,244813698,1041792727,830994351,352054894,1826711125,1873647136,1184337443,679664946,1635631403,347883693,1137488936,1604590570,1792281496,614177840,1884392052,1114229969,310434163,249910612,225415888,1107758912,1815395006,1619970346,193229578,141032940,23533523,1963998108,1781652724,1425504350,495936915,85922417,1252644993,240222739,168392960,1578686380,1973943218,1231553103,59883408,25163314,191581537,1406402027,662322648,1876248012,1618727313,775279581,2001248238,1870812560,1918536516,786391062,1936094047,1410463773,1317901807,1284745248,872557850,418348834,659517202,156125386,653317773,1128480804,1800320194,305590457,224947131,732937818,1046367995,1324597863,1481390769,956119938,1742654262,306519579,1666583500,817660014,275263793,13849120,1462392642,358270976,277001678,1634343633,943792373,1920807593,934921119,1922990305,1902742531,1291817603,1322582816,1394468264,1372687766,605628708,436440296,1945267542,391930915,1475862709,1303698788,1222477681,1676277761,1227002517,1697723565,45962512,1164748617,1391056936,1225998066,1593695044,385085035,480527695,1364260966,198122242,752382470,1367744500,935587968,668139563,1927474393,1905397671,1501272345,404475646,1346777810,498800413,1339266215,227117345,172047814,476658081,403095925,1513424340,7725215,1391847107,1741260695,1641460754,330784887,1423529271,154251106,1600728654,2005112210,1750947258,1152228600,454153731,1246986083,1060778817,1691250201,758930825,655174527,251718641,437153984,552992541,104884623,1299198009,1018907948,130358055,279382281,822812393,1884536195,1900880619,829743536,144764569,675237297,94371689,1429388868,335964566,1717520419,299345663,795222417,696452434,1850521091,1243879949,1687488093,1043095428,1340750241,1994843773,1096847550,706008418,963342191,1444019888,1713636814,912067413,1664853861,1110102475,1728889565,695934746,1418013761,841618911,74323720,394434249,1889869215,306771561,1335556622,13611876,2000246610,1118057823,21760550,1826971255,845105006,1747627729,496984816,1872214484,1351738894,1220087496,1839558081,1688295980,1280237182,773208922,1179801244,806396445,321147243,792579002,1947703750,1515321113,1516598658,228607428,583414372,1116194844,299303240,1327842700,832051538,387586183,173716939,1771777042,723025206,1650714162,798409713,919712513,1593031094,903081354,1374605240,50500354,1118765781,1450029337,481909928,1158410067,1489792246,710323472,1159360732,1468208522,360799059,269163873,84159559,612141579,1065466495,639782995,432003460,941678721,444508422,1248937235,1054575907,1652700109,24345946,193666789,843929986,68075337,16181628,984017757,1573580915,1849081774,1142579534,623699519,814337094,31974496,1440169801,325951729,1745724279,1969556941,855697987,470623885,320374939,3582582,555540576,1318281899,1627104141,1261639515,121733772,1648275417,401869892,1685702090,605731416,1128951884,871916406,1893569485,371220360,1526151288,265811941,1711467398,1164282501,1182596745,1137624295,1830756163,2008765650,1345656561,755023936,1866999744,1326007926,1453233593,1144728991,1070170523,1628248696,22365634,1249232637,782767266,1890978368,904115416,1159875419,284751972,567021269,1719027957,208616990,506916849,1868835276,890781711,633722266,825816335,539519344,674199924,2001661550,1113793517,1470631115,432486975,1435981920,671047990,532033472,744581535,262174388,123720099,1317002741,763416566,1300443794,1308538244,1419005909,1092853515,88707661,1501264795,1423903842,115633601,511177241,1045084330,477970668,179253153,1519316117,669261118,1361548522,83587101,1291678954,453530394,1288290710,498493905,1419838402,124592694,31429433,1342900939,584502518,497084862,560102329,1454375854,669730873,126800334,291260184,1829422693,838385242,129573225,1339451984,498983727,1183894548,1262721994,518590366,1231589361,918058931,1132686377,1905329371,1297869305,1030560203,1413396453,1572949853,465885613,184416904,837057980,1970575485,249258167,1500246969,1445763505,1754282970,1325833395,1504940405,923190366,295613424,1913545559,1253594518,253496306,1261188095,800686743,1306746783,1950912918,670227407,470986373,1789576162,1350426208,503073454,6578474,1635114894,1861681546,585197674,1275776226,1204707978,194226976,1117548910,1215927311,323024040,709673810,717696172,1051780164,504426197,1548576052,1568565630,1950923067,1083078671,1510873286,31767048,1772625794,1736794052,1208111227,1558052576,1603757701,1140512178,590289606,1595784050,1860212673,711461076,1741239469,393042371,480364846,1044838842,1922249773,1676911967,1233093576,245739613,705199785,1386292703,1163542190,997732363,1873735941,595845063,1077754409,1855057779,787229101,1197072910,1077052627,576577979,1377726338,1122796533,767964371,397817089,479298021,844163750,1704531138,151078572,1070100412,1434057471,1622682205,1971066268,610619876,1531161685,856633841,1208901732,62342692,1877074298,544201390,1114251880,1167891674,70784603,622190011,660679108,1751319899,1576422869,2003811486,306260244,1186342580,673466187,1716404901,633731767,1523406790,1948338731,1288494258,1161653213,1010753191,996877712,904255423,812993933,1003990407,420023263,736228914,1896936987,1480494690,1837291430,1931095237,1841731418,1385058630,1276481572,1701551796,1008341412,884937128,221932275,1782931996,98368844,158480609,326952320,1882567073,1065622934,1050475566,921276875,298170931,449149681,489119951,671211796,115463133,948097966,1929113733,664953409,189310022,1198985641,59459248,1205610631,1101801345,1412046398,1695494152,1150967194,365120896,1361911194,541662795,1033044012,1506358022,1532788216,304414540,49070810,854782603,959490376,919203227,1337021547,823158089,1577261702,605302401,582969104,208401438,1551601327,611272924,1119608035,1538794958,1944146833,1295964035,732837626,1495815092,1225027706,507772243,1080987014,1203236092,437204616,1138630631,785203190,1817211414,240194215,1287366934,1229874955,1302897054,1429777065,939968504,1482016008,1341643708,1294937915,238104658,1614376943,459048028,1607971286,1643704811,778466952,84287691,1285991243,63710421,16742158,811955744,534414153,1923823533,1229221240,197429980,140196628,1087111617,733405901,335827541,519747567,1414803890,1666431405,1176519965,438300486,848717717,370508956,1214580331,1440567119,1378339205,1219676142,395257810,1816960095,554283470,173804037,1022979457,1849013285,281948127,1344054477,1060001158,232588048,640250588,114304943,1433197630,1786734130,619976655,68548837,1997968186,1680310217,256189504,1742549842,437028837,488469204,909533777,304379329,1070422650,1012788917,249156112,145327387,1454880491,325412195,1603796788,1465710098,1923141862,329401721,1367992744,174823487,1068845397,518153268,509843078,341378071,460073739,1327720816,377245804,1777677688,364893145,1135558538,1826633604,1967622820,1947393898,1646585505,14536067,798940794,1841931034,1035143263,360539339,440805902,526141135,1548017974,512617368,1061135328,29963705,1451838689,1351990678,2001409775,1798716470,632927605,772852576,1378939869,1863988662,452975617,793404440,1663527635,1627919243,690671906,1414997014,1303086022,1961415126,1819743578,336444977,727604051,432086154,934589453,1397665318,873143104,124874389,134656665,196573004,1556800404,1165724201,661574486,347620983,681361400,1904091284,1734124860,1556707615,101609692,364225639,440710633,1813823026,889293225,1298803574,855471295,1446373389,306907991,349829053,1670265114,1341583422,1310165588,1707110437,1035202234,1077115434,732973637,1953596905,1010769372,1200382885,938608329,1479641599,755493181,778260595,1746177589,1090041136,1914752585,673146674,1139817703,1926682217,1545115789,301594769,1761347481,608672744,65266146,1565241011,1203508337,1271521839,1966227478,1231705608,1827219016,276407179,33869526,1913782656,1980544520,1682136729,1745822331,137999593,410270460,1322466416,1864289714,277551811,923752276,991077736,1780399106,542764188,1615788327,130386182,680481690,483373677,1219837753,416835547,620760680,1282095162,709637768,885596915,805580038,1755750582,1023923325,545338362,2009993983,627685229,576675446,1250386644,944817144,1612044867,1074019068,1858833558,1133123182,1919557329,801254831,1067302861,194483606,321391894,363761126,835330521,1180633792,1756176387,333885368,338132971,581751178,1465455669,454565985,811033227,1836440622,352463900,1362839153,1894216659,561674668,1400928690,914580569,858355,454420997,229168334,776673769,1228435046,1232620838,847690336,1682923412,1523437943,202535887,955589371,277417048,308207065,1054761217,1497341919,439749323,799578282,323788556,925408146,57005217,1765588042,1173403104,1707086464,78948304,494723472,1047579435,1978197195,1949569795,1257762262,1726574189,1161118791,1878988865,766849247,1830814304,282977928,170182722,368861895,1641028429,443686200,1620046436,758202775,793218395,1714642029,188161971,46103317,479075627,927370415,1891456193,1630645965,791660036,407777152,1560044291,1935326248,1985565587,1008270930,1421935235,927713999,490932688,1471585283,1174248918,878889172,152904970,245727449,1812252272,1174938910,1404374973,1058796422,1904846703,852442145,1065232160,607455556,160823140,808499982,1353765966,551047564,267482446,1102811036,300114561,866484813,1026327825,1624485560,1262045177,1135558790,1291555597,210513203,1248451901,1368618705,412103604,892313051,514694463,1606354192,556952584,1462819659,61247023,1691800781,336150871,181594678,351375984,1972857607,77165361,925350276,25789231,725132465,1266227286,1132986604,1346959521,761765276,1239826332,1552441016,1025934717,1897639239,127175133,577786682,1686620074,21057828,451611710,1297917336,1623490156,1570860336,1021438598,574733152,841825697,1419024636,1878344116,189605119,652828801,563195394,1270339325,1781107175,819321542,92777906,1905723758,863659672,308514204,570727201,1450165741,277262555,1392527216,1340225111,1592955066,1150624734,620664496,1872530771,1840257054,317880673,1779599377,894317540,724949187,1354536399,303172160,700329282,1512907607,796234606,236886442,421472760,1968270553,1142052195,1179148751,564229290,939127608,86937097,1203191485,740513956,457872743,295675197,246566586,329577725,1156660951,230502886,16579213,893583964,348939138,222965857,984183558,1926784564,15224078,1654655927,1120508540,1124660557,1404163337,409436731,536161839,892875556,1510887516,1703152592,662416573,1125038202,1625078697,946636122,1414605632,1938080562,466216693,121652988,870141590,1574944388,1989899404,1018324710,1409100192,1367020276,1417682857,465171474,1418579078,1658386454,1173733875,1958742979,1431924563,1364585864,549373088,402388145,1969139642,1657563039,1902565506,64881205,784519244,86219285,1906045123,1367889806,1767966915,663530308,1576288136,133430411,630067871,698669277,349690716,1043826625,411562724,1039164642,1196253397,868868333,271011759,437608818,1375760797,1537811665,478595457,1840140979,1139114775,811751193,35916092,1667392220,1526351299,1472281826,1585120235,1542201614,1699625806,467055844,637262776,282890848,754571766,733583525,1266886800,684584332,185133906,355228149,671574455,906121859,1133350185,640719711,128101459,880723567,775533159,1721869974,1935029300,1454430055,856195340,441974686,1307939455,128673813,1061034991,1700534623,1568144006,1034288056,1643789999,1347330130,1300156987,697108206,898730812,971556048,1247557978,900560605,1284424678,1596165940,1435393681,251875660,1595514875,1722036453,2008205457,1316320903,1133258939,107133112,1992726991,1604760409,1392624095,1635335770,1138424019,1957607096,1505561294,939586601,1888625777,1470860663,1577370262,1980226845,1902427745,1968858098,934414044,153478072,1571039995,428475480,1330580637,844466065,1780665254,1129075803,1780184589,645048682,1788423239,722145353,813960705,66045694,480715790,730026267,275473668,1685691731,1290758806,343551393,1383239284,619754408,1204854730,774777888,1761650222,887721105,1015771360,1339653623,1880732555,529225437,152592879,1000137314,856331366,303339697,680997156,1750306010,1332558856,1182644323,1074576196,90899269,1178580244,608871154,1200312931,1571313231,1278404866,321581723,33959916,1348084590,140045093,181750424,1319186877,1378828518,1862181904,1449540600,689148271,1192745093,1495884155,1036741516,1504722620,410994686,1983385312,1736758109,1638661420,1345782956,1899497303,1315658283,1812330251,524188138,52142219,863806328,1889074298,48481646,448086360,1298154920,425722862,1718084482,395275190,239599485,1579669487,1059101634,758605169,1256750735,195706212,1018129570,1962589607,774405103,1893501173,1449755269,1425055241,1522429179,1690874600,176982865,635207185,1013976800,251635801,1524024201,1724865722,1663531307,1685681978,1441933560,126936159,1276256024,664823850,421146839,72290197,262009870,1805670156,1604860979,1998637007,825051030,341774872,1486335909,1611190278,1090431365,696884492,759337603,935157655,1619335143,1922197863,3727621,770077987,937164712,1979630248,1675354396,1107684893,115314612,1632263852,672807056,1483536235,1446001943,649905641,103950597,2008055518,824901409,1567682293,1652975307,1151321890,408267659,1111231865,1482656341,843897055,144043602,93184631,1857249267,1837324927,1323756658,1890300464,1504120903,1004479826,1399510332,1581268165,1901102780,1779035861,1516573763,884629501,1299777340,1897735789,1325017918,1203512378,124753685,899054395,173007484,1130936413,520598449,972319488,549284126,784796784,1918790034,1509096045,1548067736,759172859,607884697,1727107575,1607416785,1057778679,589195423,1573554120,1763512391,209005864,1156382792,476219388,1794268919,801891146,1310296453,1156605903,2007148231,659827673,1181888675,1856528559,258541039,1950076784,23202137,713274125,1673424614,517013356,1670558108,1299095699,14708709,310841044,931257978,400159662,1399651283,618579934,375522806,164654978,419490672,195043001,958295868,947969099,987275287,332545871,1305399079,1910390020,559003050,455956690,601295060,1049034330,512171207,1146749218,223165500,658164872,69198954,858950555,1489154679,411804209,540488219,1353314348,265912146,528041841,1973127237,858950555,1489154679,411804209,540488219,1353314348,265912146,528041841,1973127237,858950555,1489154679,411804209,540488219,1353314348,265912146,528041841,1973127237,334497849,424067538,1872266518,1444221558,1561294534,795150254,717042803,733585437,1069051947,783882665,455779999,1874737969,1828066048,244695590,531727474,473850400,1920668121,1887075105,964804345,1485222928,477147897,687436774,1487915220,1479752287,497025175,916139050,1793703273,859552600,111329844,1505280853,1139116102,202640746,671448478,1140674827,739274654,886510836,308767758,1807623326,1683411932,989526663,1674752781,373543823,1071164334,1367961997,32649929,1206968864,978583083,1490663034,287298817,997889520,1674721728,1066652862,1802181764,990303332,1644933349,785031517,1736775468,1558078793,1665028439,970572217,1704515614,1624701536,557310219,1592795269,1912683308,148746242,792872363,2012020666,900068216,575605802,859538600,1510385711,336540743,1920034621,1186517536,424136607,766856588,604920739,1199584029,1286318078,1200478027,1894731705,1803529185,1581048801,1875578251,864021465,1866325113,1990368173,51875154,1672432260,1459111076,7691878,1746285212,1919083047,307606683,588820093,816646648,1182817754,800131779,1255836372,1068495230,1295451655,56477322,1396290812,1952273258,1917097327,797573450,1548791704,974811391,977590736,1339097737,1630855098,1988733180,353631601,256466117,1395790764,1838867667,1920237672,795567094,2007096139,1716988849,1684559246,1906293820,1016582012,644453830,1576603107,1207764195,981138033,1319049834,64717219,303915310,1411302911,671755328,55752558,1962539492,50065171,1062016245,559154966,1430668694,1046865248,582628826,512501365,1071293598,1042108836,1431240004,1365495455,1704268053,1305916623,1719262712,563619790,38529029,1624322431,678693348,333138400,1165738368,525896799,334154839,1285447929,1140501879,900045680,1576128741,830689374,1064146116,1194131177,1389832278,1761106346,592671147,595079731,1631863452,198452584,406930756,557757079,768574386,1227780163,30468749,1816293087,1350816483,106022100,286759647,1892324937,1726726796,1836540450,1865243122,676038972,525501985,1350484727,443774247,181224198,1898185302,299355887,568258734,1617131995,207622959,1212772839,424383545,638733643,1647173712,924659803,1881520411,1350772424,313344691,1280566016,1043248216,588904394,1804218198,1550226536,1646327056,1482008503,427279704,1255623370,760725660,1003265507,2000672662,437913999,280784093,1902660794,1338876449,90350600,604627475,602993748,814283161,1578985924,1867621827,1181106662,885768572,1088866592,1724689156,606020160,757657118,336004975,508007632,37532733,1614423029,195444674,1204920249,289138968,1058657608,1849402042,1709823962,1067703434,1949787554,467131447,1210859728,1258986617,919013508,382269085,194121815,145549921,870065299,326203758,1403248439,1802652495,1980838086,1501639023,1927536307,556940879,1862767438,977091108,1169785241,1636223978,384409963,617945458,1402911418,120658984,1239177287,153434282,1626852839,1119759264,596637295,1914262143,1452035878,704573954,1314877317,1555189599,634547151,1339289286,1688779745,311193521,1658392086,1264894083,1252980654,921114511,319825729,419937504,450746128,1894613872,1880797563,1438708968,1624360996,93707306,895138946,351660806,1265440367,1275069015,279460286,485495793,1721619568,1945135686,1106308025,74890936,1929811576,325136618,483481438,1305571521,1911482387,607034108,1069972278,244092590,1630353594,1553546357,405863595,1798777159,3383952,929471421,1270584461,922083911,720315370,615590597,1865517418,1798699005,1843572190,1138029524,107686272,499539634,658394482,54095001,1272376534,429437800,866602662,1590294608,1811192564,1562167311,586298814,534501668,558341016,1744762801,1089813007,1049319574,1717750410,1719550109,67530666,1298470075,1892626893,1013077260,1466643054,460386801,345160206,1965971781,993612354,97355834,1613488163,1862602515,815042889,946293656,1972682525,470260487,610130843,716906116,1165438036,324324750,1903209423,355855009,1732318881,1226972960,166226728,491590599,1821748943,119289983,897221745,1851665955,1546113027,1656419923,18204481,756335446,1302301882,1882280838,194812978,1061352783,561277536,745027115,268323999,657361661,111766413,1740900738,237188403,928855,382580278,1764877284,506254748,1444914610,814190195,661066785,483699933,126814824,330106884,1368448214,1583608738,943406071,78476935,1835290768,612624127,1050800869,1044211556,305588668,329143269,604722531,1712617690,597917963,265845172,1176858325,928784793,145499724,1873896293,346166201,1121544592,336080491,622337075,1958718562,1563650212,744550434,724416297,1481793016,1683374147,1383468179,1947839702,1065983859,41974968,620957083,449326799,782863564,785093849,1459802852,909367853,1268123045,1841412209,528699047,440958815,569372492,1664207354,1537930659,279575168,1360753865,1937687537,1157692515,1479139574,1738805294,378962723,1381157970,459475738,395607245,338599460,1499315682,628432696,907722264,488564441,1517204133,263516920,1140805115,896959192,1325982191,318672643,371724231,1259896268,56192539,430865244,775273190,322124593,1694786383,1525284615,1391118500,515829585,1176811165,1276167681,1691120310,1314815733,169351829,1488780628,1346818322,1198789150,1305756462,1439587926,854873648,837171458,381036865,556600118,498772947,1415036101,1830273662,1950645714,11439619,304207420,527314343,76173537,1184462732,274294565,1181541049,317635206,536282308,1377917489,1662125446,203132651,1864616075,1750944386,1745154018,1740845691,1586320267,1187846705,484493981,469640083,1428289192,1523325057,237110336,1313952657,625045306,975766357,231614275,217966956,1976084643,1475145923,1620183130,1559999930,391610851,1063427599,1799274402,2001651398,1128397378,669910125,655086221,1248182988,382432985,1881799551,1702284268,1448725879,1464811926,407083165,864916426,137535345,1611126701,203944194,1726292568,1718555149,1792358101,1519493612,937673759,1313216425,129746383,1409283225,1564661903,1258594719,1655697636,1534194551,1270524073,1366751321,264985046,945075012,1638533945,1035265478,1890433625,292135640,1031541801,1385455858,242911942,438594684,1451182648,416607935,1223565483,1873969380,344878800,136847540,1650782184,1220236215,1606338085,1426949936,500406555,609060859,1495502447,796771473,234908491,31891188,754751668,1522709749,1872923485,1771299748,1737043272,2001148715,1440476321,1893785918,1679379551,534188791,1410418659,1688614002,1360895260,397452938,1419127113,1354800009,1315330079,1449532295,828015070,1177198557,720235618,1266356396,332303459,831019927,521323816,1595654615,187624217,916240825,1996543827,285655661,1868016076,1567224060,1325937823,1896997084,1065580926,311965896,240204595,110200808,1668476389,625776740,568652876,1258113241,1960636987,52248483,747568404,1109247334,1746377945,939455613,736169684,420297741,1157785066,1363430630,1521832269,1777696308,182014172,104885464,1781224529,533369206,1492156537,610222913,1668820126,967466747,459606758,2003386340,225256615,500047322,1946332108,951066161,1525803600,3365642,1359723295,1478986276,72697719,1069825503,294570320,761522741,483818599,1330908498,1848024705,942382614,532680135,87617206,841160000,1945387246,751606009,1618110192,83548215,390750840,540963101,149859962,757684148,615796698,1688324176,1100267403,947767497,1655490662,879037394,319443275,227492550,206122886,1773670092,1051747471,70820204,271463393,1135601903,1636408369,978794103,1004937845,1854350329,565646847,1306710017,1826862580,1070634604,1763939144,2007471400,1023397832,685035353,1177554560,212208378,219580997,1991813265,1741691850,1790866144,470508985,1461722123,1604722439,1347773164,393377514,1353772096,36743277,33746577,1967743806,913210927,882947979,48532741,155412014,304137949,558997447,878946994,597350407,337122644,1577870265,403146037,1413715009,1724397816,491619325,1686426591,1747275286,493447955,527162991,48055662,1631260193,217812893,72894499,1298038990,1050905704,112095873,489115702,57603686,1220320987,1705610499,1390468328,1761594720,1341938856,1119657845,960434025,394192323,865077739,1770495486,43912512,199728643,56076332,1454781632,314029785,848123518,252919299,204280875,1082391900,387495880,1384034732,3052346,1116957892,754521135,1963174532,1140339858,1164894056,1506010913,810489584,1623348359,264688976,425078653,1312558637,1593170441,587468466,341204421,1445303055,1604999966,240386472,1873622274,1756804211,275208356,585649510,1440053313,1050358902,799342769,77400273,832963064,821694797,49749386,997247312,1213381990,148370057,1127599071,1054574735,1712988940,511713810,1979153972,1953045528,1473086090,517970762,1790505441,629246697,514973645,77175710,564925797,83673244,405001792,517423889,1134695548,126034029,305389883,825601984,851571040,717404050,436509514,1559457834,1151148022,209614034,509745273,1260217208,900752442,1838621501,1830408869,1902418504,1323814509,1078835606,1662828407,901799264,1475863526,234964634,1520093693,198148141,1212894008,94581895,148748926,1573316542,1540372928,1450229121,1297516669,846545444,1818237284,1178566700,560057186,1848331334,1391482845,1774374607,677827731,982507162,1639728490,4855091,1308210862,1028360989,1356877152,604005590,308677017,265316884,24497460,1823666382,836056638,143016278,1863114570,376175150,699144782,98196124,1663124998,1610186416,667882100,844720851,1563558816,317086894,920822102,1239129616,1733168395,661052777,1147947953,1585674644,1186303789,898030629,1012456147,1137575878,629118482,1368757704,1650772645,100704544,435795152,1112384334,1371857364,1150699859,1359788496,1081751482,6546166,3878746,1110841397,1885170809,1837756895,828755760,1399088893,64216889,1769976429,14350597,499631006,335079052,1808842590,380836581,1863032927,737085292,373030275,1280715816,993734657,1980704119,69895993,1467790833,893032941,835291980,1922551115,783065063,1654192039,1998374414,883640564,434340672,872069624,1516748017,1557868307,1292884736,1944935257,1358325996,1663428360,1938063535,1107632701,638516694,4738220,940294045,1796322727,1353814057,1460625307,875129690,512481743,106685588,103806221,1302923869,101006120,1936931209,172566971,2736737,1866351028,937093515,959829479,525244200,1997922681,764113810,1731953861,1085306227,1773882420,1211918525,493899410,95182842,1061197658,1120399055,81610989,283734977,764719888,1081834080,190645266,1710456630,1178813411,1013947687,378672065,1472073422,3015833,619324461,32282639,942085083,508284406,1362675442,1327653792,289232462,1688527688,686505965,699335769,595439004,889707775,850960011,555941415,546366841,241652902,1257715444,1900999224,1458223104,1482554218,364357756,1798198799,1263340040,605306433,613984037,9975513,431819149,1505707931,1805622105,934566632,724699298,1741789926,1248881739,1902395145,1969950423,897326230,1773083519,398516474,1343303693,1478164197,1900069234,455959657,1194176874,929753153,462089136,360635079,394957504,1338192397,1618457557,931380762,1457610635,452905395,537476547,47760584,1229838730,1118241946,396333946,28705910,439977751,1138007897,1791141572,584170146,622543659,784613341,851344478,374254383,991791617,207376882,1949644181,921124217,1512533688,105129337,38955296,983655289,631430960,436932089,1860032343,807060695,620947659,198301793,1251274350,1697481036,174952814,1484351327,1666651605,512753644,808186773,120892144,1409905273,1560065184,1333475161,1644207220,854044885,1323743756,446023717,1332781612,1560816910,100183046,1379910742,1433230983,1306534519,1829342883,1699470190,258709509,1952599659,783934634,1906266520,730253123,1838214509,1715606287,497929829,1445493002,329103662,261695874,768929329,779540781,326351373,37500,979377450,878639280,142166101,1786826821,1136480454,1944493145,1336925146,996886823,1182567230,1318270167,1293367469,1461805392,70351386,1202534993,1175896626,1068515819,1793608363,1002411934,438667953,1211815310,1583303152,501921185,1452753587,1714055920,671540301,464012548,133550625,1195984572,1369040570,1443154999,994270462,927000250,75039260,1959632889,1959921440,1750046990,1676685022,1784507734,1267412969,123075831,727385443,1394844312,628231078,594287366,484249242,720611884,521577108,203405482,688532501,1107501099,606906745,43533377,1875893724,853669748,1516640690,531099787,1270539644,1281974072,1034225877,481979478,1545483030,800113926,465994250,781124760,49539278,1571836074,96763037,432888717,620890458,1868951673,1465529394,1607785074,1329460426,1061862176,1895977617,1576089956,306434912,1922513841,662989214,1675545669,799922489,612422638,1434699417,1265601320,643712065,1767789087,713831633,468573909,1625369184,1189338145,721258856,867185472,430684471,1042200400,1522098317,135060478,676083233,1309023358,1009042655,683955436,250509314,1846448510,655016390,761065094,100087227,1069662247,1122916137,1732777251,1432058781,370222511,1735959343,956016015,1928239049,919072005,1441657469,1423534334,512557981,1029793761,1161761806,414249827,777481926,413946112,103149289,876940614,576737317,764048432,239874923,1568528783,900010477,1655138014,1000315024,222421612,1516902556,1820265442,1065756742,1899590541,692674039,530604700,340974157,1080675018,1500502461,287851697,305820972,1917446647,618144759,322423535,423367641,1507126683,582011676,329804066,1883865466,1472102728,946812516,1070694623,141916791,759664406,1007418577,475794983,491674777,1069826205,915005218,292425933,635426678,671487139,1063846775,1415437183,822863885,757816011,976482131,869313467,1859496775,1201352345,490892739,341515749,1804865254,711724162,1222708215,1924178154,524133658,788206359,1438240329,1334869881,189858641,953899135,964578188,769724864,1637921763,628253413,844342766,1938294993,422389054,275512859,353993660,862412274,1996741537,577871940,149290473,179145746,622845899,986376509,2004265808,384160729,545088171,1141064988,1113337454,18964804,1598087572,948698576,879424031,1012653510,862732637,1557539292,45109241,1548483940,53297679,721811455,1781921917,1393361511,1131399550,978488019,726367492,1319367147,765815915,1229234310,257004415,1435784733,818338812,694244697,507115238,273888525,1943184545,686030085,589201332,1308342135,1754996594,1988497366,298882562,147272039,808347676,1244520069,89147393,739486728,1595171789,873240198,283675056,794103007,1782170022,1951707821,1680940047,1658917542,1100073249,207904075,924004631,775449505,1214435067,1931158417,822065273,1257922374,945843981,133879579,1976396887,861099450,1647185953,1273712154,1221063261,962556142,721637062,1015707477,1094916905,679816982,508305570,585337277,1131689118,1932106412,930475708,1907550731,876092487,1003114255,1388917921,1045071435,958090488,1954147321,1042446688,658264434,1683751522,1335037883,523704090,1546847984,1993727231,794457662,339680077,1035814184,1189754672,1055241377,1303398176,95061769,1622505422,1456548431,6231817,550537653,1852203119,1214939326,355313908,814775903,396144016,1635182770,1073067434,168700106,957511193,1267460428,1034874256,1230443245,1518855840,1634888887,1114688105,314415886,1459913249,914814939,1214258973,1685117181,698872618,173043916,1125155214,378243247,1771294129,601447840,1867192745,1381564139,999749161,1208906711,1388077402,1663549458,1991239719,1446849350,839209769,825251464,49857415,1375169651,2007974670,1869609805,1455258304,632948890,1831475130,717697456,451399286,390938453,1983806507,1843594279,154405983,1628438466,938982084,1898601465,282542018,779057810,1638271432,500166510,1990764873,1252610803,1086986465,1623942512,1595555885,643211260,1640439808,189129647,842769706,630553403,1190502694,35563919,507793361,154340669,1466934187,1022627638,1291444073,1973366199,871292160,1618499312,1540034850,552544678,846392865,38285386,1550516823,159200600,2000126109,394290646,1854903460,118313223,29124513,1794848119,654627690,759085870,1656033099,1562574453,339439901,179744510,148883049,2310913,1513017117,11297251,1451536268,375099286,1503821213,393876263,433581721,956267544,1523376254,646036125,1484177946,1191503980,348506842,1024688333,1952566375,1527148828,797093597,113942962,1901740625,938223420,360072240,1042978578,1079490947,1031973487,790163748,1518329985,615916885,733544007,151243402,271084179,1532400040,1698649747,1247791341,1430475039,1208260280,1812701765,984188010,1833778224,920954502,150689814,1914574185,646202313,1969698563,661446191,342570914,458008088,785932273,698697423,1157341839,1913266855,213791890,1521484560,1324456763,1084607940,816607194,1694115911,711205512,1093283043,609645519,1236767090,1544796164,1255976360,467413282,251541576,1983203075,1448847530,1616370132,456498292,98132765,161940884,1329383221,1267158949,218116354,47242259,1249245149,667723753,1155174112,489521016,1508350396,1490523793,1262569518,1985100173,1735599390,297315485,143837380,41516394,1395327906,655953939,1320350516,1626746248,703944508,479691015,448910791,1871679544,363101568,1429019144,1574263227,1570054511,2008779338,1325199608,667003626,903320250,1452565567,1207431332,1585969947,1053209124,356888511,587187618,677805832,111145679,1273057488,1189899914,148475768,1893709246,852058462,710174133,1578729613,1190773514,1787023905,397926430,524585892,428165046,534752747,1242140756,286215810,235640302,140726032,1610976759,1327094124,221833778,882046455,1425053924,938757768,194355521,301349229,847854328,134494307,416708896,1873709558,1361249398,1345155071,1390535939,1274747139,360638576,1275123196,173483494,697538070,1566828617,1302195802,57676669,367656299,670476295,104088614,595198318,1215831321,35911237,232870056,1392162277,1289820241,1398701649,556367397,125677009,1387306600,1496094878,3817957,223116210,1816154166,1268624820,539464003,872222922,1447100698,738103983,705816609,847371892,1971095362,184661344,309353903,1589783222,1147637929,1659201034,758908069,767899493,157907761,1721072969,1540298212,1781178367,957997378,314774802,418132804,1105527753,137440399,1929740233,880307853,1495652312,1968551578,1521385149,2000609442,97405816,1058549482,1174783124,556072845,1665120426,643184584,155493817,307717049,1447500699,1890157131,1135192520,860033259,1284270570,1175702081,1027396202,1004393744,1760877078,1705256111,1805375098,1726897499,700691414,1998970129,58276591,64039577,1165637229,1565260196,829074590,1554445392,1701425305,1594816673,151051453,1958473274,1724045558,1677700146,1939767856,1733735893,1350735729,1248474696,1759262536,541830787,996800488,1593327715,1382894142,1436360080,1698264985,1582074579,1989503429,1616031343,578439076,766734227,637122800,1701760792,1719309742,1986223305,1174681637,1010444263,794900929,823498515,196103613,698090686,587770511,1917287270,862309690,298981487,192788802,922639555,1619317197,490550237,1134889954,1065062187,478346056,285548668,1961663651,962468450,143642846,1967127744,154354901,692231911,489431151,513491002,1273845431,271258191,643209918,168999297,1142466231,1410259654,185972172,1685337087,239606498,728886413,829954262,829531942,1742576490,865538054,1650387279,295013864,1592434985,1986269688,1540502901,1477020453,1223838317,1752057243,1483904299,746456225,373040701,1929152338,1387738668,1215535032,617314614,1240482458,857807422,1328415650,1957302744,800100120,447963253,500294021,848242806,1917531664,268992337,610547159,72345467,1745172629,1751158980,1907487124,1068018157,148347052,195855881,1642232507,1333466897,1398586098,291709261,1018405107,457329252,1990042307,1627903253,222265584,1602635275,1822463550,1886629115,1597396691,51266512,476016546,959916051,1806531733,1445352007,1790506758,188560426,578561015,1656747035,872738800,1690563836,602403440,341381707,1046802128,2012474853,130159466,1585782062,1507536567,1688882420,897964661,1681359585,874009834,28817290,290037986,1889781081,844477906,738156110,965804260,1796147499,198713620,1512093126,1768810830,952892653,1831913405,786262191,1794908914,1087006064,919165513,1779771580,278798839,476302664,1612355175,1201525363,515710818,883277413,819018559,1379654221,1275525090,845040405,501632820,1598231087,495843520,1917047877,831211062,556304509,180357083,1312004545,501051306,1421441214,113515570,1657650599,1715042480,1130599370,1543951283,1591492723,1679950994,1193235504,122991985,1014586602,893198009,189665014,846056539,977461158,1416564829,385461162,1259619454,1450628901,171165628,1544128374,252134875,818197272,202498679,1610307474,1245624840,299644720,378221481,689685352,1965543613,1208211760,1197866614,840136013,350646596,998501463,1505179348,864975603,466524700,270906870,2006468244,1342321011,1147655146,564222576,1151517107,1775798432,1701991532,1881537878,1657033582,1477765126,1020400698,501762409,1133704771,380745918,83957678,472642463,351135336,1176472493,464172428,254465808,1039824292,27023660,1544271713,47647391,387173620,1311033284,1535516085,241579041,189952282,1617735423,1615248314,1484145717,2000876673,981608493,1471729997,254833390,1777452618,1887689424,1460293889,1000648657,1293863925,1101315061,40067443,1829834032,642268316,1369079364,1396029303,354711737,535476953,1417121767,912067554,1560517586,433037635,1325023269,124306533,1432178034,830347877,683396490,72116004,504667359,1376646266,1651071986,175964797,14565278,1960313991,716708085,2009202990,1935946726,624181342,561879192,446223702,260152929,1712578216,1963275882,99905938,619290487,1475502133,1710752110,1390655270,1952360471,43358013,1228286993,912292425,950945404,1222095857,335150509,991477506,825956130,1751058704,1106768625,518091752,1972714262,794359727,961305499,775667483,459913782,1908531381,241263379,38581792,1301724362,1328990002,1952239957,778825493,1937861750,539957013,790262603,352979196,641036686,1217969186,213673818,80401541,116649574,1113325041,1544124907,1075697627,1672157836,145393612,174588220,993694272,520505625,1177941009,1136972130,1194474546,1563460011,1390465825,116640485,1778330262,1879008133,1131666118,280210444,342082479,1165504143,1981882433,725141451,1682870967,511656232,622742436,441606809,839566736,1895082430,23292559,424554653,765296338,1550674736,1314678673,1754268450,1370861494,298839806,799952307,1017035779,1452717477,606956432,871229358,1013521546,758050600,1930554736,1456599393,1745593206,1882095119,1202730576,1440197847,1515995996,1681884006,1500479308,1228509172,1107321010,1913950984,1480025865,1573472575,1041574266,677973238,19744693,1456019730,1492000580,1306153071,1576439236,439138942,1717171063,722892933,1655939680,1594986405,72061066,1965116301,635567221,1579775293,1659497090,1976468886,1026873817,245610963,1135439901,367544514,1927219189,784874458,899612822,546955251,407672706,1479849600,624198922,1180598620,524017522,1059874741,1842573475,1260777599,976926185,13057993,444863853,1794171488,272717749,164873449,341890304,1226660016,2006280766,786888367,335198316,83166145,734774726,317905041,956473654,994906127,619910396,20669627,818543789,1618080430,643912480,959476501,1306263018,1705376928,511600431,478727428,1892194943,1596340852,2010937998,1015357189,1123659853,383260078,669299286,341913980,644079558,709933304,1604547139,381014391,1363220439,925736019,1548814709,1826704512,348386373,1594336132,1675397100,866396859,366647233,706810819,1224784005,612583169,1725577663,1546996796,1014967431,880927871,487709309,424804634,686472872,562446120,1323266653,1521037118,1788289767,1783982113,1348466091,603277796,395347931,168607868,506479077,1326258456,1479118371,1634518971,1226885887,748516182,584269020,1724613640,847568988,1860792156,765856370,543125259,170515963,188812226,1846149519,179182869,1981568025,689656324,704767596,221881131,761994662,396079487,1930240611,1132293570,1526209861,745930571,247734284,815426894,944622865,1961802867,782148958,132684622,1227394333,1011289716,661927754,2000268393,1647932273,667100362,91517367,1394359423,49718817,1329329148,978968380,934107316,1900904492,674781429,1838470322,41206044,270451584,1531731983,103725786,1268592778,256189548,1809037216,702589390,978361050,1674846795,1653629927,914906723,1628136056,1322722211,592605040,249528597,1138606416,1221384105,186311105,773216868,1909880040,592669769,1211535092,298448588,1728187140,341459881,624653300,1758911490,1510720679,1055792150,962413410,761286383,1041527219,484189724,699790304,663807343,1814540644,105954530,1512890169,1992689102,680725962,1931753413,277352595,1928768142,142771285,260154602,825845831,370596342,1848596786,1305468667,985187541,564826446,112146721,1738538609,1528948930,474355344,1220427408,1645862876,560312867,1971274567,659011776,434104360,264575926,1745176254,1587880920,10744377,1453412523,1459906723,1412180795,1765890273,221626917,1442450084,475548646,1161511821,762325117,1686597679,799644978,1956580299,91842147,1903580744,315024755,818206690,1721316059,539787873,115162360,629693368,475404962,1340712373,1035267761,2007383889,1750064398,1853707887,826635850,403630298,805763604,661893044,1478962621,376684659,856608695,1104079954,276647168,718423864,703378753,4904887,192049218,989700215,1153132568,221039082,474512223,1653139064,1417255631,776876828,1913146018,546147701,1062025089,191810717,804854415,97934771,1478231129,1914816650,1127605343,887948969,407988355,1470251077,636114754,817681828,836485081,476495871,965225427,954211823,738442632,678862244,1591816667,1537345326,12514626,1121669615,1542098266,1740358704,855772852,1592780676,860752632,1695394789,1496205339,710598381,1322062872,1877750323,306554583,769713244,664092357,297581600,315907267,222693710,1801092759,1895249234,1708446187,1591546819,668783059,1490376451,1755225367,384146533,1641384290,1719414501,437553206,839281617,1820423522,969928989,1961155815,631471882,450837611,373476105,1386196487,1873427198,875337564,385958294,426334062,1908312559,1267360426,1806559782,93478571,812203941,612580771,319848162,1463645084,935322924,1554176563,1129196804,1566475342,966118733,277529043,823830240,762414363,1441459015,448651847,1146859796,1658949610,1174071194,1897314829,1453836223,880448112,1874752128,808361338,1555525678,983127397,674663185,412044400,1640518960,1147739947,489764278,1371068214,778201554,1653348090,815217493,802603531,1530133042,525170759,1597557013,531673161,297301009,1304085246,1384091654,1390252628,266701620,115748062,1370701016,1907122722,1850303122,988581995,201903284,104848432,1500786504,848393684,765416243,103043278,544807848,841744377,681216831,1183544038,693935127,325786485,1797103696,1790677142,1864896081,1206443831,1072213608,1919986412,990594661,661720159,840054371,1053272818,11405640,535486299,747109535,844827185,1138887342,19357340,1377300326,1829995976,802833035,1197768425,1442915488,1274104969,617057937,1569559167,1815241361,121411868,1963726904,1386671986,1731248708,1891045973,496367472,468387699,889123058,1392432590,878821324,262294288,242470243,1342239014,1637380849,1307712104,879725067,7297399,1729421666,375071485,973716591,1439952272,1501286641,1764181633,29012963,959555857,1447507735,417820223,471537410,1943937878,2000529448,800865372,441453885,1825054613,695930439,336318802,553810422,548489655,1796263026,1291374058,866176932,1562686105,1966879430,859350788,1153787976,949542166,1607821148,1297979795,816775035,25631786,1348065104,1480461869,1282990928,1237254639,1288937870,77502165,695034908,252635496,994254251,1019090055,885055848,1086381057,22812586,843045954,226207786,1175112869,202402268,474290895,326373603,973067763,384964781,973384249,67900033,1694856241,867400510,976120836,1953969974,268763273,1339537929,1725939915,1205536487,1175561461,1796093143,522242771,1304025130,1044520046,841106004,488042894,554426096,637613938,331057334,611544805,1155462986,34830566,1217160165,415872756,1520173,691054862,952789668,381587490,387138625,672975508,1747167611,1981986207,983431063,1469320608,580450315,1680452602,312505156,354374276,362246521,251210794,232673410,87168413,426136237,1408791709,290271701,1458026686,1864449702,362297191,385877753,949080288,1988711564,235434064,1902155933,518433587,528912073,420421070,356093262,511872887,129991793,1993511877,185920186,1191456147,118950003,570042373,637742815,1507176519,1598594578,1419049321,1994432848,1301404036,372202790,1575057177,635062672,1790863173,1192946801,1716232009,11576857,1951580777,159471814,1278950101,404379626,863932289,382171283,612741009,573465906,1903666237,1985778108,1080588425,1638999203,201672591,713116816,46758175,723221832,1791822426,1433279626,1801886984,1510339055,1399477032,1532185045,1914824753,1148046717,478881476,263615136,1018942116,964015625,1139020538,1445016241,1084678851,1338048903,1299793165,411319418,1068783527,276433238,57751651,1905923454,1248003219,1273698177,1858034829,1263099264,277321655,921968119,1588206841,1015003021,398107710,1602664285,958718263,1776121724,1481936213,53588620,1850535674,1628401919,1463991927,1301259693,813255616,1349754334,636311108,1592047571,1218403726,305074827,893209990,99360972,96405433,1220680184,601138455,817294619,1509851172,1619770638,1189380811,1744728139,766282887,1824787186,159345307,1050522915,1062112831,1073842641,1814656405,1583119474,607100091,1014114880,374359013,746627214,569974163,603441775,1091337618,1803161551,1058837606,200958126,504126741,901104304,637867519,1911964645,1250986933,613163229,491771906,240228521,471235873,1746792055,867375114,321247808,1567900438,1586917467,313270832,188456499,1664433111,1103707780,772665699,1633757803,175384282,312627562,990965501,41862728,1836605241,912149845,366140121,1518128705,1301940216,905194609,1663255609,805736012,1431887847,196501755,1865189064,323807277,404847734,228504723,29897553,351529353,1651673109,83921389,662032795,125313051,522327654,240694956,987754044,876151771,1050237974,1099797435,999156451,1684225234,1039155512,800495966,476489581,782927214,439586785,1393611425,121459103,1275445866,1576097379,222122377,1948961478,889649498,1314228311,1232079837,167506538,1564516100,1449207776,251644484,1129028534,1518862316,1354332486,276323302,792293381,555600713,321395084,370887445,503440684,1616590983,1664930586,1259162656,1184368799,1459226766,1358009675,331094380,386720816,1208787989,2197438,1819885954,1175259017,1751893919,254929348,404165044,1394159754,928387731,171609102,666140281,854025223,1418678993,248463226,1261636210,322025344,527108153,900046747,1915014597,168813976,1439940542,890370343,1759379394,1130263354,94390450,1477147381,1431487921,1452814233,1407452906,1737114275,486297885,1506444111,1911264488,613646916,1447002618,1816595612,1819902689,1032251720,550349205,797572226,1373610887,1455771027,146470789,1808797151,1445669112,949482420,625925463,775330053,62964551,1389988026,708083301,1218972207,122510535,1555173647,1298401738,1186200523,1507730380,481624898,729255153,542069493,622857165,948107341,1903231526,370725960,31608332,1340415764,1067309830,636660899,327206600,1527576869,1214182327,129900697,1066416079,1660576094,1816541030,133132100,1059440035,628497942,373826859,1949376663,204391357,1318497644,1856897378,917464988,1526185935,204309472,1427875224,1539784515,1315263717,213495342,1551008538,274061905,1858301399,1465559338,1996666073,1189828135,413997560,1420710579,1062309499,583975023,1928696369,93522567,977445425,1099807553,1819838189,1842103635,1371667908,1081751056,1931637807,1374884805,764865681,1398421805,1565867729,1720560799,1672875828,1413595222,1321011929,1534501052,954447859,1480313551,1095593472,1518800199,1820683937,1241219795,947477702,1710400813,201589257,20792020,266398507,694835281,694510651,1039214086,1397863648,637969308,1034626331,1798195019,836079902,528809484,977253683,1150010170,449500914,1510378302,1954717397,1535163882,536686040,911026789,1756342052,1586431470,614558130,36432017,603631362,1115929117,2004350431,1681244999,1070966048,1423190221,266393714,1970324934,1847505846,1331858567,251382563,1179523313,439570889,1741419454,1895984243,1385906270,272039194,39531711,1390137179,1756444154,1979516456,397305313,1250048873,905154569,1481506336,1863417908,23068720,1875687916,281928130,838685204,1438192474,1277582899,1769616323,952841424,1647424874,720367111,532540894,717454791,900550077,1465779463,486078090,89232684,109537249,683236742,755481449,1288982388,1272441751,132241653,576747960,1052334168,1577199283,1010437181,1668383732,1301326859,1803723558,429362150,1963465324,1122372872,516254610,687423800,69647647,1730976523,400733741,2003092738,399941126,203600194,51496780,400364513,1317583481,204401823,1604823831,1637608902,1092807405,642149006,1807820266,49852265,1031544127,1651829131,686439525,373906035,188075441,1191194963,1594388580,939731795,1734449108,404919801,377121327,1154589909,722320846,1286382688,1670748939,1298887310,393264554,1179753606,81096937,1518817799,273412358,665017423,1630161396,1764193025,1099488317,372721890,267596431,1294436346,717348053,1238098566,917942819,668506798,1393903070,70805277,167195927,953127613,1474969583,1216562463,510655798,1533787398,918638921,934023299,736895839,921060684,568305744,1074004642,1283164705,33082512,1999485323,1673472708,1428731280,610964789,715638530,629624366,96639703,1625818932,691096048,1795276681,439672153,1630879582,449755774,809780232,183536130,788639673,1351077069,944669374,407623456,1017785160,758953117,1108548271,330240347,1064396669,1257213046,1202037295,1588260172,379140633,1946964500,1354062366,775598544,1510832070,1593206838,1298044398,1134401946,712219097,677260939,1252303493,619685398,696431204,1774131641,944359498,1369142133,1454734944,1293235794,1513203606,681021735,1826818799,1006627400,1998836563,1893258443,1832994663,1749724451,773607867,573544367,1338887427,464767168,763982066,533486397,859943279,200341240,1899388888,1789557340,1648092562,335171300,68780602,255921013,486386842,175626165,792143719,614548037,836915680,1021366103,729384782,97786224,505707627,1654321630,1018860859,1421567931,430237111,777112334,1816735727,307105479,886750791,1308013393,1490734844,75671408,186473315,1461090589,4114070,317327543,544626765,1314855068,1831984631,478862941,218601857,1678848749,923202925,271807319,69048686,381916758,448756529,1368731828,372946204,1430460291,1385829348,143003812,223580722,1511699331,352662398,361730036,822921839,619690881,1732821110,1488118723,1942245087,1569015219,957309628,373292215,1258569541,743200141,1042177597,707109281,550006216,1812084028,589891260,1295586056,246320140,21316563,254306085,63507369,441014706,1714691018,843409091,76705840,346429970,204928875,1542041183,750080683,1004858725,910608342,543222564,405311177,1982774145,1422965895,384345259,451853747,6970508,285497272,940623139,170711279,1197661381,236747266,1877945695,1674657973,300759345,1634557444,1690867539,1131891327,616622487,582115448,594929626,738492988,184637268,213200623,1862616091,1133847778,1031849016,934953083,639129820,895292576,311660777,1555357048,626679371,134464805,15300431,127529577,1284642648,1818601886,1768350243,1986638735,1179415978,286414352,845972068,1008507758,1062407085,1109681510,1225525258,513494009,275681350,730097238,1933429687,2006057619,1342843602,172168384,1059182126,1212026056,1011725243,1267356613,1345965224,190238205,224133266,595331321,760414391,350139385,1831886220,117296422,705148422,41176895,1888803415,1125159193,1866861429,347445675,1280796423,586479158,351762827,1631019315,597111779,1757205264,999177718,11929991,1600891973,852259363,1247929038,344721659,510445969,1540497935,445212425,550611129,1424406489,1935643533,90120492,819876806,1357869413,1485086969,1059101016,577340864,1290122333,1776754062,1996214333,414795502,384678642,971999928,726138168,586052792,121550929,1980823038,431075968,131377753,1434227273,1415956875,1911748279,1133343597,519450433,300164406,813619555,754900731,43719509,180497358,1925794338,915895393,1448104643,1081128917,546917139,199902698,623454743,943026550,609584164,511276375,341419214,1243840999,1564660531,610150652,193370259,1735745789,131594792,1060887562,519431629,195230429,696224129,1355474800,1703591572,478306584,1486766155,1517474215,738692924,369384618,1808314657,1297054120,1861921793,1283495498,1364396360,1930627950,1501572142,714645426,40096516,778172654,1921271233,322639985,690282236,181161336,1233652825,432004635,219594560,1147458939,1777097809,129908309,1622410226,975501007,1134278628,1699249770,945234335,601752932,1878284607,1726601991,105428188,122899561,251115965,1810040831,1254822194,1308742267,295351084,210267538,430701408,1350597969,598834119,937075829,584146422,180863293,1042806340,472080994,1143092673,1069425844,1442429685,768027204,452618750,1161222944,108665345,964344886,412142432,629673493,632860185,1216898464,532095648,3123441,771089178,1200112549,464069779,460412211,1028232091,1810259457,1936573983,754286965,457959892,930806240,68781472,509225696,797935705,978597054,98462950,478677324,311163138,1988307799,749169140,1146427853,810372179,1106916769,580915314,1211066457,1493957639,1996607911,1532756418,1492002347,246001113,2005436327,918323923,911273820,1632131168,1102799867,702345654,1060937061,1550256020,1148153858,127995944,1485765576,1973492998,1189386361,578292581,1258634300,465541876,1753878448,104317327,1811743379,1348344377,915824892,11050422,1740360535,325468053,318989710,71122886,1909253772,1051774221,1866753323,998179739,512516462,501629143,1230124478,1747920983,584992780,1511216989,133796186,928025598,915836080,1110961015,1828763994,882113445,61916566,675871943,511386881,1995547285,312381763,1466136839,1881455276,1826739227,1965153729,1606096125,624575906,1365368028,1116705912,1887417852,1456398803,1936356978,1034140886,1524352754,1764843079,524776287,476435505,686018875,1876282268,918495684,1292226304,188406653,31239016,1642031362,1936619547,773679002,1612954657,729904474,284501860,940131570,1974589309,982527013,810770502,1687738104,290279617,813034578,50043980,1220393738,279426486,803459166,152154873,1776798016,557902215,1124738689,441590435,1927088496,1826514500,1936687288,1401699644,1098196053,1528513254,1471841158,1015747478,545863574,1214263040,1543501456,481928780,1041307071,1105089255,301899945,9462559,1587682672,1911792953,509795487,578382227,1796901240,1531104531,1392746059,1484101230,543342155,491814736,503211797,1862299374,148207188,761787190,330326060,327968920,1706915045,1796923328,1714841907,871949869,751605584,1053502018,1996635049,1413741269,1400910057,249370291,2012753263,292882170,218841356,1738955840,1423383086,603203098,1575214759,1140539783,1619541371,562153809,243372029,1809342716,448120093,1301722154,137469798,1826100831,1964888050,748907727,1448625579,1508499205,1640803921,789819818,63282093,846276218,738840951,590217947,1608895175,29808828,1408415476,1855809521,1694199275,235025307,1406695735,1043609813,1980428966,1450986892,469849071,985520615,372627714,1419170344,513698113,1441640118,728393497,36339451,1266684563,842926087,1420524365,1342292043,1951913836,174064710,1554856936,1113808313,1815839410,1886002237,1995176012,218993287,484811000,1445445792,1070673063,761742720,1343447096,1678029701,765609182,1288919975,1721377397,130058908,1973670967,973332596,674953784,819220108,1727676278,1091055211,972429664,1490722362,1179478502,137663974,1183400073,1597625212,1176333054,1247384396,1257752406,797294028,550711958,1207687161,299175537,1952821831,697885512,677520561,455604986,521189798,1067740936,137119548,1594615803,1298171554,722404225,270433145,927733183,1977799363,1726961276,1790932371,1996079541,1698170862,638366791,1410262308,531188273,738133872,500369595,968476704,1921760590,1357631840,1247892017,1728009213,893357288,1941743075,677222437,948562763,95573669,1973921134,276989286,518901569,1417917813,1976439776,1682397210,445955919,176099619,1024433262,1908365641,821528324,133326018,1049055471,1245922616,1425460054,841477470,205735180,888855845,379557968,614197598,603853431,1822293270,1482469735,916311434,572268464,1083554166,1088371458,585111871,1517313542,1452759089,1632272026,1696189393,893182414,135758267,564285010,169281175,135108548,1849218566,1964019739,968343748,91526224,1216744569,570334117,499278426,880130398,269466435,736786474,1508747466,32829123,1429015289,1102297061,854515546,210132528,1543946082,820490570,634823244,1943530584,1674307448,16743053,313541395,70912640,610029107,577372604,1183195203,1737476610,1376206070,1851555635,1209935315,347555022,1316280757,1546049644,1982869824,505221940,697970089,1326336822,1747018967,1836122834,435034764,249836094,943145096,1216614870,409404936,159113628,1188866651,1205937649,288125804,1135784422,145261881,1803034437,390720639,602812659,1705362746,1441862742,1516899410,1616250880,1519329299,1859158840,1434120410,1163799751,424739783,219714723,827344365,688931290,1029070300,195843365,231874817,1108543530,1636799620,1717664185,101129376,1736894682,617470211,1331997284,1996956018,800193908,130422238,317185099,893425147,356314710,81263535,1754126053,1476444050,628336650,641865111,354761212,1677984248,61586249,842848444,1332814054,823141596,556811276,1003419760,1763642250,1283548608,1279943361,541846489,1037938491,206201706,1878543403,190790853,1259827960,1837742486,150773738,1117260023,1685965012,1260560274,248281335,1191960510,966801379,854009398,1788580245,591353584,506282939,958939237,1884255863,215932607,1600376132,1226405188,1470665906,2001387909,1170554149,465094300,16759996,1697932425,1231510774,1139670210,261207889,538536986,1719257185,1951914248,221534514,1128051306,1339877961,1443669354,754569957,210126509,1479180875,494033291,1490536238,761310960,896561879,1586869196,83255740,614464639,1941826036,1630002554,1743774239,946909130,2007489882,1731414969,456191730,1620007351,1423324591,1837479792,177065413,598356971,943175329,293119767,456458900,1552455487,939893929,659311327,792520471,406917551,384102481,1820901053,1356043574,980558826,2004409742,554069272,425335223,1917364940,974926560,1570533446,882423952,523534479,1729872733,1698042548,485120879,721130475,659929195,599563848,703853688,472082343,1559889710,1224006008,311161098,535628462,22019308,1469424066,1708509616,1301514261,406288766,1211091154,1092664881,124904797,1535774331,672357845,1343751927,390160076,1621791042,777300893,1782141081,1855662617,1140809347,443408209,1938060107,979281162,733215731,82281984,1074764797,436867179,1485935935,1819529186,565764441,1098091257,846697007,368627572,357661405,459107668,1614405074,275728538,505512823,464658431,660372033,252042744,187267014,649184175,697428991,544933527,1003681580,519507681,1226545717,864604610,406040127,1156922952,1851595421,576292039,186093251,1090287618,1622394805,1010346294,474497027,1511366895,1588075356,156555794,261433737,777404600,1667435200,1308032596,963895841,163938884,1351007444,206241237,1351618491,684962884,1390227528,1452869606,950401758,2006635973,1443249430,1602362696,1569666075,811392015,81553771,1641311852,72930965,595290248,545126733,720813517,1484602903,1629730175,932207378,1202203594,758736351,225738894,1316676554,828564922,682271223,123401466,1167322359,1492150247,1269723384,1807331648,1758793904,339480246,1634902809,495554998,1639580111,957308620,569359081,1286274920,631438453,699360289,802269039,404027859,986214016,1849218426,234409986,989897158,1634408196,858167312,1721345315,1956795056,1386067390,1480344740,940668890,616893430,903584030,857119192,476743564,949315766,899032543,1607299633,487967486,740060264,1969993663,1506983124,1473504313,1799152034,1796547147,1317099741,957032630,917936435,438043103,1105868608,115354786,1457842123,940047457,25133924,1312597175,729371164,364118429,1303769610,1619945512,1977417842,1394877227,97154067,329872828,296783719,458307789,993967283,776627235,579163192,1072865982,151532771,140560794,1887362307,300953821,586972167,246395136,1521067698,1420049819,1882786569,967341081,978480948,1986921281,1646272587,266054868,116563081,1282845376,1424119044,469271934,484941086,1298690718,1804936339,1871799638,1272226719,1279277608,1418870916,350061817,26787707,1194353948,1614194368,217749574,890166900,1321722620,754292568,3677039,1232703455,1242108236,1564010132,795625440,1715910377,81892831,17986848,1219905769,211234614,1097799022,702136531,1190767070,1668414403,1226880166,728205783,1741135172,257058070,509230456,1943337413,2000410104,636872405,1552074423,682593208,1570095146,975275311,203999312,725019443,1676442223,710358423,717653819,98325145,1236098779,1530561587,838338569,1185167683,122792329,663967686,777909239,358569129,1393054279,809506355,1293991304,1054508266,1720521737,1949602528,1095049273,407267144,342075869,1657400261,978222228,1827435183,729483309,116694067,1536133447,848487008,786764903,1185715816,1911226379,1387040674,1662038226,167137162,1936121840,1700996802,504944713,540952096,1939770288,1745092610,1031078603,372156640,1402661954,1001739588,611452488,655604020,697408067,597766339,1224699562,563836921,1274068966,440527944,1409285871,1626914199,1320300269,257071954,206417234,877790696,1048352865,926929535,1454394835,804137360,362510008,1865536202,550278504,1199372281,620353712,1961940473,1192977144,560715640,1869057375,513029800,871675443,557268192,270066895,18396828,1385476566,1257082980,1398236741,373212656,1372277596,1694828168,757161377,1980549545,1681865681,1631220132,344129270,1040028702,1236735554,226985490,1010792123,1243063416,1469377169,659328061,342182659,691495306,1778771854,785416906,1213649671,1413578956,1338719298,1736396167,1982204155,375386475,1024867851,750666860,1280073261,527916771,295100873,5229403,257131699,597896216,1962729541,246770122,1599241097,1208853162,344165715,381208235,192380007,131708947,883697323,124937166,676786437,1426077359,812956053,516693505,1619012959,767215204,1107747572,1093194180,1774039938,293930471,1707546648,1884324676,22008809,1768978996,1163590650,348817942,1748206336,948578424,1909567431,45228689,8865503,421961331,507262281,1945772116,1224605271,149546577,1771181229,1901625550,1912648642,1385521497,1062585203,778219944,1323983352,1824265686,192317537,1244546337,1082717485,983727919,847760109,1123003959,534729626,1033033727,891302926,1811290590,82528973,549998925,963313712,1953316322,1012630532,1165299057,1274066603,1766987032,474123062,1215610159,493868743,327267155,1533721681,627612347,720411605,1021212284,496331959,1639355216,1138673212,1431116016,305017045,96429503,26720401,431267243,697056581,1646195548,999246830,1516789140,1591871057,770543380,308268963,1554820952,246407175,1474308942,182838121,1471251366,1087925661,946083933,987475989,1249752537,449753411,1207526174,967897832,218677477,1573896760,1018189388,971071587,1813236336,1333770026,1494494226,1856899303,1243830739,1881146277,1644291511,72426200,594493702,1797448792,762417157,1298437455,261263303,461846164,444371693,1502824456,73962615,1556164186,1374773231,1781311020,1717822491,162974327,535535991,421311282,1817482226,397549565,789696262,895675965,1941499817,946176096,1875876852,1828858233,1635278158,1187322255,540803929,303492931,1849207392,1764132007,1730307082,822686957,764197594,394396347,370658274,369522681,1254058762,1646012340,534409556,1520854454,94226552,1870815913,1216863559,1509617321,1156155970,1132813353,853099875,227357133,232124091,112190566,940514845,926372448,853567053,581466231,478495641,970792312,1254387523,1651383839,407252474,666746654,557070253,1977885287,1395219063,1054013519,84965195,1479732797,247893931,787901243,1748741173,291093934,2003253218,1451096830,1035580300,1352217888,978097884,210504960,1877620450,1942010400,1991414365,367514793,367514793,367514793,263080515,1545469791,1180377341,1225089562,1437108704,1425841568,1927747707,1236774056,878001701,170769469,287951769,1161481334,184021200,1605764563,174694436,1157936163,1635728668,785193683,61920062,245359891,1310826594,43844407,440495554,796592909,863991473,831445480,1980661448,1077898117,75283151,792878463,659730109,1519348325,1227615820,748746941,862062507,311171753,1818326685,432248442,905749058,1917204959,718132909,342947871,308256045,1198866193,1717822491,1496005094,1091690180,1873542391,639745209,379034408,815460521,1505407814,1578310786,134615858,1064013182,973995282,344030945,1994792940,211147607,1627878449,448267038,415343570,1808583470,1567162175,751313555,306144117,1165340211,902825772,1461582403,1112837616,1947140122,1696189080,1902565950,678967431,1727376618,1915378874,675193285,1067661229,1381762003,1012012751,1623809309,1334063796,314431269,646719086,1901162197,1503508514,274669725,68768247,1399896631,1838883171,1711775824,1284176912,1453269975,1941226851,1947828849,1769564836,320904096,81585554,1514412723,1984943309,282228110,654987496,258264488,712807942,904197652,343677889,1545674925,665951511,1049171190,1900220418,694977862,367906709,1386321988,770345906,948673644,692771642,908022586,1341254310,487803942,471256921,484023055,1241256769,781096481,777344657,394983796,207596491,799013765,1855689306,700995237,1923724699,625870620,1057856279,1985970324,188960590,1637746677,283330717,171093702,1753876403,1030782105,1642198680,1068948908,1051895931,1817593519,1235554992,1885205990,222699693,939237140,753433629,1320351150,382177322,1349066932,980057566,1890243671,711872674,558641964,1669891620,1372430089,10570384,366232604,1997992199,1985283806,871916288,547038817,1395305489,1181865490,1563889297,593853439,1555794538,990384042,1828673015,73592205,421525070,101593373,124951362,1963824052,1822157692,788794953,823953585,295518109,240123993,1494043371,1520333150,165258370,701868870,589355504,96413834,497810273,880226934,1793637371,1045969654,267023604,842995628,932029725,792096572,970951085,164719902,624162686,92566699,252949401,293453155,2003320216,159653621,375783979,790242628,1343470167,1192390749,616538015,1323119120,618074653,1031878388,1524186962,1594844380,639778417,1759735396,253765942,392440370,98034890,112727732,9040935,196074609,276435069,1826591790,1279907186,388610297,1976006383,530090433,972595589,1314381219,1551139798,1214099583,781204441,617065196,390187839,1802084801,1955816528,1567196829,901719663,815035348,877076787,558241574,1942036561,1004134403,917335859,1467645041,1473457394,932890027,1825123312,314077175,448801771,174828081,1942089844,1782096025,1564325619,91839129,1246329648,695223952,1484631076,1480539768,1106852533,262154926,631006226,279118185,1110674721,1621439553,1759727309,983077894,928582393,1759748710,305352060,359006471,1331926968,1709283690,759614280,1556769858,1608306477,522972333,396829594,1184954001,1229531358,1028207776,271214347,735865151,1108139049,139922744,930246975,1849220101,612175733,1425399442,1387979063,937030293,1891552094,1661801612,1793627054,655420909,1149413705,1471016325,1136926661,1299376703,446249030,1099369308,1210405574,1335403739,1643078764,737765612,1109678359,1380016581,1210727040,1584185768,1612504931,1149624459,1700025861,1912821054,1688020353,335654910,361822336,1355436638,1246616789,477476870,1614709211,344357360,1062994450,1296471585,1147054320,1251762826,284390456,1361158109,1040553981,1396644444,1628326893,880308094,302139772,27628515,84561347,1684195375,821942525,853284424,121945111,1750635471,933066749,1028044474,129349894,1764823691,1540490298,1108125560,1660554951,943358420,1363925477,2011358616,1444181430,1610124243,1589526081,1543756951,1544604617,1243579108,150491718,64916734,537000169,606936510,463915201,1326801138,1107976299,1066003442,1873268494,393381706,1630412552,927950090,305186431,1035160606,327336933,209114868,1458806282,1561913936,1353546350,900396750,60429134,710496004,283120180,1072985869,1824640907,1193577426,1355126846,703893915,1044729943,595103064,1984876671,1361824274,1213647713,585078217,1274309055,1478039300,1302144698,711470924,863558006,83560751,845010804,1938148723,1276467184,1945130032,1357597472,577400203,1741224720,1938047506,639832238,408896210,1178009246,1760666888,1490117102,1423548435,440518655,1001242329,1625674542,1595226401,1932096536,146737734,324674412,80937649,1351647818,161110867,779820813,1932364473,353619197,1395676286,1686854896,328608068,260905196,1798142590,1049607796,1457661379,1381569683,1609259458,1396864616,816046666,1409750182,1739877207,1281034085,524496373,1555024754,739675379,842834249,1794959623,209025925,1831274963,983870024,667226095,1752281929,914960156,857737753,730295671,550005488,71428418,1792953773,254212098,1601523606,635414030,65848228,1973887883,1752877078,1613718938,867973457,1137534012,814110469,607722050,1158215305,1491630421,651386307,1523868145,991723259,1111734168,273607837,1705071313,816129257,1896881221,1800154067,459489015,284264697,1260433520,131713310,212617496,445374206,1198542624,1773255843,1554711340,1337379430,1727601771,1859324441,124093499,1224283050,1484024638,208031132,591964980,735847146,535703979,374920435,172969037,1681060112,227527495,1024214211,1930966924,1024107444,1946369759,1729716231,1365260141,191977806,341017822,194649644,1608308482,1055031504,1359523447,1291135761,1034528073,1651324377,1494523986,1875431853,1256326089,844533066,1632271915,997825417,200438012,21869277,1349729704,522765852,1386336704,454558832,1240967466,570617408,1725383953,988967028,809736719,1128166588,1070573972,588326617,448200983,993039115,1883256973,437812467,1690545953,530786704,1923682304,1089335078,46400619,958837878,146583326,988695031,1854761977,1084706745,1960257893,1551401052,1949024726,1649888144,1417810266,1676022001,1320694623,1939180862,1527377528,1922996765,466312960,426721620,254724960,1790824914,963282825,882564953,1802907792,1118887837,470560549,1983351494,1934164612,1761205820,703248584,71452931,1786772297,1486212362,1323490589,1224861619,263699228,1768917168,476975352,837202204,969828957,346775423,1472492883,125805075,1376888646,943887118,796128271,98140011,98602057,1621672997,401987656,1100126754,155561824,1517998775,1607835418,1025012087,1703409963,771446921,323997556,1397983873,1841704674,1698483755,1688087371,753431149,1875023140,1844241643,1761648228,1694657373,1653901704,149803736,897818426,854572359,893338282,538144327,1213996186,267523676,385734646,1849624959,75012202,1528069078,1747138389,14213666,499794118,789600275,991980310,1107277693,803140327,463998189,1587474772,1001599085,605118870,508388126,1108388598,1470941873,1976802175,1490605265,1295493923,1559630460,1273237319,224503906,838935191,42362642,1221803015,624442875,328046854,117483013,2009066459,462963036,1104254062,1118586453,1387673441,107929738,336145855,1738496943,1924781337,1785673291,1722643827,1310974672,884351799,1770291974,209044828,1854811033,618192467,1705298210,632824845,1756953351,1353510163,1684202456,298837028,145742265,1452611156,352079928,1489580425,800186028,47087699,190258329,1845715049,1655024697,707655838,503835525,52309524,1015257678,1154996150,805224529,1118846920,1517065851,270945304,2001992248,1380253351,1446743540,1593936770,819463426,1375789941,805541703,1284572231,1169686174,1392636006,1850795381,582464873,18188654,1684910892,1610643934,833297598,1890143728,85605622,1310221655,2001974429,611419386,1901270442,332038117,1812219718,700818058,17578828,642859373,1934965308,874700070,1532374827,1406570929,1517496821,1733934524,172934543,777112580,1017130644,1133383930,494276279,899471987,255658507,1040552712,1502305168,941922058,701711756,1481572849,1876210696,1091127719,66168839,312180650,1830470055,444712717,1024537493,597389065,57229501,576057893,1178900625,142152683,1362288994,369705915,776720179,555615735,1554547989,209775752,650640066,345610085,1631488222,1912132664,1440230403,301672406,1660781395,1644851323,1257155223,1489641072,1545054781,1739017758,1847738571,1748531729,917375936,13221817,894180195,1424779485,750221926,981028758,1066588455,353534528,1955008042,881727465,513579592,1531650726,1306041648,1065020461,1006719962,548434986,1344914508,237558900,140314748,396388941,100110827,534392615,745084681,887892376,1669328847,1328704058,864183804,1847610096,355314337,603517544,659088901,1801608717,1672874241,533690636,626944685,308065648,188242670,61014017,1144053936,746132689,1882629006,978539292,337164721,318185233,942406842,58462787,1905683534,468209651,1323891934,721443591,1672587407,1824373203,1403890042,1560023830,1921217343,213569194,650041115,1799622942,1784796850,4850717,1410887203,934847360,855402749,1516938435,1459351608,1597525410,1057526774,959087286,1076667372,569681269,452128760,357837757,506574632,298395930,1348609298,502433659,559322264,921624788,527475590,1097623940,1144839119,987470488,781066790,957763019,1313319955,1821623048,1838159945,1270767052,1087355416,604135482,1554174662,21058438,842104200,1809555474,529101746,58940353,160974278,351007941,751734999,1286240411,1209558511,224741877,518373970,1176419807,1761558850,761622261,1192083770,257249037,1238079744,1067100601,1047576276,648860049,201606153,1681278870,528179580,286385217,110525647,543843616,1297116928,112620165,754436043,761591159,1503744515,1826805943,136711485,818205938,1799637541,632049992,52577698,166868600,368085119,1098966817,964587155,203972839,171034883,940214347,1467556772,1030093219,1767918520,1648484991,427799695,1984934500,639253947,1916447281,667016157,139748521,1654117094,504061768,367438933,1354675814,520914904,1211446617,168613080,470911646,1129736473,244154034,268124898,1016444824,483986613,1244284304,1771470855,1530091463,77264398,1533238286,1992845715,1751413399,336897399,485233780,1578252231,511559704,1292303042,593638568,295041357,1228910215,1914449394,1281819020,101770347,1863511680,184774946,1323583261,1606478545,988778600,690988791,1736568,893212529,893212529,893212529,1954113384,1324531207,736392545,1407540633,697118681,1308712625,1345954987,1716848126,1927277027,114352836,1831051953,693640400,1592241283,916031469,1918828284,974551608,1777221150,1041433979,425680543,1654132808,789177566,1590109091,1291496061,1291222100,1497832495,508401690,975859288,487445811,99723671,455821944,1941132922,1710706478,1221373161,1294450000,1168738699,1355115751,1225035653,1882283986,184858240,855973150,871805689,1112998370,176860164,393318082,543843616,65110918,1500532873,676212361,2010061736,1732838115,455957412,245537024,144906367,1769618313,1648131935,1563349834,1434081934,1579791938,1251143940,1922574449,1991565482,706096947,972506444,351262316,194986407,804254963,1957090886,1123655080,1284782791,1448879106,1985341574,1037028488,479923521,54464687,1732397056,1721400268,53324014,1159581942,12874187,1174758668,302278265,841221327,1432463580,1478560663,1915499382,1296047166,387787500,1793409172,1114093209,147967671,1319267907,168465033,771534611,657081763,1241787491,419655604,238500635,644946796,1672238612,726318054,1543290710,1367145127,1868092739,1030758030,1054951727,878309264,880268936,573171167,1508268623,1090308682,1508180501,411265366,604623357,1603492175,1870723661,1631916544,161654007,410748492,1191689374,299159059,710158149,891517958,733791292,1361020825,81451251,1580214068,1686414474,966342418,409262978,373323219,1065633795,455114194,206375246,1446835228,1208876811,1359417956,1646769831,1156237089,1483513051,991620188,888760124,527347081,14367106,202333932,854150594,1539923217,1868974265,53874653,766300643,67483592,568287730,573995714,76365992,129512438,1569685002,1943727383,345854436,1658044302,223013541,666829883,1034177362,1887464736,1700618372,1373924670,1292211384,715527632,1336223278,276842291,1701537988,980854618,1171390944,1198861396,1697115428,1264342781,747154331,1739648174,1431017492,148498464,875830452,33033411,131341709,1782093121,1387151200,1725876551,1835945630,1381218311,1830659969,1250887032,1668017530,624989697,478052843,1715841944,1476566739,858990030,1738549342,922127714,693218223,622611297,606919931,1568347069,183494435,1962044576,1925188044,629507948,1486429238,1523279748,843536280,1261363637,1758813430,1456308725,1244978952,1575831630,1008597472,60249066,995922272,1794357022,341306895,545907773,840272233,1737252008,1084240224,1783573944,814510765,1936833433,357709962,2003359738,747285158,1209007823,1539309394,564898710,630180774,785883200,66458685,572352514,992880050,1698440110,1169383343,1800358840,547008428,1293127971,346775745,1555428104,1490163511,1209000537,1596617561,930127577,396397625,2012297593,67882545,534184505,138344674,1613743427,1420449145,1905794992,1675440484,1107003699,217395870,371821592,1809448029,1213061087,132812279,1455380344,1594825264,270377443,946502325,1917999179,405003933,1767934985,1381098744,1614308470,158350042,1723823322,963002027,1662028337,1000726972,1786797544,2007316624,1920985658,783112537,108963689,1746618324,152889809,1219598319,831763000,1818283753,1165492862,257813832,1177483099,1806303596,1599241295,1737087988,1971268647,176349493,751135782,1209637603,738488776,972603929,930889626,89136638,74413433,149258210,1542287129,1677245226,309316753,747561685,1027318318,448164565,56977963,216207067,585787087,1730770535,740787078,1061109951,1393909347,653361453,1731150020,1458823677,1186786757,1606848856,1368634907,153158393,261401120,873692370,1503093094,1281624410,1059606430,1494712943,1433162173,2007905046,1488002992,1616147663,467115760,709124327,1586560161,1850399969,1704332864,912523969,1284675646,1898001449,451721496,577541372,1756049702,86954828,774251973,1626397650,742774394,1094046082,1022813578,1294596407,2011198094,1396834803,1403084386,1523041749,1116546466,1009876082,1332682670,957258219,1589503324,1996627742,707101687,33680008,827730547,666472397,1390715881,1743686481,481351460,434703160,1250906671,1463898687,1372592048,1543629362,755074131,1241607135,139772906,1568954143,1730121428,1246006742,1016004839,575967082,1535925257,657194158,531060222,259484973,641063471,169890300,676880404,1101329488,432609498,357370094,1752030812,606066994,229786709,164554047,1574753605,1356260163,482531877,1630163407,377204436,522705091,1941955124,785742180,39987820,1354922234,1456244293,524386167,285334061,1600325534,779265432,987906985,575138387,436738003,1136099405,1434010944,1152836737,941685123,1096076306,1002225869,1930938004,1606583468,1003884965,87802515,1414776912,256261691,1291583365,678982558,1707698677,1292907495,14455471,1280726784,481865354,891685039,1814736003,1761885546,1115389437,1051608766,33751396,229431973,606793073,490968035,931254215,900997767,1917966963,1738504037,1226789255,855956608,1038118602,1699983396,869106260,1425250608,1955102788,1995393550,692439967,809315573,602102479,803022913,793758538,1479242221,205002706,1438856752,885295739,166618583,1633099969,1924164282,1004373978,1887693269,1745567011,1754720688,668082856,926812092,680871841,546786741,1569138999,15354719,868104869,1876075792,896249431,442377981,775224637,364285284,467583014,1639489344,496378534,800393283,1968872958,1038135781,1927689386,998548668,700863210,722308628,851914059,1865384555,783588479,1587080677,478013362,575696591,1495437890,1835831817,696978608,1053652644,1658861849,1223764124,1646332083,816257820,540617236,1777297839,1535302585,62839949,1199263693,1371022028,734657333,1142017474,1510670007,945035865,486565698,1793163233,1889771583,1475171155,1969390677,1676790519,739714415,311079580,1087505049,1150896191,185316770,1831610882,441689470,979364990,577706168,741220261,1503036348,1673616113,95570762,1828566473,1029523255,1365649891,1055244092,82479579,1668024173,399925498,894202061,1958935688,362506415,444245890,703649187,1749622496,1494591639,410966216,125787714,120521857,1460891989,1873850706,170734144,1933912130,213479481,1549783714,326606590,1637429553,171269837,1694942596,1259771676,1791456617,1736134981,642786735,289534969,800456482,1574291445,1836583470,762807082,890578094,1345636161,724901447,1995568214,256888215,81719006,592256245,457002656,1279334379,915146380,249956320,1837909842,27973471,1680375075,462245170,393538533,165692608,732122599,1318413671,1473179840,391626901,1011107851,1067723376,160904586,1459526320,1205993369,757587154,1886726335,1783848243,860597981,456334960,225017302,532838154,1065012744,215804967,1373744583,1619797481,1106370349,1002614405,741700850,1052521,864670170,1452174060,880610574,1398860805,1314989733,1906233592,558726491,337395777,1486508652,494935656,423133292,702517455,999989083,1582030529,903907616,772935038,1414092318,1949493429,2001112251,469172798,1719827539,1497416014,1447606335,1838546041,1817211953,1008649793,857554323,1216025688,654780352,736223656,889860734,617701451,1133955444,1937980603,1377568100,620291871,1942993776,1608625243,707224433,1419438082,302847471,1196509098,490430162,667088023,833888284,141870952,1909412469,507306513,322690318,6504905,1329847347,1807787365,1345203169,628412228,664701941,1674996659,230947571,1553647953,443350268,5118322,764305006,1420039471,1457608760,733933140,227289870,1188600181,9125517,356779310,1589305904,1602544226,216521505,186731927,1013684161,1072418524,1104881306,49859401,662737462,833735012,17670578,418717385,1795242203,1866485297,1231982184,795003993,890522145,1359286533,427902516,573253097,638181889,1158581109,1885277470,1438748883,295656124,134622872,407146927,1289117618,339311814,1666878066,1952129854,655001444,1052209193,1524062536,423366128,787452596,1249885155,1996019641,1324200682,1625278089,1283641955,215518613,911737637,412396607,1285197215,1352884128,481912042,203667858,87645435,1421786777,756208629,386006039,589646365,1316020376,1447266350,962762564,934148981,1516058024,1004895487,202316362,1750196798,1998186550,828695762,1240762290,1350358517,1175133493,1348226983,739830103,1594122494,680556052,1170022311,945202658,1466738593,557757063,1284950646,1732769237,19517000,1993279098,133257030,653795079,1419464734,1894246816,1412353840,851698119,1418999411,1448041541,453596040,263636468,1697182980,1666857908,661476283,1929910907,24486872,1149447215,265401704,1616726634,319056486,597312466,1469236199,1520947982,87839255,1563232729,644139704,1440975649,599362810,532795763,306056479,566925636,1317446912,1680035758,678346329,1681462081,1652813086,1899617282,444990831,1383681783,524941069,588223295,1852824767,1238159129,1864823682,583171889,1861689735,307233177,730999851,154267845,1960868589,392468986,27687315,1927887744,1719720569,882728035,800656316,1447843671,494447995,1161534031,532895390,960823761,1543151289,186941560,1677430628,1307436567,612321743,1194657393,198087502,1457908374,253158831,1280883761,1069159374,630005469,1548804784,1640090938,1814915098,1792403198,774254653,1975892201,1487482654,349615105,1425487717,191981352,175004945,1276938793,423143684,201809009,1968981880,305469311,43252765,1012401410,504340359,1346481319,911043622,332371135,328574098,865264845,1560767836,1924863339,1870782921,956994438,1024253980,623689653,1947345660,1556904249,227716006,1904791746,1245187104,905528515,644653612,333803193,1169526854,1720788681,978065083,90168877,62492068,537979150,1303728650,515257962,754973904,1698667199,176601893,740344720,540512897,1206041478,629645543,655587940,212736974,1693607914,1626720683,309989551,810736581,355603259,1024049779,1327657121,231875266,1881287037,890824964,957748730,1555928422,343895213,204646517,160745583,1951926974,1308923389,601687120,1497229998,660619520,695652516,746096819,189621812,1444595525,761963449,1419858486,903088122,1315758331,1647731147,1530978052,1107848693,605845582,1245993036,617112293,450256408,1509600649,1054271331,593306708,91535022,520699182,968940332,519497993,83563600,618675780,290084862,1339519735,1921349803,1737890994,294194431,108918247,1197675239,488481401,1588673304,1330349382,2006281040,1155247187,1607537229,675136489,1082800285,1327972997,130031393,1461233297,1624343492,48793530,48793530,48793530,1288343303,1265606549,409129739,1799853686,1192895984,219320810,161263183,1179141567,1244533685,1853001716,116303779,1210085860,1608959549,1486996385,332807937,121932953,216094584,1896118201,106022691,608934829,1874951673,921618142,1988121827,426850105,1853048365,1754599356,1593343543,1600903477,1129949348,402528349,1598722862,1797244564,1688877785,1427946177,1771784944,219032689,357166320,1901379510,622936350,759271687,758493294,127364336,326459731,456045096,1206041478,1199179021,408091106,400701624,1536773125,1315501214,1462415250,242590024,1782309378,868733049,172610161,1806794640,1068285339,1434640780,1157543810,977933318,253356629,1151115045,540807914,134581804,595172369,720520262,183282102,513153588,1501668142,1876042729,249897572,1321987735,1096848024,1159753719,1273048612,760967891,261420058,990787722,336805301,209009965,1094907491,328364591,1273450709,183934100,1765466643,1895330278,814878078,1022057887,1346850683,426333065,1825296053,1584207852,148877849,1845140013,324566594,1735353942,376333577,1115354386,1758847306,160227447,185197025,498349056,904977673,330412810,1991938951,1620658089,75357007,1180589616,213084869,1745131091,1254240364,385553142,183882170,1575497935,489299317,1410575493,1831494486,894283402,1684376557,1142358217,1394281501,938835558,1699323286,369670738,1908075239,1488731825,306407152,131148869,579675068,1299736291,442906865,1251454511,1585272936,343627743,1985562307,1763700564,1055912114,929754615,860471754,740899409,54500698,1367026603,16728147,1033057362,320732571,1527328830,205843757,977866125,1732084737,753298802,1367643982,1367231853,1589933679,768424873,1897487597,1421075952,1653894945,577250601,698143212,1301537031,522683549,1771585900,1132761108,1233912804,1343180062,1196506899,1349745677,1387379443,689838224,1311362649,1149426723,1617188728,996297861,1561207263,1391091270,1435282070,81147634,1246252979,1953476374,1827556590,248538029,1644549289,1541245861,1065151937,851633460,1701489133,229432933,1154016358,161896546,713495682,1270156478,1680744793,1252648900,198036384,132259353,742514802,1271338029,1862555284,60639450,1801782145,629834234,1452746845,1554400172,1550737671,656350145,1118885139,1167234630,1641971035,256810475,1152340787,399056885,1981668840,903938865,1370313466,271382554,1880079994,116418825,1452759269,1063684232,600197741,148554187,931525128,1926953925,908705388,222658178,1569129928,1871303399,1774924064,1552810669,410277054,854564237,423371844,1479843176,312838619,1120569925,600524679,416223012,324852633,1802094802,1856388153,1630550107,1573783332,1159443341,441520275,1599721652,355047979,769409526,176878999,1365680152,934108669,1473657915,1696488340,953754385,1970893348,1153862160,967695422,420118689,1583186031,1918695354,44958454,1530865016,1709989060,805500834,1029966675,557207035,1396056764,367761081,1069325783,1750877919,260197582,421662671,298851044,957766174,586099666,1395349123,1795262015,1763832308,306824609,1725423205,907648140,248530751,1949832162,1486166057,393301126,334858997,1676646419,857805127,1300893210,1769729083,747807608,1649887245,1219510264,1158616489,923909835,686060949,361792266,1015432761,629294275,1443022881,1101606479,1524471043,79321731,1790842837,1201463396,1058980092,1216724921,662858173,580054895,1490549600,340614585,1984917313,2012303526,1108238708,1664237790,1672583086,1760742198,28013189,963980077,414937409,1353122655,704209599,68092143,490593694,264516565,1201316498,467719947,456013644,1648974657,1851170397,795697105,1502387741,1585418330,100223954,1114733210,1982536616,693571687,77713100,83608260,948023419,688123352,130498561,474871463,1054531551,1365774450,1866565724,69072500,512858230,553856120,201514501,306359111,1108989185,836502402,1346449121,301894426,1946453717,983710232,448270715,1364416069,1243200131,1820514604,494816420,1097233049,926414524,1719265361,105643267,741660552,235023852,1933801027,1599428553,1808430260,1568744439,1189723483,818287271,1394578942,1143687740,167218034,228661073,1301773571,750138187,1278371290,79796044,968310168,1131162202,1541023495,1794651303,260036932,648445653,1006221991,331677103,19908249,1472924937,1672914554,1728098628,226051739,1575349276,1488436417,1540274687,690803267,1354808466,1145034460,17224695,623129185,70336454,1805492050,1005193341,1949627098,8821859,1884506448,225203276,1177437411,1604410411,977564282,632622587,371518125,1211884680,432529922,424692052,832928498,832526540,838555604,1265115584,1745050301,367098291,1521016951,314229980,553267457,1917611354,35365868,1443641743,581914461,1924252005,1343285270,706144761,661761703,1832658653,1936228909,423682270,1672450318,10703330,1902436993,42419255,244104974,199681568,1471473605,873162273,1115880016,555439540,219638852,4273022,973967831,1841682232,1000628439,341602940,557530948,1196877309,1649733479,334894316,569543380,278536365,365136645,1585651732,2004894570,945185366,1260725887,225073792,937672739,946974133,280830725,385458297,1939000101,209087698,535010051,227317837,841731269,148738852,773582559,1229719275,450460978,1194270399,1382108785,319700214,129638634,1280795692,780612943,1909703536,1826954878,329313471,1326683461,378491369,836422346,702896802,755239344,1719105148,256328257,1883556905,1759043034,381107025,1211949466,1395454443,1197485015,1441804125,1866628079,282067624,541579312,380840775,1733738251,428367196,622751929,973447457,178914676,1636383186,1372137115,236468395,703014579,1646694064,1500356314,1433938479,1243940725,1296106763,1386159820,268771916,1509226806,1757453938,799128283,773077140,853341360,1910147096,1091181203,1572076639,856388281,702327762,1544728349,1462618434,224069331,1726418316,947092640,1375151147,851100052,1263643728,1681850063,1077960619,1669913923,1446971731,1057642663,1772503018,1443097395,858909252,611731637,160316189,1501717995,1739885456,28625678,579140415,1175647660,51609187,1128323933,1293403864,734163644,168970270,1250879053,67554429,1607095297,587237675,1897208278,388983053,2008808880,1195115877,511417838,460724798,81472426,1741757722,187125025,721313936,137721330,728434271,519415801,543049598,1255665327,533259936,26534329,115863331,428718481,220754218,1286717027,1406923542,674290279,1141611599,1138954338,1964510658,1458783083,1443158646,1387060489,114785199,216700791,968023860,425349335,1538607649,1824855963,1639579368,1879127917,1528929948,939105201,229891687,338458771,1353865779,1297621864,1557136516,1277876110,1014806376,865469330,1611985837,750819277,1746114298,563418934,844938421,952526790,1614087954,1276166413,327728456,1738250290,1637288090,1200510211,1703206720,988607746,953866627,1149321381,1203438892,1965333689,1110755360,1146609025,1609178691,1991985356,1501938219,1909564183,1247475346,176718655,677953937,1786598520,512210549,1329751770,495023592,268567950,189517144,505781456,1006613550,774375812,1257831681,141352586,603619769,919597948,1136789602,1264534783,645037666,1356041948,1795835087,1371452544,1483302086,1435332618,280403078,1505909659,610392562,892167536,1208949040,1745458158,1793623998,655356423,1450174549,89125648,640566218,1115124918,691119402,1566957108,938359822,907921950,1642238419,848135218,1709974406,929643455,1639591338,1596771191,1385893937,1982232152,1707667291,370530177,147433981,1745414133,402807594,1560297947,1159773192,403951967,1768268987,1244167019,1417674923,482505154,1945266794,1931795311,491903079,1551399480,312269555,339234139,623103523,465982140,1436030864,1795048090,1682149421,1184603994,1670579618,1763153004,993512567,1850683934,1777139532,670398315,1589783091,884583146,973298789,957973840,528765224,393826644,1369097161,1315516097,1229073159,693805531,1676761242,1829108582,1733543393,1887252319,1297476969,1208749626,595983150,83675312,118303931,1465630518,966444755,1865757608,313581629,365043652,686328426,206024676,1398115414,1056233482,1650392330,1037824300,386990868,1994940799,1268008399,966362875,1302430219,718128888,1810529456,92692040,513735842,1937071377,1724738535,1295958150,1799512405,1075602151,1487397865,1652755848,1967398749,220549987,670611506,1743423807,643494647,1359169471,1279273402,1519235402,813236496,371201071,449633969,1919077497,624156291,1357997775,1984839815,577900597,1314137248,667812173,1882939043,521515957,296271582,1388515417,444503718,1142554285,874804196,1458970796,358539425,1774239058,1884155052,1566952541,627879685,2002943432,1560805352,987366923,1528176178,296352541,1759233797,528382508,1082344717,88788653,1222015323,818947954,1894557671,528022213,685793891,273127031,48282650,150967399,1593769241,1886418364,15049116,1127823070,55958486,1378472049,473254419,471899121,554279396,332405192,1511448301,905592698,750144199,1180987491,1936762397,1661156006,212040005,72093108,1528366158,1490240115,1153180104,2010852032,1426536589,1448066154,611724509,805877404,1581080821,586507158,1161608993,1621629483,1989450081,1441266386,300525544,1218965510,1064220966,224107826,938631045,942435625,796380344,1403853050,1837675616,12809228,1184427391,1989239532,134220061,372359899,1502187158,66421694,958312777,461562676,717989479,1513150814,1529717837,1560440660,806112342,1495044838,1324244921,613363776,1937220944,486252749,220423458,1242503500,1461013140,1261105665,1909877092,561820191,1353277859,1955896182,2005944638,1216436347,609259657,1485984830,432649869,622534845,1903244172,215297185,218910200,1039909590,1635266778,711172103,1178809112,1602109604,1027408864,914898736,1644540470,1612021740,653499809,1522919210,855285863,1015350924,55639741,414401357,331531123,1837204923,55160861,1731787434,1330974523,1479072127,97031484,15364619,76562900,1410373837,406947387,368431322,900913364,832476386,558415642,826175464,1469269659,1605460846,859634292,1091570334,305094040,298240685,1562242529,296051522,1318989311,1987619275,701122960,1580238929,1945993338,606520493,43050751,809098220,266802523,1825640901,568675341,281811200,1510612569,980887235,1730299124,1090894734,303302744,1854702070,60256728,1186978333,892589698,458839503,344253804,1151700298,1151700298,1151700298,1649390787,1919516259,1958918460,1293968117,247187390,663592269,265335296,777080385,296413820,947198769,1792522791,1049042684,1794885392,1441864681,174630550,1270204426,1216186442,1877795557,956288250,1553234236,863367876,459944237,258944820,1970388100,1838797692,1006028027,1827599963,810065395,906986446,442538249,752743843,136759587,566656953,1906919202,1789776749,885676098,1515316977,327118925,382546356,337450403,45304735,1327202150,796772439,1408190859,432649869,395660887,174993503,1836407332,304341243,94317408,304236589,350536544,1638788362,197877499,759212009,1103237532,1329584278,1077800158,653896249,1766123268,1897301481,759601252,727048759,14131486,1621939061,1233480614,411351399,872608620,898258854,1263449155,422626867,1264082911,303395044,1544811774,1114180628,942271072,894622766,1390887915,195997157,107454353,1817416686,490240811,1165251006,589561658,832923976,1809475626,250834002,1015875591,901245474,147852772,248076616,954176451,737316814,719641405,1466632590,1895401675,1688371977,1341549480,1931952680,696713133,1900419719,683524587,639123136,1522720566,1851294222,54245248,1955964485,797340415,1622074104,1418084947,757074082,862068126,784451325,1895932186,1107704908,1925000410,284857431,642912366,99357072,88470884,932403446,327306557,605927046,1991074589,569609600,120131605,1294102806,436290692,3595803,649202418,476177112,287315207,1109689115,189637123,1066474545,1881359227,883934081,732716609,799964609,1244890904,1936200452,1987303953,374902846,1202050450,1741825800,103588845,1132828362,1530388306,1515412774,1405267249,930995848,1870068447,1556260271,364685981,1735801441,623104035,284662639,1337829429,1579962411,1109101682,580192860,1382142812,438634031,1980541383,508850489,814258671,844655963,1316160401,1337559086,1329331396,1055696135,1705417191,1203155311,743318106,1999094495,1666303263,926085499,1989737735,1243273886,508396542,935572891,401389217,1088034906,812886105,126706902,451754743,664825441,1616460200,198583152,295598972,1512754981,506591384,666096982,1039952423,1511752931,1645619105,757546539,1041646123,291062197,1425689342,669366388,1851688912,1802432485,308430824,580803128,358372838,258747856,521346910,2004274312,1745303230,840150221,1518083025,1062760195,460432386,1115510437,1622040615,1049075130,41329249,1622647676,652586797,129871629,1103394486,771621066,761580321,424551790,572227280,534377640,1035217678,465529768,546348129,62482278,1998205950,201185343,1627429580,1913202371,178002586,701038832,852562644,1017613690,423713685,2039896,1771384691,638996200,867557076,983341058,54658733,1283123052,615243188,1013894468,1204582002,94849146,787895013,1579232932,1129315965,1891632669,172533245,570472521,1367692083,1722597095,1060887611,200459113,1266510475,208492952,1825522609,244318681,1612127423,1738945046,26501573,630193862,607933348,881654076,668936035,1894117715,403187322,381801119,1559839589,1352886861,1885654575,1168255803,726468297,1215063955,719653572,764981279,1327210698,736063594,1256750476,6976422,1310460537,506498370,1963863348,548599187,1329931048,1151431313,247647241,1795794803,170270796,1536305840,329046142,1593870304,823145057,992490486,1247494972,1120232855,1753981433,9241945,919150585,1551081115,571927988,15877431,959372123,1734673912,53396661,443029213,1961208090,681417866,1396220412,1118935435,197568718,1992335153,1522545333,367686967,1097554423,167732408,1411552923,1388984637,643657524,956176788,515048217,846860985,428114265,852101001,1097452690,1530377269,82489615,1438598141,1234414765,355301858,705678176,153987959,455545665,1952874835,1669470971,493840430,1185278693,341936703,896119132,68078568,1864522223,971590759,806282726,668250362,1601208732,1652607795,435678776,1714396790,772314762,572224583,1007812139,1561504917,1321555492,1498104927,794797539,406978562,1873924365,725362251,96491183,1645340081,660885959,497043088,691184750,1014824182,1140630258,1198861370,262794359,185269985,1775163490,969440023,1918004288,406254413,842657816,1102573144,396040975,27897986,269301215,564889555,1662091317,1492965303,1169288190,575474681,512823271,1776643842,1917860632,1966775754,1467904238,989074007,1051280192,1020779530,1944625279,144641178,1990934742,1157622448,937420051,1157429584,1520564763,901541540,880540248,1801282862,1138074064,353574326,1792382205,1019743932,622209561,1434265747,260647472,1576980924,683285292,2007306511,1888607130,1536831712,1101472009,1613476574,1646971585,609017169,1976545159,1245378456,587373928,823694092,640571524,1613873398,1553229746,1796161922,862258461,500105605,221796285,1906736241,1711583833,941482510,678012679,214111325,1900330675,612603399,1843383647,138264519,1942077371,1075493683,1303550760,629137763,1333055839,287938923,464065807,719713860,1588407027,271908636,1279865283,386053487,1598867270,966858499,138270303,650308522,1529907737,1081164812,1663824869,2007479257,1657424824,279999015,1273872811,775514548,1562539982,1349953440,730536421,1949994996,332924656,607400167,1095096445,421759620,1493894287,533606555,1454786937,675274313,250297626,1490833227,574270998,1780978409,174975857,805355520,1322808283,1440159935,1613929246,1600538410,751881933,1147083674,329256087,1841574819,873680565,1761480812,1324993563,437595626,549373884,1124530647,758296716,621762737,1893405399,138713725,1175161234,1681050557,1448575783,1680600928,561974013,1306258902,1331326995,1955981026,1335345900,898665716,1943562226,1198896036,843230161,1792102664,583365814,356688872,536761401,1917740407,927725015,1670304922,453614921,1293731322,1839036173,1463242884,601283270,1377410928,1931910400,963430370,1071088898,675330477,607980738,1528730035,741319150,1201328401,973628290,1826495061,780973516,1368792008,1001109795,591813763,299289474,232557706,1503331708,298909309,1967230105,291279736,1016488782,1064977163,994787785,534328574,1377876002,1195352089,349060173,1705563132,1526733562,1093106012,1367723488,804267905,2008751,1882442576,133599635,602169886,1235605722,1010013195,1711075239,412801247,462995021,127100549,1463188891,522037898,840490931,1982491498,1241609851,1876204279,1081917227,441155527,1344754150,210823505,1272453120,1643042789,896218401,381151748,1055430586,1012472292,1674104269,4478535,1858215872,215960452,1815820847,1525144335,1506764309,267145471,742325849,1321745889,1339432187,1996487509,1460408791,523866865,1078104213,813317295,1102595576,1282386936,1240818609,1696130208,907739803,377676644,40807407,1959168062,1928817971,448368943,1473661104,1751942290,538676010,1790976163,1763943861,479990235,867527940,1446995695,1353985034,1632396950,496438951,1720361899,1978416891,453046100,981827413,1556532297,345514405,1682314855,102003668,488663829,1402155215,51136264,1458267657,678894100,563649643,1576200129,201872655,880291702,497668851,1859871875,359327356,1377218678,70463298,1753304261,1521707973,108928297,1209087748,971650773,31032656,1088803869,631027048,1679959254,668513536,924449934,208314207,228816397,1094341173,1894886493,1789221049,514645835,1869301901,468578146,1442016419,1914171953,111468501,1248715655,1152030102,321397236,238199393,624682315,1063887694,335446748,561008034,1397540537,1952906152,1394690455,1172310341,591646436,36435509,195456124,499094967,917756988,1599508586,1881455408,443452274,307595607,1938528276,118551594,1779859898,17560602,1067009218,119275055,2111650,1579687232,1018649750,166851327,345085073,27160852,1863723517,599153272,654710592,1546075657,793789878,955969517,1293945711,120464785,1649172436,244451788,1864081516,1651286613,777704611,1253546770,104447407,985417350,567945450,1733654584,733887504,1790755744,1052775562,104308269,1788749532,1453954114,1493557871,565743511,1234417046,23771411,1251034722,1172866000,1544951662,809150857,1089049591,1072434929,1152173209,1799235220,322204303,599324649,1163164405,1884165351,741217291,456914579,1673345556,272740206,1042492392,610154364,718675564,77652746,988669853,994720617,1956295525,441183812,756917344,156925843,1476168325,199452863,1090585210,1320306472,1358869979,283244218,982407903,453695178,542787099,378386938,1509479910,730777852,645337635,944243557,1527788647,487998607,262040763,1396670855,1227756937,602107663,1250423138,204349863,1713118337,727341232,2009059862,1197789874,882497312,1444531637,565212406,1599255880,1987132309,946805046,615904363,546918249,1768979133,1598617926,1723591895,1595811609,628283515,1112251505,508433742,1273044126,20071838,1036319980,1482114900,590997654,78124823,1114104040,54311837,1391552249,473016485,1792470590,1339541790,376513618,1730563597,473550405,976858233,1882666424,1832973464,1962515849,1709378960,764535940,1462563686,971235791,876841455,460004945,563507180,518763537,266234726,415150889,1764345057,1099605413,1733425719,1411705631,1924219064,1586788944,1246172845,1405109437,1765591500,1820650673,754070158,1175865957,1286804701,1315429586,1124974558,639898247,222081151,60631379,1781684308,1000003910,1815503279,1763115406,1372160161,1433376069,1825276627,554701621,204359866,1728574110,1611265151,1210850052,538403216,2003693740,934072084,1491426079,88914439,179655368,812788595,1686592250,1937035353,488787732,308429220,1829175385,1691807289,1898951003,1608791696,1743150754,94421291,1487238236,497794157,1688484268,1827686267,684985289,1759794580,1690136086,160780061,1138356354,1920507875,757999464,933258243,147501474,467119798,1178281041,1725996589,1258406998,1027555176,915848652,512466467,1113090241,715853334,1652511035,1978992885,1236688445,1961130689,844798966,1422317392,1801167447,456069657,678670279,1937765248,1009519107,1126344255,780691644,1199039480,1419450681,723969604,24035753,798495679,1884262302,73235610,1956359778,547055924,130087744,813418755,1278433996,520967250,1806482738,1482901841,258092608,195271174,1041397418,91575334,1096199297,2006341384,620915647,1409732516,1931430962,1704067525,525862780,996065959,1194036393,756315325,765113564,1053652391,1066368682,1110425228,1893218403,437477377,568799148,1186350820,998676672,1897813973,1897813973,1897813973,1560504305,418906010,1393893602,968274381,1796049854,37446887,676763346,277160826,1478836260,767484323,409171148,1012084530,839190775,1100858191,1197717681,1570797834,1198655398,408293092,1331421283,1150247888,1307233903,642953441,1162067274,1401595381,407596962,329173484,1940913747,641337350,1477686384,1815683278,369403747,422362940,1528132372,1692731560,905984700,874090532,1767150223,626312806,1280578099,247900518,1849133709,198831791,1259582265,1672995561,1690136086,434643503,1294932376,1472646229,1736482072,756429897,317136641,1299749674,145937294,336247467,776692714,984683711,1935005982,1842083878,1468764909,453616928,1244961302,765216191,1274926980,593919790,12083008,991880802,388835801,1841741871,72115790,1761355765,1141228152,58377515,1619600590,1642432999,1980915121,1055714171,1805816851,1771211397,973624632,1518609520,1583906518,1894833071,443064817,1710509426,1292739973,250584354,733436834,294095895,811231633,1975358080,780636708,821782569,1131514969,2006122396,117666966,1356331429,398218269,42877801,347580174,732195605,359289018,1024259918,1572521774,663392692,1460157909,633066115,192202708,882541013,1483615055,1729359627,973513826,1349305415,981991441,814130087,421714995,1652438392,846361512,441169659,491540974,538646901,1952270332,874599775,631496156,194743535,314005003,404063159,1862093100,1075690680,964365699,646570459,83856717,703083701,240473132,576581612,626055367,1634012225,133495953,227878218,533830264,1048340566,18664429,1176895310,509194317,1636215624,1028172568,1844073249,1839275034,654209671,1561695606,1317882125,1276190240,52415343,830349403,1191075014,573367369,56089494,534916551,324056802,1984454583,520677485,45225280,1699063741,205009419,77268043,830647271,1975541898,1287490003,1608628498,1720548060,512964961,1937101575,460915378,934110430,559247378,144000075,528097178,1831166911,785575781,1686146652,307265149,1869289407,1168768559,1160423249,1530583796,1721689367,338226891,1590762686,1643981403,103063238,1454731476,1698296533,1202541763,796687543,900577975,749190897,1221686755,1616513771,1974914026,584814366,1326382125,1575921169,659494264,203466416,394533597,2006750912,717233450,753602384,498395029,564395770,397423583,641721806,1137721093,1006636915,1460492594,315403866,468805497,680607346,1937945468,972155616,72483257,1691337324,1484456098,1080584654,726880669,754260032,941534986,1455713718,35195175,418591422,438780661,1472345965,699435448,1821831992,805513035,1583983145,1338969748,500454397,1504422163,1334515393,1980348842,732220685,217186887,337598585,333582624,1688205136,1396377522,1034006036,1443135493,1242447684,1039265086,613489149,382510261,1494072623,883638254,512698869,623175554,902035970,133349764,1350418830,1680483194,729718278,81333764,160564067,169946006,1801478991,1749616832,101254284,594793658,878818575,1287426918,1242786991,1931583755,725359598,346356056,7717670,620974784,61215522,95054513,1535509299,90092360,262410789,1879396867,635308911,882338595,492820033,1187713088,708886642,497685143,398930876,1242392145,421514231,1269611817,1899593865,892171229,1230931605,866167849,1271311556,531538075,1689562141,1809953863,1834046781,1606200494,1433951961,596380750,433713218,562468535,1954094022,1207693851,120158361,143588110,1882899873,1813529681,850263245,188859516,1334818721,929982887,1490397376,411079369,81790853,45014806,1358330032,364029788,1702250870,1502725982,1943298114,1656542037,1608038744,1249365801,243509488,1584089216,1576395702,819018680,711052022,386998720,1118037346,601664799,542950606,1722539691,1216258631,658870182,954814094,1180755789,1839789745,740071288,1385405284,443908296,1027222992,332582332,1233324299,83049911,1486291324,687005002,122282733,90314331,629917794,460872557,1896660418,382141952,109213567,31196732,952459962,713133456,1842878108,849114915,695784076,1229385932,683747659,874745636,939311417,989819975,2003702272,115070372,1130036945,1749996732,133769348,816433937,1432477745,1829946319,1384172145,253558271,1843492929,542973723,1548345370,660504274,1904985686,925624448,521478160,13803227,737134329,154014023,221483277,1389063022,870086588,1456231741,1886064605,136084572,291388160,467867908,1521704990,1268345512,1730466538,174246423,1436360637,358099543,942543587,776846572,548962576,1023914622,1336882050,159832891,46330908,1131159671,1476245626,1868373732,1593307396,1292993938,170408667,605806972,1048580377,1466761139,1507496577,1216166802,1767527222,455402906,335066142,5088054,1217724475,1284356316,1927791210,1690642854,1205068116,1645795979,1856444078,640133305,167231861,647980045,428795169,393568779,383757878,201438611,1935282186,1792228299,575458937,352389598,212463530,1453396798,108619088,1491033209,1806416036,929994616,344606583,1839104418,1879385092,482589923,561516994,1200403021,1951113842,136351148,362098380,313297122,1429917318,482521715,752316895,52941947,17930594,324181160,1450005954,1010865896,947044348,1224705336,1800056395,1494123980,1614734011,909974730,1211258296,619502260,1812317212,51847623,1304473300,1134029026,1129983457,1370837605,1662266992,908097715,1820242641,628640139,290822446,1843218445,1566597513,391841409,1864512302,1000383431,937979105,495460099,1632841925,1911067313,1394351084,67789427,3673642,818619232,1175400422,988764748,1751527127,1706584389,1282670011,1807711228,1088763117,1854077669,970097139,844878591,507244386,770687512,1669293249,1993290394,604243714,1792149132,933411855,1868111497,809225164,477134669,371000199,818609103,1298722857,1472995978,1822210284,1247278323,1102232879,634923890,1189387998,40300395,1336969667,671512895,297377414,618380507,241860669,104012924,1824213936,680710788,1593567774,1827918218,645774129,893450353,890731982,536587228,655885478,1636505751,532897127,758858999,1165523317,1386868746,952565592,404184213,1398288591,1772707712,273585882,970595670,926577528,1042504066,544649365,715159284,571709621,1301915625,1329054104,190586253,787471557,18130399,487991003,739639098,663225209,681991782,1710836269,927839231,218033349,1752532349,460108503,1873454121,956317345,565047750,1696754315,188717913,377766809,397260982,1474747978,1011824004,323719808,1437198535,492019674,437787530,426836874,689373393,959161904,379642930,141149436,1041274794,303163785,1748665251,1029393722,24430620,1237430245,636229800,773966970,1558013215,542007957,1607870122,779233170,496987233,1724562268,1042757637,1347573393,903801210,15017599,49838819,1524353225,1483555592,300779724,1409717176,1254838583,1879611611,1015709556,1208945654,540488510,958507437,395524103,314175416,424161775,1361724557,1943767065,1209362581,985928295,1746846746,1598808638,1511680508,1564856301,695138841,736780737,445141088,761241002,2000911016,1467049933,1113225727,1702891770,827744762,2006422903,1854206755,271224667,1729556277,1106345926,168185300,1019430325,1390136357,1206628066,1921862961,685858779,1753374699,1630247024,650572375,129112364,1463853824,726224947,225590000,1872626906,1066109351,126987928,852935994,734551326,1597749592,848224713,1208431725,1802178657,599710180,1730576815,1813374690,1629214548,1004066957,598201245,1193572686,727432033,994744884,683602771,507178065,440460331,733820149,1293480179,397853873,485016239,299167877,1642272850,166708127,994684373,384759726,1722712538,2004463528,1648475461,1448490115,826797673,996355738,1447026444,1689171877,299364346,751627719,1990512355,1321234460,574861107,760818436,1221663392,1247663330,1645755113,1964477534,1053443308,95770653,236355495,583495370,1111851837,144616622,617700009,337082419,1660974138,1805787603,942076789,436620354,1411211650,1590279267,356197290,484056979,1384842052,1508193887,1064741877,677216524,1167633381,280208037,1887831562,687705860,596641962,181932735,1651429066,192369205,398675780,1717863303,329326786,472409433,855217876,912236023,285896555,520041279,1082613025,248617646,1599935653,1737629993,438719247,1887457175,1965068553,274044421,810213733,559418480,951173375,1199627369,1640129047,1253734316,1598765389,437979377,825162620,368315099,270977821,632985059,1472114089,408818534,30665486,1901547969,831717698,730577389,133098285,1791690483,689543958,1306101835,75804357,271892894,1620381062,1169425744,114890943,879136095,1823634733,1963380990,1313667700,608209232,1063180789,853717948,1835620498,933859724,816524869,714247363,258603501,253555529,796314416,1846061497,1699340396,124460878,1980094906,221338066,6299289,320452429,1352823423,809294941,1195316880,1526359680,1327969189,94580857,838893410,1217683309,142473186,1768923794,938254853,1920698406,1533612291,1046154846,1184467803,1760634050,1308067618,614677139,991845686,235545128,65654976,296095098,1814459596,1336513305,1714224077,1693915106,1814550447,1258521518,2000158748,1358374493,271269232,1464393262,1869784751,670282094,1168301607,382093038,1376024742,160095291,323093503,2000867048,2001405198,1598769377,1815763064,999312754,1919778392,1219303348,1153065889,444156565,872645519,134382231,1872265141,1532319165,138214739,1399545964,1907357503,722027354,683011356,1279776862,1719233010,107229944,492633362,1827765935,1284805496,1596831931,1575509635,1160914598,861290145,93387019,757627717,1627890713,841494382,166068562,1520172469,1353761740,1504676249,1649451757,1613726694,860559457,280704541,505108486,566677464,1787947621,1707781133,995459109,295094680,966579391,1037412746,1941626075,72662983,931427310,600949499,1172190480,1922208536,883801166,825795426,1560298777,1136154042,1120201358,193888448,440274855,1067236100,165356504,327376130,326632214,347513325,310758219,1761169420,1812736210,3422558,830677226,975116177,976596672,1737950962,1483887464,1486830347,641350572,1119368893,203618639,1000398399,560660397,181812360,474388843,1290352360,1842800534,574080805,465448098,1101155531,224281260,294172169,1446776446,1263824173,1920932938,1973021035,837863340,233625728,557692098,1066586790,333921555,1224354927,898761033,1388463736,1904422817,1974911648,880437493,1737877748,1812177777,1812177777,1812177777,213601582,1972620175,1381383211,986648703,287422882,1746367700,1107708581,1627804179,1920004571,138373326,1873826794,14785471,244872075,988196824,247022517,1587188471,20970044,1924052939,1502910275,530067411,1279628790,1047192481,1483620253,1817123874,9040619,211313372,1090984352,1135088535,1482585396,39728069,1328323125,455972418,736040575,1045101378,156061986,1992205715,1766893702,1642523006,1326998675,251387229,778891681,1488682327,1271085528,1017368003,280704541,1732228061,1072333097,1236604862,302011795,1625064254,1959415768,952500560,226730537,1783285224,1942369935,788993729,846173241,1708788862,18988923,386374134,264371912,31118746,1899727111,518597854,1944194078,1882244510,632849381,719740856,1218571720,894635377,994888211,276082419,1931871484,992563081,143987729,2008156129,1458423368,394074409,226714321,325660404,136432712,1073857110,1151178061,1382443226,1245934995,1744356223,467455448,1284451604,389807384,678713450,1147636753,1596088816,1526065447,1722962313,1848557172,718973356,1351065999,1528304264,1603190852,474788522,1934216504,1031491139,1411555078,736032604,1762933278,1304655146,982578389,363470924,2009086947,1884396984,864010104,1889459200,1650370054,836732921,1768114651,292332778,2008642858,1685288561,1981208986,370767048,940144537,1158420079,745857651,1845088892,1019718870,976750465,1686733395,778859081,800838255,95389689,261569916,48252480,868975533,602701298,1381927694,808466343,503144717,721075123,397340680,865491630,1578725401,1009503728,307336731,1761518305,123557541,663084644,1040855655,1069952195,1861295077,768963340,950196650,115802921,1396202554,254245,476185678,246259882,1777094291,476863894,911847242,1988719350,1298518358,1353346846,602843737,819896307,194710339,840590725,1893127092,1877455952,688925331,1762031191,1608320656,630391656,1674632802,520326307,28220262,1333551100,64858008,336510230,124446897,676516511,1537009944,30577698,1906602250,1708149676,602689275,122125350,1218238203,1666871853,989871309,629228615,1302135497,1396760561,1053298384,594643130,14558897,66468412,995274420,1998663686,1576766473,1859432023,398527758,693346991,1594378254,1090742998,620861830,722685939,1620682922,1885158473,1379312821,778558916,1685579606,1094683346,834186326,1724937990,1877636617,1503685240,684467358,945659762,1314738502,468330213,1912052238,1279318430,1440113292,1554998886,1126050923,494896680,1675838140,919498919,1380343216,1631242702,1546919108,1000002068,254235768,1008964371,1735039577,1036963667,1171610276,512732457,944583502,1946783740,178189409,1317577765,740469139,1744916101,1290458810,1411243771,1509252600,372028043,1265334052,679293659,1544827369,1194443616,746235188,408261540,1945430386,1941925370,43896033,1716994235,1216426852,562239019,1467090348,1993553344,1505736365,532963865,76908580,1897902482,1451477923,631395335,866944850,307926577,479692009,113156480,1569553817,801273998,960838980,1475368732,790122732,1347999724,138367504,1052526766,1354770532,1919012056,1575967626,1330149149,1666707794,321626333,802450381,1129316173,54826133,1062709604,429429279,216074985,1976021511,1853002061,217771245,1872688585,1917406781,629794498,1384214037,1339179265,1728979522,1930693586,1952153259,259277194,746734341,964408758,1378838990,865035359,7192046,1349742732,943996039,27121875,116488064,1042200868,381832512,5514829,228109620,112355893,357196207,1341574535,1039006982,1617365851,1066255256,435600504,468148100,121451707,1504798939,479211382,1056172419,602894116,162082097,1589350852,1463176287,654007159,36296914,569564214,1974846875,651065802,1125050821,717791571,113591049,1359767804,2005505112,1345082170,1046077358,1363114804,1427609061,1185459323,1743488926,1407868156,87547539,115887792,1476960261,157273447,1061327121,1862880021,1251999752,1940887017,1991804546,451431565,1812083141,650074989,1999603518,322895706,255720022,1295972459,1410841858,1200558297,1687038928,1227530911,1853866935,1363946859,485445762,870270816,164538973,148123785,1320819165,1562306976,803393601,961478430,1116318700,1531994981,236756814,909783069,1155217578,166251116,1965057236,877629690,1539726337,1752176188,357672693,1461143986,648768507,1041676967,551778734,1549967641,572046141,881181439,1266312245,1782938771,1630305386,1473762802,361118544,577543507,1310273047,685598598,979599817,67872149,753834506,1886579420,1312941172,1912241056,1626541710,673083738,275066339,7609153,1374663861,447760356,14401472,1703707211,625994456,201359539,833196009,608654832,1171928913,1742951694,1585487261,1167205124,867585005,173057374,1268027481,714508512,1173219190,398797530,1337728194,309540702,1698799014,1068304994,1846559696,1700296081,911220959,1479579467,406236772,941443531,1892590149,1687042075,33426981,1164795599,1682234384,1225032325,1082592236,1437998774,426675407,767214263,308834690,149185721,1103381269,1051395853,1535263373,1194459882,1004245253,2006529403,591303165,906014929,175289922,12703422,1308443585,1119875235,1863524603,636389518,771503257,1967816071,24014498,1487136356,1339631988,1436569585,1051343004,554229057,432728835,1347325517,1063389953,1160292579,1657778084,1969766213,10641929,2007966381,557349565,1253618163,351245399,1696286637,1655146834,1688096885,1909058536,1177554136,1900590683,95747304,606629811,125021934,51669258,97531382,846749694,770390092,1414663244,398141427,1182225887,1695444917,1551974837,1436462486,803675704,233670372,132052987,1467753168,1461074019,1374121065,684402007,724292187,605501040,472793761,1509229799,1269784466,558314293,40009195,1456930322,673040346,331337718,1626851306,1848119381,1440605366,398913807,1341035580,1371330177,478813200,55966728,168536319,310842797,1672560290,343702889,1790232421,846894328,36878336,293100946,808890456,1256301402,1343562729,1732107165,1918044268,91338740,651916579,1890719057,605768721,1782864549,1537266194,334276483,431306959,1569999813,1654909234,1269934618,920224573,1165290060,1859705969,1610169426,1931808307,1309208543,1487504197,1934586028,1787724168,654563673,1487543137,20360736,544271228,1577120057,411420851,266818889,955338606,1677102004,1647931220,460833844,1445249711,279396297,1044521580,205326682,1171099113,74929902,1902644822,777669637,1150623645,2011787856,679973731,1215335816,994157014,1235066405,1466569899,1185809586,523764437,1181643570,1420738105,954906411,1699759242,39712079,738555460,541613710,1505388620,520939043,537020156,650638585,1086800489,1764831008,755997481,454747117,1121263896,1734802372,981671245,632395007,150916709,1259957686,689540045,37866315,958034539,1002658051,63709133,604658089,395355245,1909007679,1829379987,159925989,1493835846,134463334,109043307,117815988,882944107,1139846687,1026591979,818191166,936013213,712058466,1258395745,17017619,1503037579,1107765635,947643104,198559843,742674275,1076336701,1745895200,1667419664,806451574,124261714,1616059701,1447662247,734438914,349242492,35176972,901828981,1533527603,1879769927,1044915254,22765908,1233518587,1119449724,1252494137,604579824,883759699,1419462388,1008333281,127745019,866715924,418549245,954982774,125070470,960617124,475985171,340476450,233744167,1580589677,1784277881,1803181268,1176307707,1626208161,279034503,115176985,1885901656,1207298895,219802616,87905109,1296376621,957013833,701716747,1918799331,855757447,1692459690,357160498,1998274547,1749015107,1912189476,1678881456,1651803073,827715826,245952030,603913870,321165946,122488567,420350097,428683039,469038062,950779711,1428363895,848391184,792466771,432937365,243233914,1756219164,1374614552,1232882983,204539700,256445372,822944963,171244699,272524374,1742111227,517547116,1989631701,328450127,911959116,606267017,516833714,1276017407,1179526493,1655874761,1156831203,937482254,1728781566,1971238874,198010432,1690851246,637360778,4367071,386500337,1417982120,147010519,562448081,1357849731,1560159435,1833667755,769691239,697955623,1946779782,1886489955,1905919041,949841480,1846320629,940870856,681346709,686192158,30247071,1261263857,1778300022,1528452177,802779530,1830519417,327818592,834906918,1537264828,709196934,214825932,518492380,1259965397,943121788,1903013865,860305470,554160640,705940081,515046949,1223809284,1114072913,13125605,729707062,826052248,296531500,2000739904,677887501,549251852,473828856,358863944,505992977,168386176,1387729860,1977427675,1157388906,511731821,58558049,650825666,661202518,242905716,656558698,1880388663,1016433814,989062001,1171203504,1246768302,484278295,1425002283,761938006,922315367,1487518212,1712398293,1758813100,244829048,1773545540,1156832406,636090531,1448186579,701363724,415895352,1396598485,401423667,744418319,605426432,1396766980,2005186416,1870696719,400953565,1843152030,1003078503,234550767,51187360,1712468543,1030206292,637913042,406431455,1579138895,1380702513,352896746,1433112464,145232952,1081142694,749021097,1760085883,773022884,1888546759,1158970172,411316980,879959975,1933224091,1025429345,307726440,1010645585,572369207,111071429,1033090336,1582123286,886350010,756443065,1468128386,1279161933,504825151,625692606,1706248969,1693351475,1992630063,1600972123,1067025318,541503015,721666357,82094246,524435993,1985244066,736245269,522881389,1061619439,713993625,1860602741,1560601670,1900284594,680881224,955322649,1767554597,453367428,1907087844,96622472,48857099,482342483,158512601,1417554216,816828737,1049819000,110018402,1849868661,639409674,1308905920,1478382334,227594861,1489529250,1630520220,1088481125,1462578665,47095066,1529139100,885987186,1627532663,1477631164,1747648790,745666193,1294464882,1690996550,455582910,482138450,1555384134,5728799,1719526500,1036771399,132548706,455929406,1588463137,1859679615,1151010018,239034299,1811648777,969959122,346057570,1264704884,1359731579,556054192,927442019,384518486,1489863207,338347788,1485892173,1938794962,257909033,736266928,123940473,608673967,1267357,1729454130,722421139,1483068294,926139855,1066169452,421527625,1815828731,70231306,890483644,1956053049,116008193,1468177834,1602599292,1602599292,1602599292,65794436,808674751,1217417583,691193110,839147575,549799650,1436671303,792037472,1390492786,2010469452,288427372,269325200,655161004,733565944,1262580728,878218898,474017161,94038655,132570497,1495364983,211178653,554031688,460724897,1472697848,292731883,1951963218,172652943,1786846112,180982764,1712763688,1527819984,445014845,1130393192,1691871414,1155370291,1569705915,1939952319,1404788111,723098648,1747823030,302420153,1172559977,644449404,1337676337,96622472,786734742,78919526,687348340,1366625794,1440525953,180616203,1139449806,396259418,354742560,1839073712,351072688,201554102,1415016167,296925803,2007894080,1041121973,944196590,991714320,1198793567,1469231519,1863828760,1377486,631194028,1100446493,1437945274,1052776607,504782196,192277695,568894043,504201025,1421911768,821908253,1512490102,108143689,562482478,1061948711,1990339559,1368050074,601518229,1928964295,926303449,17859867,449903646,1533682475,780633612,471373237,555563225,1128946539,751967582,1762305060,525944797,1400033874,551259844,1781508363,1472124362,1146955698,341034301,1469043143,319706220,1282999358,345119531,442072194,771806796,540418646,1534299552,186096811,488518157,1925829216,318323423,2000433200,194421473,176577684,1707766316,58244310,1168353496,230371234,100837260,785743561,1682794155,1440229805,1968778943,676621112,777668722,1957363589,87879346,1008370870,1139744626,914917179,88022461,1062803823,578703745,988344208,1239910968,1309819564,504833792,1537901896,1316102127,1008036909,611126232,1962789775,1256600406,165542529,758268753,1893592047,1803183372,1120937591,346178594,1262652557,1783061045,1231920656,1401119583,1184626618,838947189,188265123,350520474,990565789,948084738,1198189406,1887266951,475977967,1290006654,392124836,313601836,1674760078,330869075,1283644221,494863850,465795740,2008974599,150076395,361977929,1017130318,457767740,159278638,334274946,177359518,878904922,952509494,1624743892,1773065584,640631641,374378956,1749967787,728373590,1016066979,1945620339,1160544708,1125761260,1330426278,1174016823,1027756029,1291632653,683645395,898517489,1771943891,1497500215,395991585,703219320,228963304,1960425861,607161112,1802497084,1576998877,902266590,157715166,1138322549,1318992377,445572671,462597457,1434329962,1339311462,485176185,1880988968,1720936148,1170209287,878499971,1999275863,38785676,450683945,184581805,469560777,1486698969,1500868547,160416194,682750188,701683812,1146660279,1670740660,1695840055,407559712,1686028750,683007447,207122642,261623095,1936575590,1370734064,1983607318,1358177048,1188900837,1217737418,991696481,1493939397,1090990779,1741258284,569595103,2003111415,1071494793,589806890,528263775,407541707,653296995,517547007,726747655,1475629160,1978218414,278725293,1822758197,743307396,212649934,693621967,1118723202,271271660,1037571318,996987808,687630923,614773950,358954989,1361140821,687238088,368944776,499002227,1689413140,132390198,568901203,1434214805,1852278681,250455204,1984001497,1460832772,547165770,1423453616,839520673,1728039419,1867637376,753576703,1186154096,1816764049,91967029,1579743042,1818153194,1001236462,495398013,588905449,631124105,330675668,359328665,984583727,1124314699,1553382151,574540760,144863158,1078884840,1112748315,280596538,993924724,1616124353,1559308796,592993306,21310411,243561799,849900913,647599438,273868768,1797238644,627846682,553542294,1647066505,1961029606,1479588030,894552415,1606917200,1367044293,731609328,188313439,1616269534,496070338,1301141026,1915170398,181758643,1003955764,1706964687,1080164122,1829595371,188825138,907259556,1323182917,1358445732,1341111164,1907308975,1686400941,1817036708,1739239891,1960676830,1232218573,352770007,447575744,764161164,1618358656,859523674,1709159497,1915274041,318621791,685155018,1465148140,728761133,386801728,2006444819,1517945855,1910911795,1476403979,789964242,133032834,551112549,574688978,532771461,1071938729,338380683,282325850,1414305403,1031204849,139596935,780002337,197151985,1864418396,116460557,1817113169,851191626,720526087,1176282871,489080366,203973247,913627218,498750446,985787572,1338046440,403309318,977454818,248436976,1250538423,1849220710,1582020284,704386566,1205959144,355649113,1535930119,558364242,1391667180,962362928,1741994318,1481290798,1920200691,66469741,200207619,1852382251,1364214175,331895939,842475237,1144876236,680384951,758778917,1410546912,1149379637,1034354651,777211357,1374469400,1570983357,1956710703,1949720635,213727367,1732221520,153169497,1830728352,482187812,572569224,877606712,937312861,46856211,72070598,1042307853,273551712,751575874,1907011590,1345067643,1439266940,1827888159,790800923,987490118,2010402150,1498407542,670952897,741765811,1234868957,1688676846,386841734,581164920,1427424433,1237692296,276321607,480529843,1241442100,90369170,1668915332,1882745017,288376842,958643352,1894900675,1539501575,845833999,1888006578,996625855,1069748331,1916359398,53857737,478306391,1617029010,1557002428,1685893084,1777309888,1345656686,185302286,682907605,416799167,1594003070,1077706739,168578289,1066418896,1403390220,418306139,861808693,763181235,961658513,1273988074,994724217,263342379,1996293475,1746885085,699699453,963114030,915166981,208466513,663523379,1076163261,1121927535,692039895,1031481326,351632701,821832250,1064544466,1565234947,193514670,1177278295,436140588,1848105778,1281077217,288903681,1988082154,68048821,339068255,1662446725,1993556119,675034758,436246077,56116368,1959743039,563767021,319731262,1237928573,968882458,1441031796,321552159,1955125242,339400761,16475858,260481942,1425052006,794920274,1934206051,1650020515,968898001,684980086,1088344111,1902436488,638465634,68886768,241416160,581151861,1199668684,710424435,361461543,1844746347,613969325,98749641,1822295648,1804877012,1623027388,488170823,242669945,1291944367,292666949,1735823870,424610211,2006366388,509727699,1362189868,1988053512,1491926423,354398356,105872009,830959666,1762890730,274179116,1660950974,714542176,1313369084,87080037,333052211,800393158,645217663,988059447,1799036926,963565773,807977199,820483570,656313989,1188137298,1260843840,924874282,318888103,906747918,1361537024,1035018794,1520381146,651796186,267561757,1607632154,1410819090,1226325633,1655689687,1984538676,1050173700,1264883259,1359357092,1684113068,258246928,1947377885,763320558,1411133610,1049522744,928633102,815256501,971698538,717030997,1528139958,1560646565,38358802,1085847849,115979021,1253729776,225297653,101671485,1128677936,1918737054,348138744,1122387368,745491465,1311980152,1126874105,857120978,1619292773,254114395,100916853,244880385,988958243,1596336964,349878176,1347913230,138361677,319428566,703683304,131204651,449589584,1681286848,686948180,231195401,1295650771,1744366953,102788949,1691385311,1359401444,417493179,1395370716,961994652,500289212,1594599374,1290620342,1740401613,717380577,1976595418,1610691552,613184713,603952097,430311164,685682159,915989931,786276424,137560772,1356079602,1155016039,879419172,134719582,1032814223,882712597,694950571,1875891272,117611543,26214828,1422998153,571513740,1202589122,1889310885,1520134937,200735101,1530002161,1077689979,553562630,103162966,1116487521,903077538,880557995,890077804,347338854,1959186323,456083577,312309974,1066257826,178554165,1774230880,761176158,641138976,424948141,624690843,1872354316,315807771,1411528378,2008667431,265374944,738000245,436125680,1458449768,870523224,535496825,1891607175,890342230,1534230412,1984397551,1417117375,1691403799,125742567,1645174521,797612064,1926091310,1088753999,1778241187,1099666398,844157975,1002599784,653999696,348988500,959228488,834583310,177308364,1985422008,353550051,705274472,1443158859,473508545,1681039318,292461514,1676542200,461861431,871102273,1726867590,1160091278,619273561,815958740,1764874449,65915459,288012851,1793011493,1536945327,36452841,1333173592,1530225884,482504401,1716596155,1611028047,368057961,152905657,1352967363,747714746,446134976,204212814,1135772718,497187639,518870284,1980316880,348031581,1450443457,814271453,862435628,1823868095,755702370,55268359,1565331097,715318909,493800565,1996973927,131658107,672351097,233130862,1319792901,71388855,1358032059,1698138813,993138048,587463871,1196828725,360847231,1098214889,1159727421,1009543793,1810945941,1443405435,94430926,177036376,349316551,1080457782,1138498246,629863709,660261986,281848231,1773949659,878785511,1531958558,399683696,203666730,545540714,1985751083,1633680891,1568476513,1164519322,66465145,40464501,1711577857,1489506271,427365341,1851873802,1105267218,1464852603,937092276,919791774,1208109737,1372774532,909111094,1512641085,1190756066,327497773,754904076,1552220046,1853889399,1468100160,951404432,1126036628,198432372,1514788220,256575790,1487999695,1690862345,1190271621,1444316102,163661541,1574786236,1817885718,291290177,605394664,906481697,717608912,911067040,1393479786,1294045395,1256895448,78551825,390486506,1985968030,1654677798,1718483213,1571335643,1276503281,1645385876,316546234,1147308676,855730967,196933261,213869461,438487961,47957934,696315518,601056798,1644048754,1436576788,1858504232,960967012,415029624,20525613,911268744,1094965859,1660059059,1698259454,858089695,1173756982,1246015566,187616824,943927310,423449655,1705307913,1059802952,385142816,1208037385,1771665449,718026004,715394820,1928792794,99888580,1520179930,1276224265,1916723991,960817249,1871235418,1344735904,1162505166,754907356,1398838089,179695653,1575896463,1459970711,550205201,149189832,730351172,574343520,117413866,1239295022,1370048265,539043985,1122847805,191694062,837579101,325379997,1802729689,483113460,529626041,928029082,1617834342,1200432230,356352715,664731972,1030543703,800522478,1077923737,898900508,1136708688,58173319,143264894,562557782,705332403,578681568,1399512259,1947495785,1253303479,626251946,406335682,185120598,1146858079,1257485668,1231273235,1637864219,947664229,876681946,591013454,1335492056,621467914,1283215189,1283215189,1283215189,1500224610,379017523,68505012,1554387695,1365675095,1447524929,1237340989,1971169075,1471042130,1758416979,1060067175,1805989743,1707050114,27266405,1787589620,540441648,1739273135,459665593,411532481,915491781,1117719197,1726544417,958744084,46823970,1923662484,1766262787,1985305227,220491521,1266410894,253262398,1567587315,1846567513,219199267,1504791136,1595821083,1924479288,460117887,1745902153,69560103,879809951,922902194,520259621,895056083,1875334464,423449655,1408877580,1556417727,1455877743,1427430569,1374967924,331570782,1550519210,492755995,1855613990,1722671944,345482154,1898143678,1383181549,1014536854,749713378,1265772126,616130637,1240927853,1061546143,888436593,1379783929,1494764339,555972467,525191591,191266637,1566477745,450490396,660614958,590524619,1445700706,1979196484,1420931533,1883386396,1985944825,757780107,1558027247,1136634080,1142922988,594041466,1496415543,602335867,807016544,1153816802,189383753,975638211,1736308653,225147073,714693101,1881607655,1528677308,1621719959,293049166,1773417749,1111590600,1833651569,1706716169,87946737,944141635,342876257,820596835,1888223197,1256478439,1049030457,548169732,391846463,1950573905,732545454,1590004440,347565027,712836401,221835937,1362585856,1830992849,1754553767,1992822070,1429983051,788389686,685056926,148262722,170967324,1379621253,417153095,1752632492,1945885663,1074902864,990781469,627591231,698322851,1082577535,879533214,546937862,1156184667,1002158131,1470482018,421182765,998573026,1443738450,1133911788,973869237,739975459,478042723,1560500190,915964474,93389774,686429929,4084490,1694943478,1970782388,902043856,56384236,1399878386,1128190673,978874135,525385376,1229129379,450939400,1731117447,1510000593,2004480976,469842208,16475478,1306153596,1511285127,1961896299,516418127,1301901709,1482151367,300992324,355725042,1203538337,1157450285,404165632,1108136673,1170568419,576002806,1509267157,1302071523,1909703392,1766860203,1025127566,1876741115,922861686,1617549466,1436991991,1036056606,1172804015,1520262478,212457094,792212389,1685153321,972868599,1735680679,252923756,1300131338,561718286,1737527462,2006744567,325608460,1131185464,1300012381,1016236450,1125267463,797383534,122625085,1396953870,265759175,7704409,67124789,1276601675,837374659,264752959,1017058258,1288691702,1899807105,299795501,1814425487,688970738,1064979820,171457605,1891662162,1304133315,1481863113,326893425,994153632,1994865467,1527186457,1984846292,1663986195,185679068,1682298980,966411941,1991588833,1475240725,1556022057,801303874,732333249,1021725467,770324193,1887572585,238176378,670019977,472411941,279931839,1936898166,658481396,1524414288,1161244193,902242255,1465728051,1621425208,1619761074,505532026,869454079,1336440021,1768904864,1751771698,1420832179,1372900412,1877512234,1842481611,580539018,1620313203,1036730216,181595750,169483209,241052110,1943683999,1883015191,624091757,1207734254,1655066470,832219449,1282850820,1795160479,1972955091,477203276,1734937191,1834714295,1020315092,906114248,616334039,1014028574,1651952289,1541070913,2008064015,1959484079,1925770668,1889903124,5796197,997449084,1028362369,930569232,1291910303,137372852,932198227,2012007217,304779480,366141486,1371926956,1444622906,1004132525,669146705,1088051761,1106717424,1154485408,1566729766,953005111,164936237,1613839819,1030399288,1836291287,938034810,342490665,825299241,1706211791,696921093,1409838192,1661313495,2004715991,403239074,1565837502,302960197,1303222274,585343767,876871754,1294920721,1400970446,1765736650,673574590,821875902,1231870612,981322609,1978090018,150449218,22405413,146023955,1289915288,1710907893,1340215870,1848784325,306955560,1367710023,920338387,1493376245,373579344,743707529,1723378924,1724468376,1951689274,1337235206,434406459,1970922462,1370294158,707425772,882741045,1587251305,733377994,619665513,995021925,1459433107,1851350210,1754106441,1336966048,450599148,234885053,1894402113,1091338978,1339837475,1765864237,220089788,1058673369,138600230,899060506,501297692,1523609237,1389234585,186368907,1815469999,1679726676,16129698,20618321,1433842975,1534231561,1568024972,1836810579,188041491,88972663,1987916651,1790930523,647959344,977361545,729352634,256156774,697878604,933832914,1116177952,1112097281,1140583157,1823003753,1824847695,422251416,67975414,1812180524,977431554,1179848332,1470950444,1705078125,1944092059,1668669331,635130648,1370395443,1184116997,887406174,1439531560,1322142477,499710932,1931003552,921076044,603411056,692709096,47047625,544565051,33411489,1350400058,116180319,541772391,357572922,898959975,472269566,618784237,488570527,1213127957,248765365,667150343,973448473,1600657703,206713470,829840906,156389380,858755169,1802550178,1024053113,1310767192,986136563,425525749,1488558023,75538161,1203557474,1169541623,104588386,51712201,2006568487,952542132,994986590,1316073652,1982297991,1940035393,1154221077,672407665,788353144,309747390,1439052809,896590064,1248545638,944766621,837513571,1157484298,1483117598,1988903961,613774173,1019372695,174498630,1100247366,1502773153,535310877,660010668,761545973,624554247,676257908,1991480610,1402123641,1481152891,1321805670,622645434,98122682,1938537546,444650153,316993277,1209378625,1849142609,1100045949,1339318721,1344129748,445878758,897149438,17794477,1704450868,573861364,1574209586,13649436,1066287027,2004402684,1560231950,1182269552,336297192,737515911,1867669900,1492287163,1039010353,1810324335,1493119503,414113841,1634651748,1542117056,876369895,879150687,1987012897,1208539114,381066075,1978106464,1178363899,548632564,1748832961,1636299096,114400916,835723232,987930492,350808958,1675637866,187862555,826253615,1461827808,1539628575,500183076,1683335545,665558289,1118248621,969464520,272654171,1947207099,274122796,765600457,1500014514,127457102,1071411010,1047862817,1565486629,1155137250,1169635721,932713487,1033845380,1675806339,1924914763,363763073,1598309799,1394389442,696137775,347296808,412402807,1159763715,388139077,1219472856,1194674214,276818551,1168387202,624161293,382968563,315125358,414484778,396833900,746596354,1590385743,1388095837,1709256067,645725996,1140226265,1249296665,640638522,991961426,1173268023,1838332963,1677963592,713413506,428670945,830152168,235525499,555245607,1961941773,190423007,1097458924,604835524,25503281,701523449,1790291848,1510734576,1124790437,1842781330,984767220,29745596,997311941,1236509522,490113128,488354006,60527327,972817031,793186399,400113489,596531450,1939719739,1862490495,1465096050,361372916,1080427917,250029422,3782927,464631012,1974679699,967050172,1405012580,586694166,692474707,371773895,1179845804,605411258,1856259073,502237364,651481522,1216623348,475486423,390853973,1329748906,1271248146,537042854,918586123,888554971,1375631024,1959942449,1096873454,1258776262,1101229959,1148962881,1480957327,1243693471,1173016830,763509845,1672208937,1863387667,1752746837,503145518,1843903486,1689061332,423967125,963744391,1904397237,263984088,1121737503,535289569,465076208,37418824,1002547007,1973471528,1795611286,639214125,1157561915,622501802,1053604065,1847036188,1057107134,1168270181,1991509114,1001647794,446794957,1250931774,326945789,527152409,1223657617,1325088241,1715447574,451316821,1526886747,635869622,1270167739,1402934669,684463206,1975759542,1444088475,1496918375,1594831217,773250200,136476805,419411416,236970694,1371669523,102302975,131761700,600603702,1195201080,32952676,286687457,1779946455,166870552,232016709,1479636305,1787306948,1838002177,1117484354,1468165390,1784285650,1169247775,87027452,1620404522,1593405645,645400714,1533521791,992406652,1119647590,543286431,1817534439,1885070617,1978042321,1849994305,763341408,173562514,463203064,687751134,1798969223,372925399,118468100,1345671572,281513182,1228362303,755911871,261674123,1295031317,56835587,630301519,1637676694,1808872996,1034000384,469675142,87009825,1021557639,894738341,789475198,543508996,988615906,1679053988,393687249,1714663857,853915230,221953888,1478656481,1216316398,688961114,660837764,747990558,1852257589,978454114,904655566,1800196237,1443246364,1304333827,119294029,1690760814,49360983,1485999889,1417317258,785337882,1648016222,1281716284,637691383,382138495,2002333407,668541690,145177578,1547688954,1173631923,492187080,1905532469,750701157,1615381881,585774951,1372451668,855398485,1252163792,214407155,1109463700,103133531,448193991,997118730,1561271190,1121759382,561226389,288463289,1994297039,1484314010,637907814,1443724426,746511851,997056310,137765700,1853090233,1347445303,828234089,1885090531,760016235,3526135,875164452,348053503,1360466496,1050151599,1708417210,1351792319,1813164389,1547048191,1138613943,375975942,1248739584,1737875398,81363815,583647340,1095047824,188830291,1504060834,540203543,1924955102,585839156,324391864,1154959871,1824330741,341198013,783355505,24199333,426427724,1388012488,817134903,1817853220,1380245247,509620767,846045070,1970315732,454485327,277744532,1823109531,308601147,728366817,1831942918,1500815505,216021552,440413375,1884279576,1446115756,376036918,1730554911,1895325166,79350298,820044556,1956260037,1101040517,1021740159,1674441441,490446172,1777039348,176899710,1510188138,1701672615,384750427,1602528963,302669413,427410046,1450224920,210525685,682382494,1986183305,435790459,176546965,394966330,18918173,1850810989,1427737417,104422037,1925719488,1416648958,1556510675,1298815940,1686764276,401635640,1811556903,1033286237,472925701,1326270353,1589846737,1848314159,1293445518,890989375,721932099,1777777603,955918607,102946569,422438450,489982561,1218566871,59323069,463003932,873287949,52191253,746649064,370875719,572467394,1818839425,1076998381,1453112353,216190791,1156312277,1275378150,1073220869,930132770,93834650,109041438,925128734,86901384,1218804432,1292114941,1202492254,1918123739,973224028,1780845202,1140550209,1875514677,676965671,1143643734,519264823,673244725,613477533,1902023382,1053091110,445804781,94519023,910074706,1792914153,947232459,947232459,947232459,914275218,1634445511,1509111734,557903836,1541724289,482821132,951924831,773670974,1155577512,1362343261,1132988360,431104276,53768892,895587586,1818985066,214347072,476886027,935042478,457509072,1815495012,611659085,1862910212,665557364,876356920,69230132,1163563800,1086163532,1571003173,149772079,1367323191,525813818,1155018277,190237515,774521922,874357133,824168635,113390594,1157459127,502619368,885432957,542103072,400205994,597052539,1379681569,1986183305,1494464397,378841281,608751999,1390795840,372097501,565233138,1202537484,856875487,758661924,470945675,297238918,65509261,208096262,1498086069,680345421,1986408307,556756052,1758150874,80098913,1943615047,1994007197,1157723063,1451776059,1077172290,804717589,267500361,792163075,1615953420,638612546,1881283332,1149332637,1906046248,565672758,1640229926,248329050,1311291468,729025110,1473306304,1482963780,1659625544,1332239613,1308107456,1836233138,1972966859,1193138079,456816220,733591587,1001075560,25187737,1207482752,750774738,419940129,953381051,13740562,904954607,1200873432,110982126,444359243,1891210253,586170452,215861518,1235541,667277513,1858921975,757201224,997709213,816693357,448482071,1150684559,1105584748,183256418,1868608479,62958719,222129997,1054632944,652437311,769602467,567442650,1962086974,708625437,962111558,289304603,19571765,118595571,480627055,286123976,170564747,168951536,719293306,1204807588,1759141025,885519215,545025888,1391816668,1753992529,256713885,1516163395,1365644368,1042828719,1168918672,1340396327,43830406,960851271,1875826579,1192546470,800456021,2008897084,1578241818,1001275423,396393752,1303997540,633076262,932349660,1052741086,357269574,1556968117,1975991126,1273392803,866897738,734886713,165415521,31348475,796456383,1618040007,454229037,1607439682,2465050,754809946,546080542,1364032174,1700490317,1960868559,1760845954,492066479,340774979,1171705060,1419680302,472271374,1038097630,1905586391,599304954,1659083381,1869500607,617932198,106993280,1794206607,1730419056,467878077,304192642,717674463,1859411611,1512305726,704351638,83370371,1832194873,1702922822,1264761387,1023045993,784359990,1747486798,921593693,1963849725,1192785727,1302144438,1539751073,1922841745,1619021876,1759698619,727395103,1761024950,470658440,83742045,1510318715,105002600,1565696646,1384153008,1911731868,1650097910,517063379,874855273,936448527,399646749,951387194,612183607,1897634815,290107117,779594107,239037832,538312973,375608984,1605192536,983292254,262574010,40930555,681653236,263273861,552557907,1786189121,1430790347,490224921,82926779,1538382442,1834085401,357677384,771796930,796602112,1383075735,306660680,1006951345,1206008741,831099761,844880775,1714592692,535526514,1997059883,1288408786,1048823418,1571281093,1796733116,621698965,577319581,1838301301,1263513349,733341136,148510804,793999119,1170290365,1273485172,1126991157,1861442223,1325014726,1462645711,864694768,95929187,460539456,936794790,588682887,213813092,733208738,508962471,1539919371,722286603,780237289,1313272984,299667225,645608574,329283446,1953250125,959823893,821096335,163931893,177501154,1155884053,642644036,1295024117,812452694,338413151,1407026757,753578890,939131268,1853272212,529575207,575381359,1955995134,301095651,1609651013,1026216866,473100057,142820102,141068806,1271290548,1910267264,1890985084,819415735,1411353856,151852497,537463556,1373297079,1527453112,1249412094,1013881743,103002189,183090288,340902606,1903745252,44939303,124711598,826045450,223655533,397139493,1172281399,1641586155,1064520092,40836229,1467253107,508396441,846052490,1131055260,944754136,1842363250,66553030,1505600599,305311403,514550676,340889566,1527728942,1586402364,1346038326,1574511986,38519068,1934871495,58209974,1619919702,1928766045,1258129616,1650108088,64018237,459494094,388309930,821092608,670244350,29951788,927112694,1513449589,1529770331,1679640011,562310659,1560390862,1425865867,1306594849,593375620,164999060,1259100389,1317877840,1463123702,1255091133,330462647,1638152111,1401280777,1242091593,697021594,404728517,39406724,660650449,95470558,1263207283,1251465343,1994484146,97519116,1761412697,54094238,254246239,1908927960,1095117222,398244684,634270927,1195487987,2009060535,1471002729,1294947262,1781961571,1976541167,664614548,1535355757,920168235,1625200284,12501086,166955417,303659669,526065756,1332305325,788155712,1331786866,1433927704,1764435148,1856186691,779102282,241709805,775498508,189925538,946123747,659446089,213976555,615249119,1943691290,30568753,1569741802,1082487045,256235715,1512176600,1231242836,294564682,218833551,1987739665,597195580,1488114784,280350913,1614755294,1035015412,1684292058,248951401,1909208900,694801106,898061489,764163219,503839755,973720236,1469676862,651627846,1037118282,1301561834,400480968,1133608216,690643951,884141733,1847942205,933232160,1068873890,1174698611,123696837,1025972376,983194766,1505032587,1906396908,349869853,1459778291,1626772204,1396969979,96137871,1481679884,1179374326,1044140468,155250909,404573797,1745908816,1590907061,1174356195,918909064,1402756231,17409196,1951107200,41102259,1672330464,1213774013,1718049852,1833077017,1388944249,1028448654,342277603,56672027,1614381036,381107025,1211949466,1395454443,1197485015,1441804125,1866628079,282067624,541579312,380840775,1733738251,428367196,622751929,973447457,178914676,1636383186,1372137115,1476731839,753561716,675065335,2001163012,1862163408,13367210,1484314350,204264895,1765109095,893017881,1594317395,548499531,654072787,657927605,638687746,1526912019,750427199,434675021,1945199598,1147718501,1060658406,24025215,222020383,1600893541,1528790326,382736471,960988278,1270597921,1641011716,1634109526,812045242,1586766646,1659683875,1995800765,516686280,453760877,1930921449,382284889,1379976431,711859760,975961258,1324699093,1786261196,1394829786,812874846,470667789,1528377984,634771394,339400050,1785779859,771044398,940805960,1269538729,204819685,1110580168,1178646591,1089012980,787581416,1951137584,1075729727,1252639664,1363593637,1178102586,926332565,1175249346,658542187,1763423985,690823804,27631919,1172487822,1445023662,371369761,1255096530,441504910,837945975,237783151,1616415122,267348616,1559188946,793308884,572117107,1360692747,1485124617,641865681,1215217341,896200608,1481475719,1345962910,538538692,1720625206,1737846749,1953747955,1300889336,1069767246,470591744,765181410,1931732414,506168117,1596828665,1237668084,1596416632,1680533136,1299538219,291357270,977506058,1206598169,183820978,912623717,1380223278,13838330,693292952,868013191,484814200,891743657,885463066,532801653,954318722,91103877,1073860968,1701281192,695624279,892688571,1488637860,209685375,771486710,436689806,183964283,750000359,1222537573,1281305329,1369343003,71172231,1725457487,776072841,3932218,1585876233,293845276,1195766605,1060616518,736375802,727629763,1324602552,972765805,575940394,520514976,1233411142,142603223,1217728745,1423328816,474894066,337569187,819546002,2010144312,1812025747,1419718778,1367452100,1994356834,693340266,2010462024,1267156037,1797938836,2012125613,1393022272,1357911799,1163899376,345663369,871414581,577140282,1968672685,1840565551,1820461538,1993696299,1077399358,884953329,626979933,1621126112,1223182191,1428087130,767501269,1756117102,924929846,1310160367,228206578,1659361756,1543738790,1272968361,222526478,1415184079,191589347,1314337761,359242921,1225579132,1616756649,1292707309,621691163,1603225811,1536622531,1854595756,230788840,1275445308,1947999355,248896419,83754730,1798663494,963124761,1276749835,698196813,464454776,1275654572,1901852591,1667324214,944478643,453224054,115011298,1609398436,1872892191,1532688276,432008127,1996965574,819166116,1056569640,1869824834,832058108,1753441607,1062247846,50307918,931808684,768684190,1716574193,1683911919,91400901,617635711,1335503218,1810115015,1717679300,1666499080,1075049340,1569616036,1516248463,1269438231,1539708550,1505244619,1218012880,1599185852,439826266,89086253,302651122,113785946,541191120,567577281,1527430660,981274910,659114316,1431652377,846379258,1330815716,363600974,662900697,502018727,562500405,1539698902,1893379703,15610165,1931699235,1708029771,1652184703,1043493214,1283041451,1948830393,487784773,628664605,544698299,1098596191,397558805,657657377,1671530868,1564597003,1994037388,722608528,1350150554,1496509892,1829399389,1915509829,1424493215,494234307,1210631146,1232613758,258327518,898244367,1933111324,236686857,168951457,1190308586,750137839,1413098204,605764642,1566006442,624361497,1117877645,1364206989,953097434,1304336624,1913875220,1273370127,1211249103,1049492898,1526472624,1013772383,1494758536,1682690186,54799795,713059569,810263094,951767020,321082321,1609272300,237889754,1896656127,1112574295,1725971866,1700088661,83381758,1277530828,1223484401,653782282,1966322833,393207948,873986069,1656994511,1723473607,1127209949,273424515,1111788067,1062021221,846582299,1184132262,1046678359,94861277,351473850,270506537,1125581251,183360750,203763414,45824884,1507834077,337733646,906209809,397178915,239648263,225293063,1424929542,849168045,146890571,1463434715,1685482522,1665390271,153418614,1642855437,1173165961,872642041,883229393,257241451,35425626,697366487,1798231961,1349030532,1423815292,1339009000,1570768823,1733458430,1797152136,481720214,366042406,1756657322,325011109,1420901238,1034338314,1843930147,1770371314,1465803420,1133620980,1664237617,1604782477,78798704,1364523740,355521567,1150239479,1125382804,1190554926,75491248,1157278841,2006822783,286683530,104021268,498991971,770608918,348316172,1722267800,118321862,14074593,1218880412,1961928205,1774706013,1088769371,652646615,445461096,74323262,1850071612,55847321,1878766553,940502770,1973499494,22851346,36039775,742153187,1112680396,265432991,21157531,1692853097,1395195235,1121565638,1308994911,1282328121,1283683083,89922641,1155332058,548771955,1318061975,1767061222,917698868,1475401759,1405283415,683500261,957536820,957536820,957536820,1025065740,1096956097,1387931452,848934552,258157234,1953419004,1562881137,1869647417,250576508,1745823867,1776492399,1667475489,1378915117,1682753790,1890240524,1571414193,1703188727,865401672,934416115,370927380,1902813226,674133124,1492776917,1711324419,1835046104,238047560,1285730027,1637628929,1692209543,1858364316,1718604745,567629586,888084322,1454763259,454510307,1773645112,132072109,630663291,1601174363,554079876,1529460736,1044154369,153842586,797012587,1423815292,1888015513,1727889861,1917997706,411892243,182759328,1916089351,1153615284,1974082850,257127785,1354527530,1967301658,1412047872,1143023936,678991402,155684482,1741711445,1152670796,1053076863,703084880,1043453218,1108599133,611549374,160850613,1045255021,183268881,1833034925,1782690310,1248048567,1658643342,1369166614,1819023814,1112961991,1531035671,1001072001,1365180166,1300902477,1127983596,1308188169,1479683836,260839795,1252902190,1956343533,510348080,1612144192,1600246896,1174048958,1907543867,1742051700,76637096,790441836,11276798,2004094885,1609390777,1941043930,1227526519,826797082,1303031271,1158032041,1918218236,583321497,53206366,1973651966,1947251983,813686914,1537629332,1534153282,138810061,1138771361,688092605,670482312,302309461,1886341192,1701120860,1324013060,609137077,719376356,1267432934,1445882010,926788101,1002545190,335934010,1764172575,232143273,187086001,1252680682,94263043,1866967368,1060587228,735115744,847141075,852961613,1518726665,810900189,190230139,1688233707,1841846494,172852734,1226977200,731981213,296520502,1438246841,1653153843,45189211,938626897,1537211075,1942890422,1733398049,1482191989,1137233013,492013254,240304292,1333327874,1303362019,1093321968,1412915153,1849151224,1880378602,1498100730,1802256747,524592877,1081103713,499443581,1565669831,69517374,1418521575,1211143267,487554286,1276927868,1524322113,242594108,941468100,1766265115,720030093,638464726,679020411,46288758,772669988,1938383558,1402278455,815292384,267028368,1093147834,571040209,1517243777,67704680,1137551790,468338090,1163462310,970976618,289213043,3447471,1413334241,792999207,357345707,882221130,1014920860,802184028,827898752,475702556,1832957409,658359866,538907179,422114221,263329819,1329523589,1401896094,1100657940,1045372012,306431516,240088993,1368434066,1039980990,379131263,980125715,697275347,558438710,1144211467,104087130,1142163275,1728843548,842617974,1166968641,857611564,1078076375,223110821,1997277516,1589779225,414219062,1919785420,1597279988,595184717,615610464,1954783575,963014834,76364382,637438679,1719384083,1704805889,1108253143,414573072,1601013454,419325407,983549347,1446838110,902782723,541701505,363234062,104255513,87996059,1777470551,1284680600,1395221141,1230679633,1934468784,147636993,1243966424,1064422750,778448459,1296576067,1208451912,1626832400,1578999018,910306174,134765534,739377568,930009516,105069606,155088089,628423926,1376352176,1822309210,500538054,674672058,1671396255,216290565,1922620418,1806132118,468419911,651199308,1174083014,157391956,218258640,287697482,995554571,278217600,1303668418,1900880449,1796301768,975687318,209233003,1450165624,1795832960,1954839276,1488027130,993407836,1311592617,55977174,90875708,1193129015,150107487,1520306930,301558316,10134542,125130497,1934246819,1395391559,1280815534,837753982,1487775872,767978704,1029717472,1299867754,19878706,1105855660,1752213957,1661126557,1760988993,1559911009,838400582,701253607,855109739,1081328104,765247611,975981674,1533496955,507878537,394086220,85568781,1849138401,1445925874,1927452971,1595040988,33200436,1010480369,454300296,882379135,820312766,1736565999,1152751831,1633821017,1186185891,617868501,137920744,166008324,650710688,1032618374,855583401,158025385,1801769697,721595866,1851950325,1217640095,570278915,511716403,473572278,870830197,1676031256,1630597053,713845905,1728929010,106372428,1063829463,927630850,9290511,1571168594,545021159,1599873516,550846986,280660270,1692077991,1040640336,761439517,1737259389,940761255,667527987,318215246,1218911456,12190250,1619075728,58059996,129600200,308808330,1239375804,1600938278,80842460,1308561789,760725868,1255592676,524753191,1887523536,1477648377,567438928,1675109054,1472193377,1373978378,982406725,466115789,591240632,71706370,1088321412,487811872,675634352,1530464861,1140258594,1426061129,112319813,1692834204,1352631320,1859027201,1100073509,624787652,245927383,1339439915,945016078,849113742,545068761,719261341,1365301024,1905362784,894941835,100958569,1099324164,773326850,1741046205,530589043,1799811842,1797323322,1511578387,668235527,234330084,8858867,574436149,1270237809,1625164772,1887494937,1214713043,918656764,203790631,518045368,1551876709,1128416988,533577038,1001093277,191041898,1235647555,842538935,1282979559,553214667,833588992,735261622,1994351022,818140003,67679859,701578238,770541642,389147498,1673117433,1960742891,755445618,1102130595,384563309,1216990682,219589618,977379513,919177678,1741507131,1355910563,404953985,1107959442,434469764,1454298794,75780906,1481404278,1532690252,1374081870,813032863,647989038,1643727536,412151840,1115927303,1172726653,883266023,1896930095,1213774013,1718049852,1833077017,1388944249,1028448654,342277603,56672027,1614381036,381107025,1211949466,1395454443,1197485015,1441804125,1866628079,282067624,541579312,380840775,1733738251,428367196,622751929,973447457,178914676,1636383186,1372137115,60426269,1389396815,854262323,1044275037,871985994,1943505847,710500093,1250120443,1498007206,2004859163,1641651805,628563981,318858911,1863818958,648113683,286665706,1089049135,92663835,1416511562,1826640579,9235601,1717900918,1465797941,790579574,106496987,1351858519,1543858186,133304675,620763946,455479092,362874337,268571466,976233576,1148484434,1260469802,573128271,649176726,1578328011,207149767,807098491,1411049010,879513340,752359868,137611849,243953089,1821486228,1661309011,1248452335,1059274457,1324699732,1568157656,1660514125,1037821520,559646910,1002145392,831474585,1491717694,857802705,1620567680,74736305,283696300,1850024745,282806910,1174959815,1819493481,912258874,187811953,1790681703,1093946259,177007344,572020627,1282675951,599394538,436164661,1745924096,342860613,458560014,164282444,1176590951,1994261188,944507827,1733288918,777734722,193064148,1281119655,570332675,1187008497,854159330,722400857,235411694,225887955,895564579,750404073,1988906899,1266781043,1285898346,414731107,875526161,1345126476,757311191,482477784,370882042,912334238,708102061,513930095,263604057,98899034,881067692,1871388765,1516606198,1784886299,1019440681,1588070742,1306866689,1142000203,1505972950,1767770334,1362537028,842995022,1344673258,1297035953,688586452,1472845441,43031612,156331446,324810471,1007935517,427028381,251542332,1350886254,572104783,1033596715,296780921,1599232132,1600645203,746786601,1462455742,1888379111,505462843,126560126,1075845430,1337642745,321198181,383476258,813271748,1284138270,1617382096,520165349,1686372801,604091075,401722470,1043715085,565905567,127273171,961986228,636790849,1155050455,1311910801,1497849886,321955817,439403188,1897280347,1075601988,1037128179,1915748625,1141672897,155591622,154033900,876114708,564406407,1741349048,1110733700,458617126,1368284721,1950132428,285382727,1861476879,326584557,1882920365,1488823137,1411976530,389043386,495027942,168601759,1898559840,1706421800,1163574758,276841810,470123533,631371916,1954577061,14526052,324240901,736596405,459952309,1347348287,1444120076,772050425,1716460310,987300330,1731799836,1612113408,58720585,746911218,300212883,1208381485,208466828,557440640,726006758,2002735390,1537436620,1759583763,615498665,502900120,1945513486,1281856185,195471060,1858599490,161234057,1727079011,1258619982,750855065,1376542288,412540422,1268888910,1456896170,1766816753,837368694,1957093945,199455197,897858027,964086037,591463050,350921456,102281751,225443462,1304422052,774789519,48052191,1292711893,917007471,623366651,52398802,625717257,1847644848,386606979,1299798393,39208828,1194997431,1908033566,1991669899,444801478,988938751,706557178,574053314,78104885,416848128,1892915044,1203024954,1318022181,986441070,625374619,503333748,590249514,1206480798,1425498972,1136324733,1438386692,336895976,1462550866,5122290,950549847,914127421,771760698,747747605,249509070,115394672,456075215,65781097,1894467324,141360460,1595213965,166669298,718073416,78879335,913238208,134363709,134654233,6998690,1091890062,1487962872,459308777,570813056,955440534,283435074,563171701,1267568768,336677774,255966276,1316592496,456031906,542456378,1667566349,1796695143,1955290667,2004111044,1582198845,350457458,470153963,1606016526,1179134510,189102995,992277023,704295092,1271224714,355337145,1550269230,1426449292,1420304733,1934849698,682841661,507495261,1607810297,1494820364,1248888233,1314199548,1410310000,1867170205,396861561,1974384569,527543982,1265135088,485628370,1895179566,260243931,1518690896,405245790,1065297838,1814193249,1189929159,198736261,828453222,1888090941,173097678,539509703,1286476995,1740295973,1018459742,1342808148,1105363683,791535484,106368310,1248362169,3932116,1913028517,861769758,1180597970,459528849,934242388,1020680026,373790021,323349993,1706548437,1250509324,490973772,557924576,1996598047,1589533009,915875408,1650988949,1834946467,54368293,1387235205,881446482,1854912793,1318749297,1374156184,1343067659,621331472,1581867965,272940379,561329906,1888789210,885023488,548589504,1632438058,864287400,1701458017,1837258644,1517992175,1945676183,1183764393,1996858365,1670244166,1409050533,761438184,736940123,417742824,371406130,1694997445,2005302540,115393033,1916096733,1888518603,568657394,1884241453,743608466,51953174,859398993,1440985537,593563820,1120709166,1110312919,282989552,1519996007,131358952,1184011427,648912268,978794457,409224493,1265626718,1892407653,592810721,1323691574,460203206,1070674682,36971908,637868783,208434795,627750271,194368622,603858981,1118770478,421845758,421845758,421845758,500287362,671119586,1725540947,1696695022,1414389828,870989987,1253886759,1044745789,1008836387,1117778932,1864854961,605527757,341571934,561382605,1569609145,769418256,964859460,764765277,645132355,1591496930,975094960,1728821057,176528207,432180905,1088911759,527678792,1841265757,1915787979,666017367,854471334,1487875814,194459178,694551377,1628294012,1482834911,1662347782,1709516763,1818994004,502946502,978877040,32243327,536062781,1952321529,207289747,1996598047,73458594,530581057,1088777888,259447262,1829340053,127824965,1512894543,1382653414,230105961,923327325,834686246,908202870,393384844,1666041231,1747108509,1417727921,1029054399,1528443727,1418480063,1321451588,1991252921,1975560440,682649558,33417236,1971765789,699862843,1734633515,553510454,174207461,1682853733,1047763564,816970715,15848033,1823806534,274171727,834304273,806283311,1861663712,596267720,213858795,204993078,1578968631,1592932824,885315282,911689353,1325072615,1035202090,762814086,1316241070,999344586,1543864310,1562677732,1402208383,1102551119,885739157,1745887299,511508324,253580955,554038161,140772776,195673650,364643643,274296245,1927268306,911435099,664287475,19882204,1937708890,926010596,1594254509,544186280,1683008141,1970138381,1499593645,273664763,1373154591,1716727878,683753807,743734949,386656640,1831475592,1429114716,318650349,524628005,379800424,1252607365,1181827337,509625856,1826063605,736242630,376171800,534714238,1441297547,1497403692,1898304129,518125580,1932070549,1574057632,609697580,680587955,1677090891,1911301142,1565261462,591073907,1987389089,1341509321,1427132441,1645155690,1349516305,985042864,1042151643,948511806,125654036,1934981902,1391916024,983635017,940282139,350791626,1096289927,1930085072,1203990894,572969743,330926787,214533659,933551350,281900216,979871317,278004166,719518151,1042660034,418692933,401073232,1973770720,162975493,1382551279,47310270,1005028471,1352653020,232771891,332610596,96644905,1416332868,1854210658,22234276,747104620,1001004910,1636983865,1841442964,1636984456,98062222,454529335,1927799205,1969864722,63748417,1190675574,1746682674,1545663990,1604594382,912693059,536371747,757777547,970449314,1746965410,489964100,9690098,312990880,942062850,551984239,1439910996,1575995375,1465046640,1782825278,1880093618,454353706,962633589,1319658089,1381816138,952081871,1672754129,1615946748,77101188,614545808,1093477237,680468804,240977715,1467929736,546797288,1426424828,509662900,1238204621,334454660,1924280705,1726667882,1274672682,1389364343,1577576435,1191259322,1287512166,64351321,1629115460,1856979502,865115416,109999991,101022033,1574491248,1620709914,1120503272,1778336513,1723583302,79258324,195432103,1343520506,931501342,62537601,1888758255,1364367413,1877132182,912824311,308455370,658284229,677127031,1644529559,1151072222,1919053449,767576593,1404105219,1195189816,241801716,519923164,789052510,1900127196,1963195387,835368119,1972471109,367779607,813107690,1697395194,1733725714,1614994113,848936919,1335547033,656521686,188724362,1403926175,232477809,1630871899,1587398925,838982129,1481763427,1946444281,947274194,1356909386,1845987740,720701022,1329386033,591366284,1119138676,1236830988,1394024134,1167051342,1610068039,117495192,150305668,949930958,516436797,1500475324,444368200,362943587,1972061509,427697314,303270607,26051771,1679812799,992559056,1222097177,1493500334,1411039684,101896960,1450940135,532663933,851905794,1081153931,562805351,566599442,430350192,1925847879,1433047163,1111210145,547573578,1392027299,1120143332,565501378,572224067,671121715,969469064,1877847384,486176153,1709833243,400168019,584511257,1450359878,1809235699,1698116234,747363919,658657249,1232712812,690559469,1140476718,148815527,1049987126,130568084,792142059,1086798250,958407763,826875834,579058395,874497742,1021444857,1741431684,1682793654,1812181443,1638697375,1487592182,740596762,449210611,1096252382,1233181917,881101191,1324590798,1469387983,1131440357,1629495721,549429655,1343586077,1912568491,286200993,1342346273,1372270508,252710835,27612987,876685479,374094825,1080443114,575591581,15767900,667020101,1182198772,75060570,909569613,1979880885,1151753461,1505672871,1022901738,1645769069,956417445,1270532185,1596139067,990696378,1735595520,133957564,1394403267,630748407,1143197975,952415694,160574895,433561244,915881846,1357766999,1822940189,1710497177,1520181529,875164411,811590905,815585053,1534674236,1006800741,721303569,1714275597,968409321,852709620,1256682022,999993299,1591904320,967288093,223925049,958818896,844419108,910131022,453188610,1788008053,1992561669,1851798805,1509337241,1070866142,1629149598,923918210,1348944768,1764138921,1946267110,1430805133,1875575311,1018726391,34336326,735902988,87336501,701881065,392976283,1701752033,475463434,548923825,1341825398,1002567510,1906053943,1021806961,1682251737,1113160131,367335452,328801601,1221034317,629914758,375948949,248712426,739008659,1096460174,1915310324,180768496,171359445,640434124,1349715869,1127119296,1871980777,1760271218,1229880738,1699827326,1118990555,128833278,931883418,1138416180,1991092219,1252959941,854350013,1966749804,18753612,1503487880,849066949,476990493,22148834,888776480,227934441,1257977916,1378511348,751047280,1143778806,1228587758,1056788746,1383737362,76692997,1246706121,738028160,1145354355,646717927,358180476,1358133707,1329960860,519834102,1637206802,442288639,1738066907,1620052463,1773839960,1428362414,1890359553,515834348,1610948420,1239749292,787980014,1009692361,1174805433,282504171,239880902,130844659,1941897847,1212651172,145780260,1942995753,1115195428,1439821402,1717201145,1125575727,20510440,496925903,1853279074,1204112027,1086326854,1797366672,503053305,1756856237,1777148741,1820691293,843834536,911935327,1985787827,76264913,1384836252,724786176,869120173,1362765932,1539065755,471319016,1933840267,809494492,434759617,713259176,116816629,1140555450,1601540442,1527031621,1578900808,1572377553,908061973,960059392,848264299,359801822,1211735109,1999031607,1568710641,1280768212,666928136,903602628,1692696881,130211585,790414396,1759080102,1002305212,955641928,225245860,784759811,374195444,383005733,127597005,1134682830,672976931,453624531,163618381,1374589330,607482239,824017541,418840582,1078177620,1429706973,1463833552,1762531914,770528570,626164202,1164729364,532622130,828740762,317142303,586958886,129731511,1180859953,597130135,1197789737,993249282,1349050022,1069768218,820014343,1947219143,1295703147,1465914595,1875678770,437908949,963214776,645066628,810642804,712294011,1425641245,1018606611,337139039,446351400,1287398340,611594508,1866846082,1007885184,349260409,626969998,1405504272,1150781941,1527787111,1770900122,251670636,1050417221,1342396446,1437619478,430053041,639709804,1977906123,645820935,622077546,1252076790,1599643307,687438525,1354559692,992829280,511513860,631293035,972725179,850541150,856157967,1226491853,530492704,939135339,1367269840,1026346126,205700749,526214255,1103410716,1534865829,1963756092,460339937,693350108,1711408488,1941885303,633772344,1961227384,1561566964,771337254,927996717,19934697,1440071683,665162239,521876,1958476818,986941756,1190628400,321406565,1347653243,443898463,1105684904,1059686209,391356026,1117854698,1941638116,1991489035,738175950,883278631,1051904875,1617435428,1964128346,569387085,1412813189,83784710,226874344,1428372916,1818096414,851936422,1108000701,247769692,1545293647,1037503848,384400572,397734340,366615790,1890653789,857647580,1133580548,1863650440,538139644,161540990,391909505,829285427,941782022,1557577991,357402387,123733145,1373473396,1835404965,1967139623,623728686,1853553128,1848402313,99097402,1417835741,1725130259,599741316,1751280148,469098686,879424226,656701408,1619477589,1296595076,1900695102,384734913,1922037633,184599541,1649000274,233508496,793315141,1276005788,184898030,1343745099,641780489,1508779151,1267237482,41673256,178947931,843548672,635335350,23405274,1390509786,1450222368,1286652973,197203534,836920998,53155708,277361989,14497871,1775872929,17333051,571052778,827317668,1922888163,1308226440,1287446913,412285788,1069802344,1328283718,412636503,962589206,1278871798,586847844,1761204270,1436054791,746385469,31475733,467139288,1635745976,779055669,1882437849,398971051,1140568989,588252292,1175468387,157728286,1401604452,203485212,340970212,1711757606,1183523766,1402771468,1364460027,704722526,87314358,1302984586,1340372153,1400634889,715781236,1292700897,1439236817,474111847,1831917428,1442973970,827892330,735967859,862678430,330874920,441443690,866137489,141728358,1069328405,874345465,193230167,1002563049,1668044203,424468157,864401918,364066318,1387794622,644722914,715045848,853640527,1784923138,626580873,545420941,1504092356,1232171899,606027908,1500629682,1028310149,496609437,1141092382,1545128841,134531743,1154992058,610761756,1203118540,1818474632,401458367,154102678,1757980838,1805502200,749666652,1378280183,1981622896,645152741,1977256737,760958852,1198094486,3344700,133725505,912520203,224697114,36722822,835632660,606400670,467114647,73374839,1025657067,1695939398,1262915234,1631581130,116301161,1586230135,994951533,1386272071,556388776,1143291710,46861785,1892047093,109838876,980090962,40774357,838657693,471322908,1807753094,631944696,1857718161,1920729165,1790765696,1134935765,671980963,1222155997,586222830,1377039588,1250685780,602263565,1364031043,1246180740,1464636583,556880587,255753952,506509127,458370514,1357007948,884781405,35596642,1229813238,934666515,437425230,1769697685,1182785711,1986131371,643095603,1593966030,457483238,171240576,1541756398,789130397,63639491,957746235,1402733308,1639237176,452614749,721624693,1994494449,439766864,569463669,1582166836,118298327,1128193942,66452452,494083815,919557937,1620192584,820076776,1724400828,1539012300,883719422,106247999,1629039509,307044288,366461673,183217021,1009941872,802005669,1565173632,543884787,502290615,141736980,493598272,1405670635,1405670635,1405670635,168057566,877540366,1509899924,244938805,1495604710,1146544390,187741459,718215134,1046904040,106120123,1451023985,605784613,1646232078,149167543,1944443880,812989753,1408582346,1263261840,109063344,107881706,260017690,1121867443,848389416,360738935,1755330994,500019572,112691399,1757147452,176204380,1643991109,8217741,1249871285,1973548159,1226459808,1956674282,1725990809,1847803716,1247636178,1242019611,1967677298,20597153,34480375,1666476084,480846438,471322908,1688565228,323661233,39171856,1144322032,1643916856,294466464,1008533680,1446611084,1786679699,1680360667,1772823997,1472473412,520486228,1734920340,962741298,1629042289,367378280,215804065,1599213405,260406300,996645278,492160928,494020984,1114911537,449829683,1674722103,1996324174,691464330,1406143707,1681950349,1840236901,1818051487,1532327105,339577811,455192121,718912764,215680799,1835181484,923439053,1444584700,1333642582,607160808,1442584114,426419055,1178473682,1061670425,1334494011,1483808391,1190625904,137137032,1440798525,2011008857,866638789,505509756,13755622,599408503,822779733,429049321,101208602,288244605,905692082,1824017719,1761636605,1697485388,917883924,1644237098,92535162,854093147,909994770,277984157,1319159756,1162422065,1641022416,792273784,1803918698,1608447307,916819103,1191149225,228199644,1652984016,1778326217,725287813,376218066,1140438109,417776198,1982537856,1970216654,612189642,1181876421,667960731,1978544763,220525363,52025075,1923135107,808055711,989031864,582328566,92686274,107025315,886978028,472464376,1988949720,479395672,712595889,1177297978,741196109,692451099,4848823,1296380369,879468163,930242369,1755923055,1379793576,1995950292,894204183,150827044,1190018855,348716432,47384885,150125019,1487075134,1327256832,978862354,851316764,60364190,892919363,708607229,1350739913,865397264,876487982,475751824,723184970,1887183570,1100576667,1940209799,668106014,1645168756,1538463153,1832479591,495581650,689103128,1943615218,2003703668,1415720730,1134273184,1799224649,1592721733,1616835582,1525760821,1338209133,452466351,1977173107,531924482,708048787,1006466,1332717349,360678969,539718025,322699968,890253163,666130642,1341884677,261698100,630695177,1605073902,1909457960,758211272,1468359087,717936103,1317610162,1544932933,920152017,1331249990,1612789120,561053978,576552866,162698525,12267906,1075657856,1889866635,611293769,884171706,318333076,1224961839,1835509742,400751001,1895484904,777370686,1111370088,1006464758,1659267672,1837247528,1659126709,655440718,1924415678,1500558619,1728836594,320022444,1223122741,1122689632,1678810465,1018101232,1505883171,433121666,1705568245,226671123,1098281177,1533160479,133924208,17888164,1264355806,1921794465,806027626,579866978,345203183,117681487,1048531980,1062514696,1384504276,1833690818,304904688,183092210,530759017,787595883,322374538,253532584,788406491,998810977,1755993807,1552462889,1605629378,143794325,1994023506,41341189,426158856,1271039262,215787504,1131114105,199418026,2006046582,1310954988,1415124957,1846267189,1904167317,671761906,1121842909,430282936,804960419,1543084632,346546762,1764028092,509142845,148459321,1363268167,169844646,23100974,1763878906,1485243509,1884696508,1858200838,1063228911,529527204,1578206928,917504723,1814080671,1731703410,493327437,1176196862,246383255,628232277,1884074170,267716142,861594163,1665472774,898491236,1374672174,1724779983,1142551788,1945388481,711453581,153894997,1125359728,1122207153,763460769,1087355955,1496116181,1540668887,1097068496,421678479,410337206,1427596352,966836786,103857488,1872134597,923887704,860588285,584629009,422550296,957553547,1865876461,1799537137,158250522,940209864,272723099,1867478585,902911681,644172179,398087375,392165621,1115013120,1997351784,1259494681,1717754190,1085702732,877646592,900508969,1726278261,784649948,418045439,307502930,1269122244,573973395,239028807,1859756445,915047617,1594875922,1556754549,1182248433,1306049021,1787284785,1766979833,1501637239,892191009,1034532798,1810659907,377142214,1590156207,1329065142,489794641,1113498935,313231781,177015030,757402274,1208233935,1858169028,936252367,795794960,1956871374,1179916698,65713948,564614299,45840129,1082744572,254031322,1300556273,210831926,999096017,234971756,1725781629,740687469,310077007,318626055,1529508722,464145358,1936379855,889389720,647777733,863828248,1660523339,235030656,748831846,713329785,1135892126,518951391,1338653677,1464223954,1701711497,1296405444,1772661172,1361091788,1445498791,1357409328,1850694569,616009520,1249767828,1515392529,1604742383,1332304772,1936729658,617779707,1432300752,318498060,1034407070,85299796,69537249,1519245653,249471831,1490354338,1631916098,1583605301,1776176397,303473150,1711802237,1611850630,1230349877,640370392,1171657804,819266823,1799695197,578955957,1778523017,235302618,201649164,2010848442,264601086,1930187455,1640825145,1970201767,861889760,386754608,166563783,160893654,942038457,1211288877,384801610,1376373560,266372465,1412918431,975844809,156021294,252570272,877787757,1713169885,1481387413,1590497579,132985608,160440044,1986037610,456780809,1476655462,1142828089,1638103052,1777469752,586108747,1169452018,574633617,671456255,560373555,1170560920,461946112,517556396,600041543,1439309344,907812100,275945749,1024473125,1503621394,450421814,1574797202,1947076715,883867828,1149277841,96153203,909519751,825319425,155756358,165782716,1539329588,1057897789,486115377,604085973,191131754,597339195,915456104,1291715867,1544425229,1875737446,1737474826,38795569,569063303,849758677,1943383235,228751833,1556161999,1391518611,1169520430,1789159593,1076219600,1140274370,1195264360,529381912,343162854,1087447595,174059147,441782420,664449731,1482262736,1327631676,1484128845,1796112320,1046307185,67632871,802242798,1912769584,720162719,298589039,1035027376,713250399,1803420417,1678220211,1743893223,1286999830,42625333,1803511388,206481338,457168281,1817056938,1592154029,958063130,519624437,1819691643,1854139930,1666610769,55744388,380873988,690921848,739243134,1566674877,143879885,739737953,1416822834,1866204536,1858945852,1080798374,1146840147,132763047,1111319859,159363016,1397395450,379332011,317822251,1632238727,380555351,921599593,649585952,297607746,1078492199,812829233,1717697742,933385105,1221798342,1526070247,1976232763,1907733566,1675606407,900091520,951175037,1930564705,976531003,503211983,754490947,1131308606,1908274878,524231542,1830968764,1037334226,811371284,234351835,1006336733,470525088,1543314,514359200,971554914,745276207,1511309107,878523910,1278680880,389175944,2012347236,1783241634,568962192,24764682,833750062,564993348,143738800,1655672540,1597068270,1303518086,1128039059,1578916882,195512338,1514268622,1352659409,77700460,949910970,658269372,1038100523,323764778,1771312690,564376523,1723884612,964159398,1601877798,677001845,888690654,119281312,656931289,975140554,1697321736,1804311084,1720155294,1689771913,416150683,1329044326,339051874,70631314,1206380305,1720874332,321237511,914022984,638809784,1183504215,579524183,1921013070,380505911,1739130024,290147665,18263906,871670163,1189121382,915797193,1371225563,1494577856,251316996,591446032,440862055,308345363,1817465543,505762571,1491056508,1557804723,1206084743,1597664271,1654803196,407836347,235622615,1590697049,746159104,1110440796,1652359054,311615152,1202720713,5800695,425443644,1129827113,116291639,1179924855,415775388,117034148,755247382,979773339,5261665,347986016,1153464257,1977758557,816033636,1522432895,192827484,896486483,1248313940,1342836616,297103125,1722546600,1204983079,333726138,450353976,1058112141,1049954896,667033366,1764113490,1614283248,710440913,1093997308,229520232,449276083,1666136621,1508789918,180787204,929873241,910796218,859283856,2005980926,1215526579,1914664256,1319492381,1959047179,61477208,1940738174,1194304489,770576497,1931868116,1029766173,1755758999,563624188,2009928841,1433848185,1275071577,786284348,1309857078,1593323541,306698201,152544419,712617524,433491560,281135972,695821571,1403403070,1502150005,1900503046,1750314499,772555716,661171398,1243781850,1629211620,1481206531,1812984318,1254948795,935626611,603770297,981838912,183633179,1030128629,53150638,124574238,1739018348,586225416,714085983,269636330,2012835017,790307429,636024741,927670532,1994072087,1259073509,1878043600,24791397,812118957,1206617966,1731317435,570490890,446028948,859365662,1063335598,240525470,722682245,466256727,447782189,1981875689,1284546039,1082208718,1846695049,1097623363,640395661,105668699,1102033459,1186541493,1107781146,1458937333,836561801,336372908,515519694,417170844,1229422900,1108647834,438237879,270824444,684670065,1346385953,1139531835,1979779402,1446361590,775004007,40904796,1973732894,772180892,1362637517,1475852383,857704594,708102960,463454967,1221016407,196201103,980088174,635079205,1228325289,1466956802,319404576,1433729327,1742851428,454103911,425604192,221132248,1285439767,432456262,146478945,802168946,123491178,1129768869,71992741,409903601,1575641385,854262918,872243801,921047625,844490473,949588455,1098544897,631719885,1508044543,1985264523,1119379431,1897832117,1706280710,1038941577,1302339035,1835229552,200182328,1970894231,1863934051,7871089,1524678073,1779834116,479147147,757128097,303534037,864792319,507339912,1928085803,1511770535,977220917,291428866,1714534806,899995297,250977134,1038954147,378821467,538479041,1420931252,20321150,1131742456,1201015236,760232630,1827558011,331838231,911447121,209209820,1051910526,1780558947,1756845245,1237175967,482537865,1032295503,1795848473,1350943766,1945378380,982087161,1162050532,168869645,606608477,609207881,1632142125,665438344,383586042,1377002667,1224019965,1172633178,89819337,1301024631,1098845384,576820108,1520070159,1982632035,791182614,33333630,170645569,1187492054,1137397070,1421813421,821074203,998218723,738202833,1334502189,1862166124,826645330,1538436452,273835666,1463935112,1842919234,1936565717,1523986703,499722193,499722193,499722193,1310087765,1577578862,879150904,156263163,1870085786,1608913655,1029424114,1079536228,1977077197,1733177191,1945419807,308448619,124406121,568512999,1618302752,1576671273,1490714225,1839831204,421596075,615154611,1721497801,1805241897,297463702,720351426,157375256,594974476,1622876791,111047969,1281934814,525380508,1679280982,1267285196,1339622522,1070355492,98872703,141486831,930380679,1780827005,1314714579,1369205670,385977847,784174906,230152232,1183997435,757128097,1537400620,880946610,1769170500,1985504817,1641769598,527496784,1809210852,1298409237,10271702,19301954,1939713251,351956974,1371238402,1605731712,898615507,1750053642,374414370,1583434062,1744804315,1300298843,1128015510,769600143,592430185,204619813,1679152755,1716420455,10576768,492526798,1783944097,1426753552,237694957,370426277,1171867600,1512131756,1601026517,425133946,985092307,212039555,499539088,1076855779,902456501,1673786550,949817039,1385300618,1014814679,1267531271,396150879,427247011,1418936899,661615430,1753036109,1271831335,759586258,1966111295,901953271,1295112906,351163211,1587937904,307072425,1404040602,1830500299,1953501225,1179519174,958280762,1289576875,1778567446,694876694,1690940489,794571693,1414267030,533801949,1684974870,52268246,1099695569,431010173,136498306,724986363,388030149,1967754645,1774406218,1043188210,1069977413,1100644868,136258163,1032665555,1054992683,499005363,659218206,1493569343,315212081,1830523550,477586002,1455052290,20639651,1139370244,630471153,1256043033,1099665975,1543680449,681811821,1009999198,1401609150,807474010,180654473,196838699,960022470,1631316852,751031241,1236774916,864325325,52851711,269315286,833761279,913081140,205816044,550988058,1318461922,173439511,1422281310,112992515,512293873,1520204471,503382844,274122199,1807285663,1690125169,779179614,244934769,13505439,1802819662,752112783,411392782,281490811,1334972760,428231184,766755463,1219320317,1408409493,1165242113,2000915507,141552820,308296557,87922629,1723796893,1888638958,863849037,1939243073,1904264295,589312306,1996405402,1728013178,68092169,955829626,281933458,777461039,269323018,588879307,1706546831,1797486183,782263962,492319568,1890968311,519104468,248760816,1923268810,50680319,1778937443,1331408180,1493703511,1916576071,2969384,446851071,111868206,814909114,1540559546,2010373086,271122337,1796471514,1325422751,1747646935,394477468,1234276695,1248344443,941161406,1069086246,51881292,882350186,70355159,1814387144,1525785809,22634337,479746163,1465054988,1933028748,972957314,284255905,1418089896,1655523308,1425253088,1439957197,1249203403,1714876931,119621228,871974788,1741493299,1338898743,1897680614,77246913,314873374,1413935708,290410695,1154566532,971925702,1977936610,902481553,1538948682,1328653696,1336002003,1532465310,1058526786,617437832,1321704720,1383179605,1322690457,1996592770,232985148,1034127336,44676636,679341559,1627952516,1038659565,627844103,1405975215,1693056954,365248183,808883084,82303836,40445919,1861901937,1501059474,1848035245,1387628532,1281845982,1508498704,1267366338,102002027,208336572,1227420221,1428908745,377077821,281703782,310937979,1351542197,1373480678,259002320,1741937330,1381396313,172320807,1748838790,1344825640,69408044,1582587722,1701959094,1733530661,891913069,1342216810,150687333,697846337,784129628,1562510234,563639512,1747615266,1292683318,1373278325,1080962076,1644096996,161556306,656981960,629695647,595006359,257340550,1862100985,786922187,1370117283,541372510,1370992169,582011166,1438881953,1991813922,182707170,1090458382,280287537,1756129040,159416317,1967178108,1680699265,1159785349,71597450,1401633831,1860407303,1110916091,181124813,1946710420,90833555,328065615,324904066,468194738,494124635,789546646,356963581,389960492,605189809,1526095674,745098972,1265761130,1034283191,150226621,690817686,764255266,1139083718,1349256156,304761306,1939388224,214136359,113968857,1633201264,1382089475,1609724108,1598311164,1113367050,1661060230,1892930952,632331124,978573413,595077798,1090950131,126813052,1953443305,1914354935,787608523,1417685459,677861125,63255854,95737643,856586101,1795901028,1628813401,1895256633,1608612580,1565790957,1313940734,178827009,1956649566,1648998693,960078568,804077171,732672846,272739681,409882543,603132355,1225892474,1745326140,179557758,1234932008,81670334,1222967123,1090126922,72192971,361766913,1564935198,673961579,730815455,1655192164,641032288,175202470,262234104,1450288229,698461707,317854064,1228947078,1936500888,1142177059,116625913,1900181533,1029022808,533946012,854526340,1734857266,3745933,203938513,1089526629,124143113,883289168,190984953,1508237106,852405168,641878818,468426324,1139354358,238943843,1845888141,44595255,2011172560,1028757332,432079471,522057498,1701790780,1918022363,202876668,33067604,1991752303,479931054,938345425,1178493995,1060451526,904830189,760949356,482586580,21972527,937933422,1706924063,236723221,175291150,1905782992,1284510505,723107194,234676969,732379583,964597074,181002763,365870229,1611722380,1127535780,1350364701,1424327817,1043174274,1203484416,1753318707,1228107925,1020157083,995161178,229745771,815830513,861877564,1167643131,86259428,1055624734,660365032,1502384439,781057833,1169723413,1814317965,811831452,828657358,1552560207,1778756687,934343230,162301953,692658786,694783141,1794239512,600973687,777466490,1242512012,393108738,1291781530,1172964900,1417304002,1429015665,523717199,194720634,369776867,83172039,1084936515,57533143,1359296035,566125118,1414672739,1121364227,1410532889,787077984,1013466201,1270942374,424585764,508816339,148760507,377950693,1332664536,1261348303,1692674810,1357332883,389501715,1859213842,22772403,206732932,508949264,965932529,1936018376,534439752,1523626460,605197990,1816533681,154811095,755716498,361873983,1401817666,2011412163,1153527753,1928631344,1639961602,746918070,180779622,1591825812,922262436,14815446,1390215926,1662346824,816349813,618305403,1665317493,229389385,866080313,699556422,1245957853,1071214698,787014841,54040358,721886592,728998108,1100569039,785144648,1822138872,101142695,1741797908,468841911,1365383172,1549487082,1070835658,221394103,1244676850,680965123,687596462,203871231,99032750,572219965,1335388986,100751965,176111879,1830477884,339280978,815355502,999700547,900831515,1679795668,74108346,1596878401,1566720231,1274399177,163721891,89867063,464249662,1440011707,1246037869,706985861,407073005,537800732,1231925290,1320490040,759172293,1363572271,591822219,488904168,729816418,235186715,1539384833,100556177,832075941,1323674034,1773638130,138453187,1391755249,1899587954,326263553,292157698,192681464,1856530583,521481375,777417970,133926634,689913264,394780678,266651933,969031562,300302767,152458488,562326993,139752689,1148457170,665498219,1712243873,968022978,1041234022,773297942,1277429552,1643377630,1986839029,1743119004,1146093112,4098511,1213401120,1345427927,1811619880,1936627995,415881348,629811757,1455890853,1886859370,1768707672,729991342,373803117,2009789931,1003954413,699050381,587852634,1584483480,1999497809,202091740,1618925822,1861536730,273023053,11270694,877265552,384237519,247910448,1645271048,1894672256,1279783737,155268193,731293310,1733800126,989960023,1369352592,446552191,995285201,1064413129,419498336,1339709457,87525466,645847384,131351140,119096656,99512580,1733687502,549881208,51524207,933791140,1325079973,513401989,1892263235,800333092,1236785967,616915370,1196457647,819050551,864591148,1671323639,856077505,887480506,562984268,1850734291,129643858,78528663,1534664810,404452467,701784989,1108482471,726085752,1986800580,1533261696,1307513901,1015074948,1759127770,1311167676,1578939938,1334320541,163206937,1207206859,135698848,1027002117,500981490,1112002552,310453315,1449810903,1870027489,912407474,56152907,748320046,1867232161,350279491,1431211807,1614558739,840069118,1580222687,1301918116,1229942648,1434430162,990854632,1999018214,2008705419,1538283934,819011512,381380628,875253001,1157495586,1336912921,1786519762,1468606003,133097496,1787232062,526279315,536127158,1658586158,33135280,93455700,148214085,1182622605,1602041722,602749043,960657998,1943967254,1434895955,189482166,677499642,1485801905,1472061893,567302461,1959837599,204594604,1173152195,374420274,665109956,1936537851,127039160,1521969441,932637311,1622809241,1203606050,304842484,28667427,336157318,1623649114,1612943367,305274369,1064602467,1944601315,362586513,1418548621,383634547,402331353,1269521678,1113358178,1232718940,1235272667,1514427929,1343577123,1304372140,1710413248,971781398,596830299,881903586,1851969818,260350514,1126982830,1060319088,1547776399,1290416526,515964280,364138414,134548857,1748358675,1542915802,986809360,295356989,45926052,458471436,1141188141,1434440626,509879404,745524799,371605812,1061728375,380750519,1051736777,1933490948,1814384703,378225980,905106419,392676606,1688212315,830977343,930784828,86688700,1249016833,449144875,230069921,1727777188,887128085,1585534967,708480286,1192227927,1914144721,1601630492,142908598,1740265468,761387789,1023534291,686984878,565749135,1745575120,1118492518,1941798561,1501663574,197515664,1036382462,830101443,417852455,406898684,569606186,1470128139,856326186,540754760,1434643577,1335855697,1795391853,1439887195,758847146,326158316,605179135,1767768372,555542887,1953454246,1859566891,1252723806,231554110,1638123547,1415403200,90394603,185217472,71445659,1946550046,1765147513,892745414,575015893,290007234,23446331,603805435,123105355,1108396048,1780299585,1265871386,650986944,1954557962,1309865727,648890059,1100392382,1568723046,1821331884,1243173103,1491040224,1643648235,1200931104,1881996282,1793036107,1268867395,858637922,563476383,827424486,563659761,918206091,466347216,12756432,1676019070,1843829075,1420282532,1829959127,1045815366,800992781,1200563366,1292222701,902282722,1162831595,89103075,220848736,275760122,1631125118,1765095626,1615344441,193377458,118574906,1999441798,145638609,145638609,145638609,1103116888,1697927007,1037843098,1258684804,876911976,563024709,1385660600,1014747441,1066328427,1744060250,1683662953,985926610,1163831116,1695937924,1966128840,1389089628,1830148793,1133346701,621160968,398183571,350343596,1224417239,1399880545,172846500,1397576664,660861177,446315794,408994131,1699321855,1754608098,1456269229,1450380809,778429544,291256269,948823894,231355256,1769835157,244096873,1046657869,1491345183,133918105,1780076440,1368605070,1783507262,1795391853,1326270351,1525479528,1743147436,1468348817,109677352,1902270630,483472478,1601607309,1579439103,152555544,1466705006,1648610608,1209140875,1644897837,981314414,668923539,283028227,1076978031,1905494747,1955796744,165054546,1281598748,1652846686,1114255591,947463929,249150091,451084400,1135848448,364584718,626581816,402326284,1229797035,1064608769,1953203263,1211478096,269945483,1043579082,57779257,157918915,154636267,86540902,671764467,1551841279,149359564,694546522,1579880562,1806610077,437175271,1633518883,5248280,749204140,1525186968,1455179034,257707417,575537045,242959944,26044864,1766407108,819315595,1562476874,905533166,1874583455,359112420,1525139220,1308361727,1038132502,729603288,1723904560,279277070,397856889,272983153,426874104,24398673,1223886897,1442108054,1815435204,1628586243,285692720,555284386,1360864629,873025840,1350486399,1856657987,1389738320,1510010313,520452835,1061033927,1836764637,1908478585,121266707,1097217860,1406190880,1692404454,723443341,1344180735,1801930521,1738008633,356615954,1344490146,638277637,1173820657,94428885,499637388,38350082,454871123,1083178588,929994774,562968408,1369999444,746422613,859619721,16860955,1201221609,386959560,1581154150,911302127,1652649847,521346453,500878057,1177274802,286808165,823034760,244291204,1719713503,921399583,1715681384,280478512,354586905,1909246411,409579895,336823761,258042328,1424565456,1089057576,580163683,871715598,437443886,609855411,1119024266,185662620,1731084790,711713783,1825180379,1901978609,1025722080,338474091,1710269991,1855519391,535092332,819377800,172642399,315408629,876085041,48779970,1191193048,1808946627,1601715139,822535887,1762964124,140500038,707590287,624609570,888042085,782012106,1959938707,367456831,958506278,1882884632,1810758619,498161842,1451013116,262192496,1912900070,205838500,111007933,1130811100,1195588672,857540477,1826767859,863608216,1625971268,1788847927,1507397831,1291378417,1495486093,709097216,1917919426,652945748,46234776,615750947,119183932,427851164,3937263,1225274883,1761707485,1016999984,1815589920,1988424394,1669743197,419287902,1363268686,474534031,432212983,863803953,1756710472,1109699064,1077298576,1028094063,245014241,1357342909,637517238,542731544,1711175439,1501744389,1746346148,83601911,862759866,1046270773,503123838,769542632,1292687991,234730337,958865739,1782674725,523231211,1625320665,1913832844,521360475,42266804,912158181,1931270355,1816968999,1067340607,1484587119,145455261,1372816738,357322569,616885438,58241494,799668513,1605183694,1262093267,1373480553,1913602499,65438413,1425539146,1818725407,918697712,306581431,1697100265,1553092866,1889134636,358681631,1063688503,671677400,560548058,1082497913,1630990877,313852984,930351139,336185188,1685273842,805899893,1155303507,11804204,1515580639,1611513697,1507083617,1532553363,175131914,155951589,203415640,91571043,1330988426,1911603675,469994595,315775958,1164320409,1699370717,1576133797,1717890719,1324386909,835147489,110570907,1593955632,1025316159,1311329011,585794744,394723961,494892141,705123826,1143890175,978646387,441717061,212479826,856552048,1762882960,1579027178,1183262691,505196929,1538411571,707216969,139049024,815321620,182866181,785881800,1210705397,2001093436,213917574,1662979260,346595251,108993451,1295358670,1708055830,1980565982,181588843,1845282181,839309615,396292176,800746099,150752706,788870442,52203275,1271713452,362481462,1864207794,72094,623762510,1613530673,716270501,1335453756,1622429136,1454516060,1536202682,986019404,466837874,1363332525,1589967922,300679406,517846274,1894211929,1031533887,158383894,814757887,460620761,661542007,1354883621,509169635,584891905,1188693775,464535228,318606418,527230736,1662027433,545232686,1669684544,974154028,1765794204,262229602,1991544285,705679219,336967027,1322303678,1796511021,1651407223,691909302,124183466,1971556687,536624177,1381484222,272225489,870979148,1215728766,1442352171,530328155,1850897322,1141979771,1952210186,1323972786,218398531,101142857,1453216314,1989480291,1131823457,234995422,1860999931,1036722105,623459277,1712651101,1607841421,1556606444,640163049,1830308422,1443575075,238530977,898532794,1605658798,642013495,1875097117,589176438,440012076,1232227071,1585019851,550054066,112707100,472656159,1707619820,1819901023,1695278995,1837954541,464672675,1413485990,1524080586,1669974587,854814939,1457771842,1150238218,120299997,1921685515,638738932,1983493287,29899701,1536993479,1306462969,235286664,630100627,659061880,1164127339,25721412,719897143,1258491882,798454675,1470409681,1959429649,1718952126,416674683,458327792,1386925329,181192675,1980446680,866379025,631745989,1028809936,670968291,393595753,628060638,572519804,1806609377,1243822143,1856891662,918557116,1816626502,1235392057,1017454701,1528232268,91091125,323575325,817939280,1351013855,1724823142,384745757,1461850172,1075891419,460026946,1599929811,626160916,1847684490,377119948,1966805373,1885089093,1072348884,990950228,1137600195,382420686,717423690,1021792834,312630300,1330839808,1530271613,1603899391,864199602,531160973,686383162,1839560975,303150379,422848932,482509154,790568875,350015595,780229084,468602950,1730675780,399775057,1261552358,843929717,337299700,870656267,1890769263,3295674,762605599,359517892,1949498055,1837566814,1256589588,292622461,2006517123,356280028,1273956143,437577349,1562788825,809713817,966364029,437219788,1511785470,55400460,366333648,618683967,374213558,1200365079,751591196,1964638137,900259652,1767380129,1340402614,571499933,2010514863,402641139,1445779980,1650189042,1538804500,770672365,440184824,921799035,226286060,1383511400,301775475,1483882596,1725125972,1851559972,723762028,935935357,1309924538,1484602236,1382077068,1960657144,1038977498,1486236343,1961941773,190423007,1097458924,604835524,25503281,701523449,1790291848,1510734576,1124790437,1842781330,984767220,29745596,997311941,1236509522,490113128,488354006,60527327,972817031,793186399,400113489,596531450,1939719739,1862490495,1465096050,1184840641,372992451,798053748,1366721535,993457783,149650842,1901503966,623974185,967005548,1418435001,1794013959,736216795,1764313629,407895571,1311201934,374608849,721819217,1371526904,993516347,599574159,1563341693,1664637355,412181125,1137767398,1876798495,1594421008,265897456,1951035415,1556156892,1142085921,1050220849,376184046,305014395,537554131,6553262,299037231,326434418,224652716,697684557,339417630,1025816188,1283037020,1278159390,1292084063,1104206827,114903870,1822517088,223863522,850052329,1441541695,1436441120,527702406,754053033,1270105874,1936744939,1391995823,556801412,1827306838,257517443,456022325,1300411310,392900014,1100832234,1740114608,1488541965,1987591821,580170950,352723840,1888402261,668335241,1718480530,1288742951,331484478,924496559,433005301,34660156,849278907,1380591501,1773359647,35256670,2001417518,1428618148,150846122,1030779623,81151948,330702994,1114491704,1059348034,1855812577,605555017,1922914768,354065047,297199865,273696611,1429023320,285532252,1880887521,656491105,60609547,1495703004,1643980103,510590886,1706388085,1551679901,1049522538,1712555627,1517995918,1632961522,1870289533,175251456,1986562556,571805770,1230489775,1483067146,704177105,898102831,1033113677,1857661226,450174094,1089232153,1986420496,1049599360,1840896743,705046200,161640052,1599312184,701585079,125063698,250500802,571592442,72011856,337991691,1810529456,92692040,513735842,1937071377,1724738535,1295958150,1799512405,1075602151,1748459589,733369919,1480206174,427612967,1262043159,863092164,708489371,571217061,1243124039,1536068551,1314808767,1288651078,481021921,752260440,1054536045,331687330,745656971,1061366196,1411301039,244484825,228091983,117287272,1597599728,58875915,512863780,1363860123,630884442,552020586,1414485513,1937327235,543996956,1326633629,1779173312,1912196798,1219583169,857105899,47448077,1858551596,826723639,1741165477,1009491486,1142937054,1541235780,716950065,1784074169,1081618261,538532049,1229958217,173473382,1522419487,408451750,1088746560,17488306,538057388,753612205,1352974467,495773727,88221856,1735564667,918306596,1975115249,1834110300,696984246,1446597088,1075619027,41770315,1721470027,786667797,313000103,698753792,1157660701,1183575426,1654238947,1417663615,1832798555,1735540247,111260281,1320265843,1883171782,807026429,1908413824,1473587702,672756168,1145693420,107290683,474555402,793737610,333077634,829819470,1589513400,784812520,549931015,1622275127,1976289863,865860444,1995171493,1929327844,1701271393,55936179,434592417,1690391524,833688294,710481929,980310412,160737458,149438248,912246876,1958655183,461550883,757328964,411388277,634982689,1461013140,1261105665,1909877092,561820191,1353277859,1955896182,2005944638,1216436347,1357686284,1751956156,1696654226,1067143551,421515409,350855086,1995058473,1305882039,1152587615,1691947925,1557043409,1175149789,585719489,540309500,1124720493,1025353713,1088543589,1693424196,1802111254,1129545684,1361492890,1719150159,1173719228,1808437588,1417899642,460014648,1986515528,1481361831,940510400,1667873677,574453647,457577245,514997663,359958705,1825893783,319291741,1914203004,452297585,101734491,795540300,752344279,1715730992,956570944,1679998443,818779246,1776821974,1988574090,1254851254,153108416,1340610513,109441820,197116029,1093087890,1427049638,446750975,297277194,1946060905,1448538268,312617422,1900980939,2003669903,1224677443,719028914,1779541465,1711738970,941814696,1596542156,1518644953,666573637,735151867,735151867,735151867,1869985034,1626505319,625618466,1338040368,829461495,88356299,602179092,1790537974,1960738433,1694465461,253024554,1455346605,1040067734,1236629743,95225736,847998764,814591578,1069325279,867445567,179802738,465105004,1023829814,519722740,1717995061,1667305970,609622956,1554180382,859057594,515641172,261141894,206269271,568563944,112586705,1233730173,15907410,1208223411,923120137,1612306354,1076118290,98158533,536513461,1403067360,1973694150,508141850,1696654226,460856673,599660643,954685370,1825022074,39888703,207477354,1345645369,545182133,111956921,431895934,29690825,1026589888,1222724623,719367825,56039804,354814827,1445773992,199310673,886002231,602172235,1872206242,414236266,832858973,963351928,1260519846,259902196,28859223,607341707,1510992283,1284569026,563365596,1659479007,1194283109,970262902,495612480,1319324416,1569231210,1625608462,310001083,500070819,1619064500,563635153,263679522,1573192809,1340623751,344748733,977353464,1357628534,1794268551,596223729,1564830825,525826257,374620506,991007220,1019299838,177322252,1528487574,955688616,1858468513,1400839674,1243728120,1409615039,1587422980,1465087560,1689424773,1761341112,1346878761,1372569594,1126138604,1940363274,1473608630,1900288762,1761351032,1186348738,550754014,164239117,1981880360,152534521,57821012,703774994,1121205970,1189074777,1092545187,365172242,1189585208,721338844,37785032,1401943727,1562386142,1937568687,1876147708,1364330225,1854597752,650285017,1256568935,1892289760,768116330,208244293,1685665061,491761229,582007836,1015110332,1692509265,1785582753,1048060656,484918303,416274911,951331429,685715835,1820446496,970723823,1309144163,605079707,492956240,646274869,1093257178,631828894,1785971074,1907087603,1962674968,1460824137,240377798,1607658067,286316543,1263960889,886535102,848117605,1097924070,1039982416,1891926329,759635262,1183352870,388435447,1219458244,620447337,1342155462,1323107301,885823169,1398020345,263047750,1931412700,1359310947,118165858,1487666633,456292765,436986758,975779620,269154927,501231439,1910921151,1964927310,852633020,1924599468,1898247154,337881344,1554404228,1746453056,692208851,1074051561,1029642818,586735840,441907420,849766510,1575673106,1357374087,1437950815,987444484,361477686,1723315760,458996085,2006883749,636069277,758747582,544216369,1615760989,41061016,695333004,1241252076,687463002,940404193,1613469830,203100575,1476887702,980260873,1844644059,1637790323,828056098,1214609218,758086845,484868401,1895566826,1627526134,1364790063,1128349273,1834756335,77996040,758239259,1160449107,995193878,25561212,1370704534,1496612835,782182064,1013894468,1204582002,94849146,787895013,1579232932,1129315965,1891632669,172533245,1207483528,1675583283,1819130014,1005697451,375620233,979228441,1649543156,663855214,1774033967,1326769442,1978649893,676815768,353595753,564054036,146030647,1761531801,1482120882,301020189,1207999525,1163353350,1737047762,527899544,1261150784,1478961906,241284950,1151124609,768145015,329562677,499200583,921628720,995968179,1789196899,909884345,689959311,1271719981,1350838244,163364774,233085455,1515974241,1495643090,1151998769,1873094597,407138537,1141916546,32305964,462415481,673052647,1081772525,1529155315,1702831333,1876977286,1787501146,1976756209,1716452795,1921229634,1520697473,20726013,1819667111,866980403,1705924816,1693677625,1814506572,71298706,978520794,546689002,1539165132,844825046,853708105,1809157291,1553708312,1394209031,1493302823,94592870,1995793157,1092164104,1893342286,347392239,532319209,379435559,120550901,1435281684,1781132719,1790004363,648806462,1426378221,1516994839,1528647006,1780632682,873216030,781654171,634974722,773985824,1410014271,1187425203,1585744698,16263171,378921860,1789669681,1611252525,439168655,1125141369,1232127993,1724702273,600264660,1607780492,1833591865,168314917,1647115495,24520278,459464463,1469682403,51479520,497043088,691184750,1014824182,1140630258,1198861370,262794359,185269985,1775163490,970390638,448279141,785486930,940277112,1001612960,1900340698,311639064,1584326636,1728907224,1337522626,32747255,574663351,118206025,214340608,980134078,816226161,1940207247,758184720,636928193,1732585836,462894172,91952841,934250141,314349989,1702309578,1916823933,1241093417,936857984,1255051009,1726421007,1632870341,1189171340,209518410,1808497243,1154407034,826195689,455012030,1475637916,465375840,1101046864,105781645,124598934,1006797073,1606005533,635633897,1896869091,748925918,2004916232,368944087,1908538746,168828498,2012886765,1784461878,1945803329,1689077598,659229735,848714392,1898961258,399758741,764838818,62452370,1723140183,1599056161,474423684,1955609036,1173493725,240709559,1053149035,806658813,1321633608,1508017541,855086534,638251947,1175425252,1551481200,295181493,540341,138157916,1660000926,1149424039,2012028074,116398052,278379303,110681900,685575526,242242080,1082549543,1813648828,1480208529,1364022017,1798152927,59488999,783667367,902423847,485052235,1934587059,1323682666,812103042,1513543165,651804613,1187160782,680687436,1736868672,1354258355,761151601,1224875571,1731354559,45484033,1910386539,1352312198,373278903,1407947183,138961831,1320081896,699057037,1086331359,500747653,1986198292,1990169466,1528125512,351289917,1395155626,134540894,1589289363,1455457810,1057721175,1103634767,1537239317,812778247,1141092025,829709683,73922063,817723332,913702844,1659082066,810272673,1379401096,1194252047,481627221,739019385,776359183,1703044881,384763288,597042205,1982611963,149102491,1971119344,71132856,800307222,1465217086,208672875,1551733355,1392063903,262869927,24096767,170998469,489285100,1409916657,1653510073,1448518697,298248328,126157536,539266939,464169134,1271113762,1862069427,592104966,44506987,816663533,381306621,1041779755,345551735,314702678,924231784,1285168194,170353514,1944838565,1671879486,993286625,215715603,1289966585,396775986,1134098643,1955549246,101714243,131451358,1922666991,1470384753,1609765443,900753606,2001670594,418219874,1746426787,115249731,1720894793,1553672885,619595077,83690195,1376294796,218094520,924411861,297800235,1505792683,138022503,1574498668,1856916613,243429186,242565282,1571424383,1983234407,211440590,1562258372,39287320,1984591485,1848300870,751715464,269684572,1376390364,1430126704,1104920917,1423774675,843877933,547234560,300792470,1915111102,540976952,1853691166,349079335,1745496106,1949678612,1561751324,1508755661,62292134,1431599140,1250236988,1543516926,1221378095,907218316,92997831,348258312,654426563,1373273661,1642229721,191018165,945546221,1571394086,771214615,1312179961,1239609574,24916349,1524626330,1483749979,493774141,1734979010,108268354,1119258808,548651384,1311480823,1185843480,222736735,40265548,1626120319,506399234,831772897,1617573701,252575479,62256546,1323043206,11251117,1180346426,1071796545,792968129,35911434,1283952946,1052211945,59978227,143941281,132547403,1585103642,287120349,599882813,1165552210,83584702,1674389921,264211396,1428290726,1568752215,21709342,542868862,825276323,1243599512,122539461,16379393,194838372,1327314200,639216285,939844180,382140779,741257055,1278749807,307901025,443456869,386497371,194334640,1470449836,1552871280,496221395,280413919,1753737853,1689535331,1578629720,1034088411,437392882,920970691,85852489,955714255,1853432464,1881786295,1041315540,399669731,1788269485,681207999,1825839873,597039631,362089357,1011485047,1450085917,732457471,1404536708,1167815356,38705911,1987545511,1691075568,449401133,663764778,1407596497,1436166874,172872483,385487144,452076385,942900261,1100369009,1888981204,1893968393,743948963,1097019090,306628683,201787503,1440143607,541068486,779947620,746293429,334485237,1451322455,1273420691,1024278204,566570766,919110183,899639996,318683046,1823619829,1632810243,559916232,643666526,1583493594,1713490016,1042913554,34990768,507544578,748797398,1011684215,770171411,1530386518,676529752,1166912645,869439837,388789882,42907619,1239261868,687832000,797806718,1269424759,283207082,1768162350,15940547,1926976286,1818273001,724093801,623922130,1646484265,1486706719,689021462,283840803,573343856,355970637,261846788,2001828228,194339859,1354057193,358633212,283249397,1272599173,1541870798,1277307128,136438762,270525136,1192575082,1474056803,983437457,1640348394,1955996444,401550686,1208515850,705251552,673838012,1353279719,1005945903,1304732155,1195998589,1019307631,94087912,1722171357,1544089741,392545539,979494287,245809860,502911562,448358679,968497900,1781625619,1879046639,2008164606,2004023390,50986058,1678791963,1331878123,1647369264,1758485605,1480758251,1074456598,1795342667,76915012,22457473,619410527,367261901,989359900,313466969,51191373,1709013469,851779816,686098366,1037370807,143882421,1560505866,52078418,655397939,1938634810,1272403669,1973367992,1629254414,387110917,1397432347,1501292732,799550946,1008859540,1029424046,1597687979,724298017,1967519566,1916347177,1467245785,1190113221,1731996035,1067924774,505883114,263947255,1167922768,173886049,514285256,726744324,206169586,1312467254,947767487,1335116980,539084248,1602997555,1481616449,1582204225,1068296504,1348628617,276602632,1492303674,129547467,1647794401,968390173,792675393,1378711561,450667544,1073567347,438451101,1964023314,1192852323,468396783,300693182,1711712066,1115569071,1678500613,490647592,1958661388,1448492181,1673476632,265533616,1156065327,1849246518,2007197562,1682775254,1272679573,1529763896,1656423662,1757286780,185445556,1951862927,9963463,1681556435,729696582,1078683502,125341927,444060293,198098146,317737722,696709196,658107883,250167444,1976126008,911122699,1976879497,730595298,332224578,1329481606,869357354,339944364,256726696,1902248303,676022226,304501980,707925381,378839864,939025836,1160444445,671826286,124444985,669142616,136798137,227744793,1840460441,1386430956,1357796595,98760798,1906215381,590265637,768939503,1438277144,760299606,519638976,737447996,597593505,1713753484,1868317860,1240091971,415793855,415793855,415793855,1557923440,1684029717,1367394705,1407834067,1218398302,1488079820,172204140,304484060,882826274,1188260935,923605894,1042495025,607415468,612392203,1341410658,171691299,1185619829,1509923630,715479185,960796121,1623807800,177289175,1854980256,380721719,423874155,333842701,1747938379,1726452177,381293056,724590175,1107135823,1429715891,1673406800,456293296,1526672990,1049141734,936505847,704222068,1153172745,1768756018,233878530,741004313,624455125,1814200578,468396783,599958800,626106150,1559384082,1275237584,725886786,782412494,101542268,924668223,465316014,311075969,341079907,760151932,1204230628,1971514482,149581080,1838586206,1105531004,1220717056,589634440,318540562,1609706746,406755120,826915532,1579506016,1500419307,1344740137,1223790959,431698085,1746263599,492594039,1318536190,381053148,1507318615,1298719095,1237630168,1938435404,837063290,646352627,1786797657,1388466586,1694470930,545851334,432184053,1796167131,453460287,1782143794,1126674508,1166254215,1873442198,789632209,228343103,849940221,115568123,83081193,448459268,972898006,872811723,738344322,193033289,956842088,1423336105,1093403573,1873731601,172329704,1244035138,1622023907,1984080355,1566136708,1347021301,418293944,1723864693,447315125,699328595,1844622063,540349956,1661754510,238712478,262562340,1903367149,1604577454,736524107,1813292776,388929333,116801768,915187725,1326591477,1510436502,1461623292,1659347268,1801015936,885085162,1601602670,1270516026,463565292,237860292,1279396279,411011178,723470113,540803294,412188182,223566004,1960678251,287539341,1009730138,901641685,1056502372,476551665,292950314,1205179220,961480152,1497955739,434491225,1501397488,1818618932,242921111,1865245087,988233834,994736103,1481042518,860313974,901918137,160929687,197848520,179021887,114539470,427019686,1713352930,1689176420,135266356,925801263,1582660181,1944370875,1078928222,154843395,418511145,182300938,1337651754,168082640,1607951624,1549946198,1002925642,509436327,76074852,272898416,1132561473,946444948,1145814656,1122931403,754289068,1586690963,1542611184,492690853,1877143745,1973223459,932832469,2006618815,742440681,1951758912,1881508302,993102090,689458858,1379977576,114467901,1526226905,600231100,575041396,1977762001,1705181975,998657282,589294976,1531208197,1979581591,2003705249,1184790214,1247511864,98761593,288651205,589266141,1173859725,1831852000,1587296224,842138246,1491016758,1963766036,1318977119,7129603,670698083,1806616334,1189570734,288970896,1869939396,1822885141,1422701726,1347948370,1244149828,750791023,1089991923,976713604,1198702855,80466772,1064939016,1753519315,349844688,1493134659,721395372,329436724,822387458,1669664773,1354837010,489446533,406846548,1399564366,1539583209,1093307778,571381514,1941600881,866689440,405630561,66387235,1159784650,1842428369,644521488,478807119,57547909,707607124,1826427756,65181803,1353873280,1353761451,1346552551,173117510,32766205,692976186,561326789,190903763,1751988790,1643555013,131717654,659524006,1549236654,551457884,693971158,1052915287,475095913,1278779765,375166529,1986408888,811347234,447665785,928956948,1894225689,1591082644,1770160296,1573984801,1880644799,642478207,602151135,1325664511,657927025,1412913492,973892940,1040170587,192267993,998939381,1064701370,756245521,1187013932,1343476896,470989052,1416228143,1233770991,701232403,34312480,1846365921,905737592,542196526,567051569,904117958,380624799,19059526,890460726,1555299520,1159714023,1801312303,237385758,1521623856,252713838,1229812482,666506910,1834270824,1899685866,246483373,644268898,764562856,1302122443,890738141,948695706,70778625,1705286273,560360724,1755664112,371421197,1435921629,1690560413,533950524,211117232,723997320,1242529325,874680860,1234132997,668198772,1306575315,861317776,446882503,731410675,1795310816,1826006751,778788969,788963120,1318864244,643406277,474573588,171638697,498750229,1961469337,1892791291,1158792755,1524210689,1294289727,1911035836,1570771932,52345053,385139699,1159963413,1407121276,1199444568,1837299033,1299811710,1560613262,1931277157,557555492,1948997510,1050170245,1665808097,1313166942,219412081,1403845371,1930203262,913307965,1072897042,777414040,357881285,934921022,657643813,251105685,1984523906,1726135686,442277070,881633983,1028678432,1824475223,749844307,360401975,565389163,1358841715,947603654,699051757,276547693,584199883,1918827787,948749512,761103496,56510,1143070512,1960394063,989895687,1888008385,2009636138,192507314,966298961,1036046721,757721773,659432630,1364388652,1098439383,1193245640,1976844520,1539789082,1840783485,44185040,7159090,1503957389,3858958,152180982,1450484666,1659805627,689703833,1246653073,252117826,1530225112,1443008970,1727709409,32227092,150706397,131312167,1591952456,1890382561,131668301,1134158362,591307048,355833467,899646171,1327826550,999410755,1574917250,1205822130,1910824676,1108734512,1076740480,208559906,113724773,529418248,12132899,1565933340,819693500,516724271,1976328417,1239259697,266224863,137091773,1866663176,1371024804,1551472011,776181400,1107630666,1086648232,94204708,1807241441,1010614495,48327614,1593428878,1383261773,66993986,864635303,1902195679,1861871846,1579550003,655429544,1135833742,1335661887,537025255,1346733159,1476067119,1766417000,1607447036,1297187256,1599931376,521827392,1290932815,477129183,932526714,1489383542,1569053708,188537950,1182022027,174647939,1646481092,618488646,530575122,582792245,1388693524,1144235844,1409929808,644109854,1451371342,1316103981,64324357,133419658,1775416138,386638187,1344589019,808236735,364138338,1890056056,1976766518,289624806,1103599237,640832315,412676985,1896497607,389623036,465797334,760581469,1126137596,1946244696,128947283,1885361008,1736595180,1774269977,654358348,1095927641,1185166092,1656928662,161443922,1023039785,1715030505,1674095086,1550136440,1354874911,8456032,307817111,820224248,1967741508,831995332,1873843787,653288145,324207318,747028598,656935438,1226417029,907763497,1199587599,1211500735,1821962022,1031554192,697118778,202715306,102460972,228152394,1755282590,424491838,136401685,264256216,821827324,805668555,667235987,1901886145,214771250,46293243,1571424383,1983234407,211440590,1562258372,39287320,1984591485,1848300870,751715464,269684572,1376390364,1430126704,1104920917,1423774675,843877933,547234560,300792470,1915111102,540976952,1853691166,349079335,1745496106,1949678612,1561751324,1508755661,62292134,1431599140,1250236988,1543516926,1221378095,907218316,92997831,348258312,383879608,366066838,1991061742,749202958,369305275,587066065,1926924125,830693080,1437241403,836476309,1205272776,1823772222,619605741,1229862174,359144760,279459430,1397618939,1764594193,111066061,1153636416,1491943994,1307371460,581032138,1006696930,215764838,532266920,1595021670,1388066502,1944388966,1303792911,1098638760,884865264,302351469,716031507,1941111405,1498622955,152183788,585313898,836501656,1930124073,1603435902,1737187652,1707632383,793349578,804228672,672661597,1663032090,412062936,1915094473,408846261,863827445,1268047944,935259635,1842169711,240766566,320593614,245140212,1981495334,111159055,853608723,1051901882,1002283562,197105221,151163514,197752273,1437391572,876278915,262911946,1522739238,1160100425,1844731452,824249190,561776286,1885002883,253373994,1624922625,590178093,1155141080,1037057827,614659334,83637989,473200403,102465473,719983711,766188485,1482199970,1029469130,1239270372,1601788831,1931521254,1312140878,1378842492,1434145190,485129153,329956363,968551148,848527269,341325636,1085538754,1647620177,132315269,1939376069,1146743215,863453739,607035565,392273764,1837668340,591657393,1824951451,1378514667,220616527,1591589194,965578779,463145051,1397698809,295367644,433201880,1494663730,1482621394,230548406,252442611,943239638,347342206,492244477,447460208,1069739770,868336122,231558574,741611996,1387964343,1019457703,2010568427,910441323,1129217201,1209641568,1411568385,1902650731,623521586,1534213229,806578911,331307409,738667774,14942176,1812765895,99166391,843797695,1952702681,1695570106,900463715,1109971869,1494449847,1519073745,2003364239,822151097,426200458,1043063221,818621078,1631646668,1504707509,147339299,436340563,963404299,1554735920,267210086,690226488,1025067279,1403593379,1165728463,525697255,981552141,380718766,1633774518,1349971521,1790506773,126488526,7828200,1295223698,26553045,1966696287,1755708495,482474077,1905902313,717353727,907866317,1064153163,559229320,1517773996,1007570757,1461892949,501599951,739491372,1115461456,132976701,430389008,1244946193,353467742,1793673125,333068375,955902028,1241711381,902792238,821797509,1841563379,1714614848,1102855565,1354880613,198712612,719353070,399469300,1850615950,758217972,1563613053,673472336,729662052,966744954,528632818,1524228302,1563207092,577711923,429802847,1508803149,1932546464,104578603,1467827406,731509271,1681460452,789482908,1399527327,1629161993,1481081525,1461811899,901232651,819317956,1599137915,1758117805,226870793,1885903652,1998666845,1500647321,314357092,864592520,1989624698,1631533632,205288248,205672243,803200533,1525069034,1526555855,451961455,450659991,99262709,1722731834,1123534912,214096928,126221684,1627725869,403388669,423243765,1984247469,1386696896,1439384004,177865689,1265795183,1075515132,1472508644,1176184260,890939946,1398686287,1528752609,1843778283,1855260539,658874022,710135474,1577231692,435935022,967571718,9654707,271768775,733541310,1546383632,740255057,1242937178,1663381989,133793216,1631713533,1576623363,1630895829,566952398,1255529312,899328992,2006534837,491045107,375023730,1229448017,1309425033,365936143,598277041,1717466155,1196649715,1296435958,1116276004,654607101,787462002,1203910193,1076926812,200482013,1666929791,1653463293,256064607,1282600068,943379013,315774145,991015045,1119194285,723251076,1321208869,956098415,694190363,698798633,619636218,1569431307,1210042843,777217229,210793183,1431955912,1147633976,655399399,265306505,1978137953,1567170879,1567170879,1567170879,706245918,1384231310,714206688,1252208955,1417536019,1961837714,695915161,2001577625,1601679433,850404917,670793845,1022353695,683556777,1534572029,1529777775,557265158,1681379247,944229538,1991155522,1820851187,1085292922,786885194,913746301,1318010737,282982733,876211748,888823594,1386845144,1257214541,926979796,762620772,1180686024,1194484212,296968810,501793494,912601472,1572380726,454637723,928905630,1958943763,222344520,594864059,242432450,1787095974,1265795183,15055804,86972298,762163034,666384721,443976775,1886104482,1670560701,548493299,16943153,338484771,1295005709,627753500,1593326159,2002270391,1525536959,699163205,1378197224,2461100,1102914320,1166003934,1061427131,459527761,103640387,253172687,1931249822,559738993,198380784,1447507705,1848092034,616902210,1624426211,1274680913,583968433,1921147829,257241130,157708349,700193589,1151926530,1244426181,155754012,6570008,1785174639,619218849,1417829182,29719799,1687863870,1560288830,1387353689,1409937229,1784047255,979875840,912753683,890409386,19635860,1972653545,1937188469,224602820,494917603,1285000020,15205628,808153499,1302605760,1455955789,1322429058,1711016883,1453068635,1839116144,1233070851,167700341,472376437,1907002071,998160164,1683513106,1591368945,477051701,279303437,895471557,635591165,803039288,1577116675,354479080,1904086618,1767259124,1535419908,1716086,1767074300,498961605,1569645433,1609200282,1892685332,1446336650,1475291493,791765328,1494529648,1574509504,843895991,664046397,1869631590,935489340,1421621317,278340688,332939633,1619874137,1012542039,277993531,1945072152,1963248155,1527392770,483124191,1048460740,1168212906,418939516,1706383869,1706262091,128485609,800594013,1117103420,459372514,1758609321,900862420,747126272,394462890,1954906770,259926550,835301790,1328205685,1842604465,588768240,957567064,310155655,1818281393,1331321676,1014428404,773252141,617135049,1030685435,1999750862,1717062508,1427211702,496160052,179922588,1834533682,1713643904,561380609,575324705,554202756,1640026873,1656574920,367958054,1751188297,262090872,1630353979,1012158777,430849947,942592319,1621893682,724792249,481684897,967300274,421955203,1461838975,1496904746,1942412617,363589390,229088864,417620198,453991943,1730638794,1259668435,786324809,725735124,965993810,619940740,1962495785,1547945018,864065822,470267077,946997808,724450259,845077616,1956555224,156151704,1833553883,848979844,932971449,1502115034,2013214244,1574166371,1397392275,611380478,308518852,1950651936,1349256685,1545901790,1942483371,1507710756,1402583244,1101073771,1250365869,1222995024,1068896852,77592643,734026147,1053962566,297169421,1583909814,249436281,553523003,1161197571,513209926,74799141,1658833041,1940281353,1113536292,484826646,1035698862,1659352485,833810609,1927653589,764545193,1178630368,869897171,12304230,1078949804,695604015,298621920,1080817122,1982518562,1239038689,886379508,1508553180,1237486630,1702652809,1105998152,751987501,900850990,1709388049,1308836369,1333817857,114332541,884359709,1317540169,1077517854,1619939383,515250007,977081063,1268117055,402950024,1286024508,1052208039,483194276,1099053531,1454459010,1232840569,710323684,1073834954,1097885687,1370755725,740077784,360595912,1741757721,946675890,1942881222,1194520380,1270842892,797397881,1780691330,1195992367,719782206,1444279691,781338674,1928869714,946347632,787530610,545808578,87585394,193666817,127149075,1528320940,235788192,1047501834,1138753371,1650573240,1533898169,332327846,1988272655,389536928,702128270,201571028,28871527,71838238,191913361,719697356,37510008,1545538223,725285208,1385547193,1062249860,2004395413,1784070904,360370176,962285053,306122,1042384496,1028021846,553102038,1622454592,315337634,1063662505,421605929,339587120,1608149216,977896734,1162580706,1443646327,1529313299,1076313214,895526630,1179895943,418446979,1446678978,732779904,111581446,1243396488,294517514,1716225321,1646963694,346059787,1398559922,866332742,665052379,900691936,556654152,730619021,266009431,1013478050,1005290749,1520591486,1024627817,236946112,1913714311,1035176686,1917623337,710402107,1410863832,1388176642,1411405245,1068962276,1357346292,120579549,1308892150,719177640,327295818,1726607410,965172149,994273622,1249626621,1747857294,961068650,364371291,1725985247,1881566711,32897218,1151892004,487863767,1530218924,656443968,1877382086,846090330,1523285857,1815516440,394154836,290705929,611930824,295719880,1492651522,769357623,788272146,128631168,1304246535,530306433,515551538,24422775,205794540,1115400397,2001814883,1045828859,1086804027,1143383140,263239062,1050108448,876941804,1309544279,580607103,1904022013,24654769,1949238728,1057584686,1523472079,38508865,1445430614,430964256,1528284588,257189742,1966486851,816945905,1462066549,93367975,1585407745,783198233,1802742504,446385949,306359622,841130082,353824698,534055310,1748732125,1877565845,1953947989,1209536823,1693593339,1784359826,386620679,676077915,783371140,694159421,912630555,1672684425,1529450491,1031220033,1168085439,1813986296,29264902,711479358,1364687832,1823047842,246256528,1567290165,19388288,1329050242,1186435004,523870177,1111687725,1625801173,1575494118,1158535777,70626518,463924631,1390584211,1162115602,1625593203,1339318721,1344129748,445878758,897149438,17794477,1704450868,573861364,1574209586,13649436,1066287027,2004402684,1560231950,1182269552,336297192,737515911,1867669900,1842591741,614544027,1796057077,1096643225,1510808535,1361746026,938685091,1661156059,1326816501,513786696,1743280124,1521209977,16582338,104918370,305779625,671742567,1851529644,1634862676,830391861,961200688,1031907509,1705229541,738659917,1501011307,1976435851,1552863545,1634118722,295816964,331367207,1948625440,569577339,1858521891,727180351,1430219669,575243814,533828013,1497845324,990790269,1220865061,1852385101,315558998,1012035904,1489789962,732800925,1842562317,872529461,810951416,1782570069,620949044,1717799004,1783561458,591292029,1140418705,963247642,688762624,468709847,694927864,401333832,591938399,1543519227,33951561,1297280917,1856341173,681727253,1826814604,1383236151,1337604347,769806696,878209990,716838759,1522869186,216994945,1621755069,1194587872,1184485296,1800704085,192764396,1986057498,1522461287,1538751109,1932042897,594888116,1292913991,1311378014,1973598086,1129889968,984243678,1478870145,712205484,1604506289,1360038450,701948244,660568553,1377649483,1151052848,673766463,1792060136,1002026922,397951391,1913936453,1915898699,1281279743,258205134,1605583569,763147838,1047445124,117911855,1041385180,1558621412,781405662,861415913,380591811,244100973,232395417,1512586518,1135912181,1246408075,817346164,18573695,342501315,437176576,1596359267,1455605854,1549587536,454072508,428903787,112121593,1355127498,1147470162,286850175,312773757,1607233505,555982222,429471203,17371650,276664920,1222859201,1566246447,1111960046,1369162386,836452240,1329315266,764536103,812537772,439647990,142029733,17473685,1514476491,541249448,789399984,1163558644,928270789,1566744184,108578126,222101246,1320784834,68181746,135055378,968301259,1097930992,295275849,1551577149,393240822,1966301141,1274473792,1611821182,758735279,925631145,99659957,626067390,136035753,598833841,1064289028,858173949,393771619,939335289,1169854619,188583558,691251769,281627434,553554072,1610561881,230116836,1208190186,1695823660,1919769129,1156333016,750443661,1492241085,321983404,512012220,208073160,1096902113,114628167,656190495,1748756826,1295754515,1738027216,591447676,322509716,181246673,659548963,1585497565,1057713114,1357781141,640731217,816298263,444661617,1388593321,674336305,118273735,1269816344,1691011648,108686997,273016894,1356454244,1703715600,1373214371,1837972922,517871945,937913556,1671144997,307650863,481381111,1313481182,572515148,872201522,1514378048,301012197,1702253363,465983869,640570341,1295338452,1737850491,1077535251,250180838,1302511505,245254731,833927234,1782448200,1936091296,1921204960,1101018051,688026860,676770311,1107069654,413995129,1020213851,435832833,24088048,1026952888,131666277,1886555381,811592854,197089427,1934148874,399885557,1487862795,1350596291,1990845664,1042426258,951423025,1468428015,614475412,1375102208,536288637,626596635,105629460,1770037896,519730921,1569866185,792673984,152643271,1496593923,1468139482,1917296704,102522854,321397533,733927562,110822739,761117684,571797460,692379114,1705357571,1052465406,439491268,1602757463,904452743,1133649812,420691909,364296210,1998877223,1103190384,319510284,1641963750,1396924624,879831625,1321437812,154582892,1405900750,1394253363,1255299528,1006304113,574441178,1744878843,1312125898,1523034904,346022638,144098002,809855406,398087344,331186718,566689190,468868783,562971609,1031693836,72088707,844395107,1651343287,446822654,901129449,185769384,360836434,1932220529,26719474,69594725,1672575123,298028444,857892814,967907769,1890504824,407980827,64773222,1902500622,1417759909,1261663441,1457885185,1164024681,1844177348,2000983205,971006206,32957487,8754035,836147332,1114118137,449147155,154111422,1521720368,1194206413,1535034350,390852157,185596217,1813431329,762787655,1493908007,1799994045,152967634,124533528,447097223,1439447963,204372761,440230933,433933050,980745935,1434101903,910564634,111599833,331069299,554192101,1134171867,1938362834,102370471,1754605754,1532185998,779296535,133378976,587187360,530419445,73101530,1976743328,1557429231,1314440520,1788255059,21950528,1315467101,535836667,1411892993,1127311778,800554624,139444242,789830570,415473688,1298951598,1081382352,297320065,371235972,298081934,260952826,1643629494,279242478,1254344049,460999742,1084245275,1322353969,401046783,1959162322,1862706864,2012414582,687747020,1246691391,1590444333,1157682883,7013715,1289476622,1517404962,73578272,1292909859,1751065153,1568810831,445424987,1275718949,467522075,1932495917,1580820358,571536773,462321242,212672312,1505372731,1319050497,1426056144,1181207170,770220842,579762949,1550150693,1550150693,1550150693,838458446,588418562,905074453,73064748,610345629,1992733593,253030922,707039488,615985663,1191763171,1389126809,1171564285,1626974318,157148495,1736359157,1796477840,820761136,1663883428,806842479,1954519496,1604924123,1241728,1218005980,206036484,1308836601,1136849788,1212768948,1315626682,1723616020,1833350492,1076857986,1066447668,1594886615,1348321873,162266064,959425299,1612842822,908841024,90654332,1533528017,1875977398,1475335218,807262069,1440631587,111599833,1276531861,318933746,409091138,1203440010,1707901646,211923551,1884725722,979618582,173475733,1068536343,486477507,1813968868,740765240,669964341,409381162,1123142378,792510598,1611652411,537201786,1061797555,575260236,293583617,842269500,1502562957,189220441,1209819803,463817231,366147522,442736657,1617683729,737920263,116297281,857782334,434580281,451075988,765854024,1279340104,526976915,1745447224,868021894,1614528913,1814298807,674964580,1291030896,772220007,1541252447,131175225,559216082,1315940961,3502417,49164643,1188524204,787312371,926957507,492292287,984634158,1379019049,25215601,21557576,853385355,1651929908,1686417225,1829467841,614915648,1393686074,1170753298,113064389,1062872591,1979800988,1973863978,1918243783,1218931681,1344303488,240088521,1148767676,396242855,442093017,939099364,1784430298,465060078,1768967140,831251013,660618794,558432429,368211406,1159315626,561305049,50288126,1183643557,449962312,996142622,1045440985,864483324,1176893249,54330480,299607382,322637022,1092601690,1157439355,1311443787,1504067662,1646699054,1326709620,236008829,367915584,797435426,407159643,1697438765,331774444,1124065236,1477608045,1466666972,402491856,889853008,1476645014,1233408307,638409075,1962345954,160983173,1327777170,1238865993,90975801,1660724969,1486413746,1887041132,1673936788,790725411,1405839168,161132073,1661910550,195258799,522429146,434417797,635649169,101869052,18124320,1753926110,1363386246,1916490755,1259839251,772731964,1810153869,1139923337,204878511,1952651007,173246569,1910163715,1233896861,2009866643,763773878,2007291501,994921640,125913516,1979281948,1859981663,1164214114,447609426,1316548905,1521378052,1372675332,937596723,1084622807,1417679864,800538316,282931900,322114824,1130541801,300390420,112089503,344381834,534959527,1913739436,934965117,670752697,910220123,474984938,1957146770,1929747222,1532591329,855597502,774564405,347487533,75882694,1679256645,1043449024,1237186939,1098649440,745199032,1569196689,1984624957,675773428,1999251386,1731063840,1877499805,1559306898,1942360994,1124206108,976822041,589554755,136633070,859789887,406587411,1575153644,1221875083,1048108994,357368521,450169147,498936359,743365097,290077588,760678480,1516190404,1265914768,1722238764,340884114,318469179,1945689359,960602981,321563281,1948941890,1977770274,178094450,698483995,1102801232,46034020,1953541017,1291692885,235722681,385149561,1655210496,621663198,1398897011,335339256,1041903299,1107982809,1342393063,1387032912,1246731073,152363703,988998928,1504280484,1716435551,632823897,1622443726,1598237814,1326727226,310368630,891251843,358220150,1005578953,150051176,335562789,994790441,1073445594,1813193769,531483381,197033924,1870901592,1140096591,793396810,1502990286,1935514461,772975052,1507581818,472386828,111190170,782341854,1640103514,686465825,48817439,636644006,930465399,1546949384,1185494482,1648186323,660957569,1619443724,506554347,1361747858,1260338824,374878706,1841675789,992469242,1882574994,1968725191,916258642,1352899656,1223205349,726490270,1217773310,116091474,1722689218,1236538965,783435259,582013258,1797273009,508755079,442883231,620482946,935861976,537387603,1158817590,1473346831,1146209699,1621533512,1575694854,983362769,22672926,468261,1858695150,1386835074,983698618,1262563875,492647948,1771518670,1496732043,581497694,20041310,222652257,603985129,1851509414,381699925,1279252015,1939045531,1889495962,1897327946,1142563597,770262727,73766157,1223202251,689317106,2006027951,434516612,390154556,268255761,1056987865,1708870369,403558504,484758065,1103503232,1369099870,55395865,1358584975,941797772,582361976,995402329,1926353357,249142693,1039667729,33286526,520156724,692703422,1411050667,1418268075,1249269029,323594221,422917285,297532163,1593738753,2002344127,629510536,609669898,29828062,2012235547,1994641749,186447377,90694258,646939005,1640883910,236985717,1528362000,1809223675,1128341828,39159953,1471485460,474155654,1263968706,1010222195,1096100292,158116377,1646260918,1894512000,875277697,1093002387,1793503473,1668110478,1267239420,1281790568,457318299,524565243,782111974,1502210929,445260716,1493699166,1389036249,1874144034,398537715,1414200365,93570426,79939496,897912901,1477837884,1568134048,1364036085,1262838898,1308992097,1523219727,732204914,68404567,1399886124,1158606706,1744050019,961901973,1686455860,78667983,1048572264,340706089,1739375275,1885674842,917650349,1344272644,1104618482,442606837,1321641338,172087046,86458193,413666560,372077627,1214297652,1574830972,766527368,561544543,89619788,118311462,338784281,1790115290,220544698,1817276937,923597064,876422267,1913768363,593988967,847763763,1560969540,154924435,338705282,412374439,572758833,672613451,1346842363,1885660202,1690058,956328620,1056338243,38831225,872504718,1675313492,1174361175,13215850,631176603,246548385,206376237,1074215666,1382563913,399732546,834992499,120338793,1980003015,811348282,1318798712,632476615,1914125041,584528801,1335441838,1409528414,854961428,1450945826,185986641,1794218798,648434979,1840450864,139209283,1165568857,1070173862,1554363830,14985960,770803728,1130614746,1970771796,1603395262,1860795868,1929525279,1108005980,1275364156,198254475,562745600,628351966,623936456,1956769559,793597031,1351588248,1608356226,522146060,312826110,305791137,359241569,841608400,522123667,14243589,371362211,92650928,1663153040,1464825140,960853573,83550166,1523676002,1496408481,871798185,173721790,1207603114,93221067,1142495107,902402514,80254919,1607383392,1464620234,593601685,1583684197,226698749,201820656,102166466,366137565,1562383379,687051807,688698256,1797963490,879123528,1773894523,754021982,139372583,1384582049,1061029900,72498463,1169118346,2005167936,772758141,717972080,608952516,1871716736,1747971707,1149365202,399949557,336868877,1157550202,633035623,434842560,1282325770,499740285,1349031574,1792539939,442839605,1457313025,1113679091,120201983,1194951323,1279483684,1904194933,1778442699,1995010292,923122831,1589447276,1741211150,1528437399,539004120,1319277398,1490428596,575242260,1298267032,1534163378,895053813,124887816,359787849,1261412548,893493144,774583284,1262629805,156219982,703701087,1113169730,1801929652,1459344990,1580611839,1544608805,350735651,812103687,716359817,1404433041,859684187,164112398,468866010,1735867383,525451441,1172097432,1142115832,1796611490,1549024714,1094429539,466044963,60775358,1041092782,133471261,236879858,1951271818,322080611,634257216,437243333,1131136371,788640846,1814253061,1505203057,45151402,781994106,1017959226,1187617368,1824009542,1404370398,216898910,725031629,1402405831,1782013627,12167758,2002114269,735622246,1914734813,935305933,1421144996,1589309910,1886085830,250382006,455875113,1153135770,258091740,1303082225,541096523,1404837032,1506555685,1476820122,686418362,905655554,431007312,1466561737,132490603,1113979887,1508870621,393812054,793175731,1046294726,193382974,240017377,1785471466,1073056772,691320935,1711383809,339855541,612745684,728204845,1398894561,365487768,207741456,1104434506,671143287,1513776703,170837017,1056880829,1666142571,314706411,1897303753,1359930374,1641573485,719698346,935757949,327245795,1122624026,1582078575,318486069,16283655,1847879111,410633088,1031544908,2732874,1051771515,1968270150,178833703,1217138664,76522651,1302830933,913786680,843984310,310868913,829263670,1085485468,423138820,1489917511,622505893,1094433500,1751655404,1193185490,254314848,393168276,1613761412,1546181216,601754368,1620467677,1375804936,334576890,749472304,1578372541,1913037193,1612457601,1805031486,1482625437,990878007,108949069,557238755,201029398,1438089158,588769821,46237512,1351271936,528775047,827155000,838394531,422011126,1598879392,377927664,501245409,51114137,1153663110,1308407400,840124068,359258167,764115115,318540813,1478414519,1956685727,625121456,514125018,58084718,1759531476,484736177,652063638,968434208,1654810989,211196290,850556427,1498873283,818229977,1418341451,394051371,680966496,1626118323,1459040552,1622033315,1419007593,1438486867,48054852,656162112,1390269049,491776823,1592705457,152309194,1869156058,1422915448,1447296107,916306737,174856095,1578070496,1871378421,412600920,969253450,693183546,1695348372,900875952,1629737945,1348164745,955077943,1787573651,961776149,1750891297,1694953152,1869427836,784912247,89243891,1228469592,1919742681,994780729,456128681,457357568,203555833,1397141569,312539567,1123398909,1231396675,1792163464,1679619477,1388132069,830316919,1232576017,1346399325,1185340673,629364964,1972845308,213078231,173915977,1093665673,869388614,43005452,278971208,213773001,1585519801,359155706,646249379,269714392,854039277,154628452,1164312212,1921456752,288402307,533915254,1145815231,1204702218,2007215775,1904412941,877296304,1704026508,990870443,479547325,1978646947,671923607,1376272099,486035310,886365896,551843569,87483382,1791812765,702826444,674192118,279938372,33386069,134996205,789411945,1796286818,59080752,372287762,126597820,949945525,582414253,21115214,31057719,600826521,963468044,703819412,740204227,880121877,1072350550,936587321,1094953638,1407104175,290877941,1259733710,650909458,1169426630,314255987,902793466,314312162,1913377448,1901837678,1221240460,1302805402,690318354,201303405,1443937964,1832201757,1863696796,20474713,1065303892,1684766535,744495938,739612508,1165714552,2009467310,1257406602,1785716426,1520054770,1453394091,1440447215,835870714,896798183,1313226019,1580782211,198716637,198716637,198716637,1866582071,1087944930,215875254,107447573,1279605707,779528630,790863769,1724247944,11879842,542106452,1875287971,628273085,916526607,1895703506,1742804108,395653891,1562594820,116164229,629569722,532715833,868767238,1652187860,1852544924,911690410,1598716221,1104038178,1955062515,1277293736,652460186,273731472,1979192094,232734616,1420157002,347662365,1484829779,1632113328,1916774985,1726725509,39097203,1942412071,1440531042,604467101,714012100,1131460547,877296304,1823895599,1591490285,150752882,882375063,676583104,388776783,691552178,918044142,1320631705,1654930079,1461501267,1943667732,1765406118,1678727657,1813100781,1692594574,345381201,795990599,194567258,758079816,606032715,815485489,1197652133,1985605231,50515064,979136902,205836458,14713305,1544518574,1028257895,5069041,188796867,1616457346,1562388574,872999611,672572921,1443198812,1968361124,584814839,688010378,1244236545,311262671,743270044,639640341,850764726,1916734774,906944888,1558740750,760860998,1293610948,298408698,2004489649,493367804,555583572,1061947579,471889987,1506867543,1168920635,208038476,489929494,1161049826,872124862,1662030575,452812361,446753020,1213736472,461001719,79286763,747014624,777860773,642723326,553728705,1774088500,1298262806,357433573,477908833,143860492,1149523878,1261025627,1597358059,507101041,775270535,1012441634,451336393,413997426,1176236045,1626449884,1647333704,745397752,496183044,1102315500,600906981,83092519,1166770623,406529621,1694197446,628008589,1345081228,1964204981,550009433,1360704002,1295216820,605635598,1173417262,1820880611,168042581,1542919208,602686241,608534905,1888685534,751376874,1988277526,1407486048,598392471,1970770859,43587951,815253861,1807948,1554909790,1122795679,353743870,1701382105,395926321,1685233828,1221208571,394629994,967020114,1624863339,647476116,1784531140,665883933,243236413,51924560,1191512754,13097954,1526296306,129927364,1307527773,1237660968,342498158,1812000807,845213757,754297006,546478991,689915384,943701980,609102280,349878956,1327709198,730206714,380725402,154114751,178599704,1792162853,1723260668,392955598,920329177,73807577,487514887,1716735781,370681240,1697720991,363554735,899216936,345908916,384139055,1153584306,459723947,681679685,31241147,708948688,582411852,1149299743,913890835,441691778,767483210,592617753,1615611359,765192121,1471451034,10952604,350411613,1409069993,616521515,1840693167,1015808336,1053973883,1953219193,80770048,940375664,459454839,1940389461,807198213,1226512963,730932948,889807577,168881081,1218814729,1237354192,400990557,613922122,281245864,1976007970,1472214734,53597786,1689722533,786678514,1761217921,164952783,883684336,980461514,1551232262,1214149356,627633006,1203378099,815994600,656744992,1328034218,1990194620,522673283,1767954612,1431048685,41006847,1152658596,1434968285,1637797579,298601772,1181404628,1220460609,815048070,696078425,737864463,797723504,894497709,1962430227,1362488217,740356015,63251221,829098944,1396840627,1961607261,220282652,328898178,1418102769,1238160362,8954003,122253809,522467122,797751268,248862487,1527613674,1880340384,1190944057,1335915513,433239267,343884189,1663487623,234208908,989937461,1660329838,261214139,1541600822,1128901461,1461560670,1966486244,1998757949,393636113,400750220,13330669,780852852,381210606,1563177677,843779655,363910052,36581045,908579886,145719124,651366255,755414645,1138056355,261093012,496255441,1518007005,1658517624,83455950,32329750,866079362,843877504,949604780,1590047706,320411911,1303469587,1212068229,1513683659,771519691,74293632,1753045795,511833744,440078840,681036300,1790069610,1973019140,1922132710,995270011,104060844,1504505134,1256416482,746398096,805249535,1037701473,1734567644,1322359265,523958444,1161835766,922591507,336189250,1378373172,354103605,1156443882,1227450461,783743315,831392793,1593108212,422422936,223746853,713565783,1382543335,1548914436,448662087,1533312860,389694087,1470385091,1905374949,416255684,1188467088,1860818229,88871231,1100016029,193737936,924020341,1162169,382466254,293684044,1109736557,388699828,1103116842,1272280729,1127352041,170320887,1097732353,1821365679,1628718983,1045791282,840190303,1684512834,1961648361,1758926992,1457310413,1390943172,562509270,113578878,942073630,811504686,1603214638,1024641602,1510175792,653600314,692844065,1032205958,1992520607,1468165251,1778759270,1070927424,853056323,239092900,1517778723,974387674,392843575,1330796933,1186804205,1783371981,804774598,263712000,1615133244,604551626,1867885658,1753560238,1527292969,1651121260,126514176,429839928,1226713280,1577247002,685320558,869710750,1853663272,1968379357,1622805241,1518213203,963408555,470421699,1473364060,1352181634,1246302564,498683645,1521241072,1737156627,996905496,1153831168,1723331982,1161049114,1021632605,1708106312,137954419,1061999856,980939803,1916355527,1234767980,511632609,510260329,1874132270,773533546,1738637282,812384369,1634095073,150265805,657060667,1799959110,1055224069,1897399439,1954021672,573550283,528825099,1091246662,1415942461,739759668,497389829,879499464,1218753150,1578807024,115906145,1002380213,900904363,1691319890,2894258,197382721,1303781890,524443381,1374100126,845777131,687150468,337514777,475693124,346188333,843414829,738654805,4817475,431566783,1721417357,949852850,468951158,1364093518,1500724016,69685395,28699734,594564744,869199744,656749216,1311711970,1683452666,1169166393,221887066,425434437,1872529878,1160364945,1092537067,1681960625,1760129874,820591063,341322837,933341323,1763362306,1946532106,1609490631,924805031,1949490286,573660622,131074462,1307441918,1354320063,1269778996,543149011,56815906,1898079031,433292516,1265949285,1768758457,1924108199,69897836,858810010,1702495665,110236610,1389019619,1460016556,1042317096,1412163252,514791223,1200199897,1947731198,533372216,1759970008,229709592,1967100425,1204477709,458223939,775255161,1422934158,440040707,1031455644,644338675,756079256,160787357,1063985087,1626767384,538706648,689738828,456569204,1230042228,461142378,243045297,229170223,1153503757,1723967895,1021771911,444411908,1156703215,705141062,889901189,401987682,1033682617,906773464,168520784,742223590,1870885417,1785808306,876149086,137647634,941062557,797613246,1051730328,1766184671,1035239117,1840183255,1953853349,1308199569,327043825,4901619,826932442,1105153788,512085654,1529952048,1483709422,421092864,1147240429,602460631,214973959,352736904,751767514,6944444,947421981,1595333426,1990961970,1579632095,1603529844,1182694233,1733956478,854221638,1173658826,521617687,1342260849,224550816,1600425540,1271366651,1208662141,365207319,1270880794,743636872,1784498254,1599116885,1864183474,1232403654,1230339439,492814187,359357588,230526553,1592558938,1037113174,349292581,1561393050,1353877586,190428614,266178539,1616752148,522245699,1269700555,1378991647,878846802,1473620067,29431453,1834422503,201576868,1512962773,20392632,1113158293,576419425,1373620020,1325379741,519781182,368034142,1621063699,749148512,986971588,949562729,1330944003,392004551,1563932631,1786978748,170834497,1307221854,461513686,1334171582,1467919617,221971644,496278202,308038221,920079417,163271967,1770258210,96808713,470964163,1749794604,499075886,1116863807,1710481597,769357606,372148093,76174409,1609995654,722119517,167241542,1145747876,1298859110,387105572,278372066,123418944,1647783706,1996303579,1238283434,1288464414,1749006412,812047888,935216395,1675437965,1401265955,1243199449,1643474777,1800360331,1200444027,1828285999,1455541502,1043392906,1359647254,83838892,1254089627,284983390,1547178205,700598336,1354847715,510165208,772700381,1123621522,1382914493,679627699,1522084886,1527411318,306769638,801199814,1125840104,721879444,1170732991,973420529,850083748,5133616,204604534,258139675,1151796036,708907896,1805542101,689010987,86180835,39714808,1369137304,1044913487,1655019097,540374518,1066423796,1416545158,794429460,944899381,1381561296,1105484011,1594206131,203057392,150471800,1021993269,561456698,539612125,900038968,1590394568,1932704737,602757351,365150284,262125444,211536957,445221772,1652740580,1671977766,1903672584,1736470647,950111651,298927184,18233890,1647285803,624551468,1659764268,1968016858,1196318048,904097045,1939232134,1149670243,310312841,1653696424,1183332282,407618563,521066464,1666309533,1230962307,873203729,322443820,1666667447,13081952,795220121,1982056430,165953338,932153245,1433637984,1462420504,750602785,332420379,1849982409,1450221249,1505725157,1051330853,274844001,1530673633,836617627,58284796,685372316,1350535787,393763933,1388886943,429185010,1442593611,93949908,1208402065,143995737,230224709,892122459,526719489,1248712941,1234157605,1266042449,1063025054,15982445,770566906,578812435,1666048877,1538784209,393983546,993476618,1688681722,1713640535,1360914959,272392787,1558018967,1801866441,1292316658,1727409293,746672687,1529325001,15134186,1051845156,886778956,1192485252,39323483,1053906410,1068907911,620112539,1768506457,1214297633,109023788,957858780,111017043,1182443523,893665271,1255765380,1493686942,1033315639,110642820,493730716,1392825425,867728998,1793508351,146715853,1956200712,1601860089,772667394,41685784,242964396,1239546425,1854650530,697448168,1527425839,792286057,407412978,459069156,617421668,593966871,305105219,326440192,1208049796,1685337638,1488107873,431236721,865648452,316581726,1949165593,798384441,798093436,137255265,206762246,1588755110,1465950172,436835510,1169085457,282201832,1780731893,544438680,1711948439,1567404028,197942753,1613086570,243563812,905502075,528672784,1194074500,692718944,763647317,566090826,980248034,440392284,516175064,1631291191,188906526,675448532,122581593,1207063129,750726756,281886642,1898057339,1158096836,1142240933,979300549,1093332909,716098368,1561604370,607816915,274439785,84362579,493088100,1061689157,771663706,993665001,391131636,1930930957,361206302,1458443226,412953386,562900174,211643418,581001700,581001700,581001700,882132465,412054029,710330975,1195132989,612709324,1920586768,1573624519,1466008407,1618468802,687973032,1468669071,174199721,643426934,229863666,1111061272,1660563823,202889403,64581511,437588296,1184375495,451549865,189654553,163579962,1052037396,868063210,2007250906,1487730813,1245801933,1067126290,1295126284,1069302665,663872368,230609849,1871253618,1395664787,984660043,386088121,160095677,20972174,793301485,1493355390,842727482,998358311,1962883287,792286057,1677906438,1227789021,29416501,840688843,1353968204,388488710,1980350871,1049360187,770584140,112295650,1627865609,572628530,81018933,106288432,1505082691,1505627750,251080220,1137150550,501875403,1813544221,1365927241,917887241,1536177936,562994064,1536000070,145320533,276743507,999499193,2003651100,746608837,1193215552,713665597,14752934,442551672,1399273195,1166601361,434909268,1404084851,360621940,238623884,703724884,741538105,1405085099,864001151,1374773985,1783809123,1323164362,974155123,958128744,1272786627,471790079,1215241805,894233157,1824623173,808055663,631945704,1086218863,1425382353,1422800659,448177519,1227546805,1299071445,910974292,905134049,1614286903,1692894243,2012349149,157791320,1108645605,1959806341,1856128021,1848339,1559173494,1627757761,754075748,594485391,1462710353,1902871325,1746613423,930603572,1316461153,1147396822,1099400868,138000781,1118829682,51378296,700107982,1465153476,1332030015,671726386,1360816333,90647162,65290117,1383716831,390504990,710754807,1576812654,918426722,1137377456,1814225998,67603951,424839911,764989365,1003203317,1720106700,849096486,1022488060,381758670,1663907907,442812161,1190781283,541941974,1990437546,1701931717,1431381661,866675359,1764685583,1700204331,775941119,265584162,770967765,1327532117,254480221,845637334,732398149,1280398058,1577793264,147660736,12561882,339241668,836871152,684251237,1040697717,1390478292,1704747405,230068228,66784557,1214826336,301437929,1294945298,1434598833,1281133196,1982392891,1834376067,947676113,1368521705,545469086,1781844130,358768091,411445464,1943218892,887760292,1202142094,82950375,449232479,1200365931,149737495,378766285,1534065887,811885645,985030952,1963511349,24437004,475097061,880099480,1627071069,1919933298,1555235843,1070553482,889588797,112408028,419129252,1018908912,1935317039,592917243,526771545,1990610371,1634187051,978503503,1299776926,1672246884,926482762,278563263,1836332139,424552271,816363280,1162889615,1054587788,1984140372,450799697,435793675,228528372,1838498609,472412894,1795379733,1169627342,994650868,595193510,171360061,1899471396,1217061695,838740083,55625270,1056550161,1736709024,1834305011,1946924495,643955699,1651780104,1804376129,851872327,1702888028,1389117543,500929958,1516016072,1194491893,62641417,1468125251,466725693,1974612495,991264028,277252308,322541632,355134808,783634241,1780580910,1312922157,1303016117,356279522,218841636,1948369918,506244489,1403290557,860503255,542815348,1727688076,670548100,1451955464,1183766606,89557174,315133785,1611159920,478117782,677998300,711343590,1986445200,1186256542,1680773705,1625468971,954537448,1371219762,1295634120,341516954,634539127,1131144350,136547904,608430462,2005036349,1474186673,404291519,372198040,1611270908,1578627326,1429146837,87697977,1092093642,90302735,387300786,608714709,756957164,636258382,559926447,1714597948,1481118163,1172981325,922212351,90736816,1951052558,623390068,1824417862,1347821533,1198099131,1917030521,836186314,263129115,770950012,1274768765,1569187177,126693463,1603608817,55582143,16926620,1629781698,893712462,1017941180,1427728529,274313067,872350463,1247529056,2000736287,1527507334,1062085926,1116639921,1554255984,902545413,855204861,990760896,612223640,33553985,880545452,1899791807,610780383,731267335,1516603372,1112995411,851680620,1344461987,179909949,883796270,1124563608,1664756909,1721349540,1388143530,498747744,1212495014,900798749,1858696260,863121676,434107133,1996268926,867780895,896466906,940993323,1101309369,1025380408,1692735516,464048206,835557958,1362038667,1883519361,1204334592,1058458279,149777823,788882126,1473999470,768406686,1034434979,959252128,1333158856,923192478,1554279956,519368097,1278298933,1651369602,17665727,708794443,707455099,30975708,957970013,1374286533,673910841,369674642,892957623,1107174848,1419296394,276394319,1400911623,1247721887,2011004138,1121195704,545779823,1603541073,1710397880,1159018841,1757017470,190441064,1901384484,682559603,1035562581,923342375,807585147,1026537221,1888768503,149203087,1274938385,1505393191,1760733067,823364797,1837039935,1029853929,1012607370,496101917,1307322086,276044117,840989712,1385690010,306796666,1527145072,1013880142,643419903,1394235834,1996904036,1788153112,1954887300,480733042,213608178,1385530431,1192173758,1909568248,1719014470,1095968266,1861367374,920061892,151847612,734973794,140169774,1498512312,1903447599,1282840193,749697474,270354468,1536255076,1425415725,378677240,1391279018,558966686,1265498805,1737083032,2006624055,1373102645,1722107566,939923172,1054907939,873076715,64718339,28520824,1765890446,1049218729,1904413415,1624607219,1938405551,901778735,438202192,1986427763,1156748662,1413082946,365136550,651369586,303733338,488610751,1671509939,919295100,873582371,997408193,701451332,946876512,43361824,1307843634,841410675,1790427427,16189760,16277924,1836294414,1233714397,794347082,1837319244,1437107693,228435040,1818182826,1647521376,1041656684,1598237962,515561872,508395537,1381764821,591929304,1548489296,48714959,161276324,1507689635,479706373,6197473,1080534638,423112841,545685823,416042705,1363639433,1269798900,421402419,128053894,1265864782,218186427,399405130,1750748591,1364599086,1252955204,1912767359,226383249,723268968,1925694601,829615402,1056376879,1134234489,458217498,1242560473,1942526942,1546899748,499638,1506246963,1187489867,1494485393,707641372,4000858,1560694594,271373708,364433290,413816642,437344126,1204238854,1057285445,1039425542,1689059259,1281249186,1621967139,150472471,498359396,1705048693,789194568,1219893633,1283708564,1098478231,417389974,962869850,177992548,1612890535,1769150111,1330767842,467157073,982063499,630108730,389638924,127333359,1733956301,1749691824,466496847,762454008,1789663646,910343410,599015264,1503447755,120162830,1713070452,239027832,1511054542,322775723,523866865,1078104213,813317295,1102595576,1282386936,1240818609,1696130208,907739803,377676644,40807407,1959168062,1928817971,448368943,1473661104,1751942290,538676010,475959565,666627857,536655321,535463081,1615933216,306213981,649763117,502589283,1644759438,478978226,1648629868,504430466,226388710,1333041227,686542382,1509323950,577603560,437642863,180024857,1057565869,557664362,1308788150,900863384,1487194871,1745195872,1935250196,1686534128,1154766847,31303502,315734003,997817750,541350308,1053672681,1732024831,1988792550,500862798,718665307,129201016,1319606219,514218663,1822110963,152604774,380990268,270937260,733392667,119390965,168903737,626652759,1028963359,1194945729,471217273,171921340,331963358,900405623,892615834,1680251398,876619577,1956356168,546933841,819184505,1177239783,98306521,894046154,1092004293,824175381,1235547031,927944081,11275060,310242812,1866677597,1560515562,558876748,496907252,1695839709,1597914937,485361259,1236333051,1050997565,1055571349,1154359480,507330201,1405969891,1016612544,1049718579,1011716601,136737904,711386901,1763941243,806692575,830097565,1970373867,1340191884,2010347972,1598961311,508731777,766488734,257270900,32179953,847940733,126953245,286080258,548282034,120761718,791051536,828774916,590796032,557767594,896205037,31540237,1515032017,99623621,68886335,1132722676,1258895476,1022907701,1043181298,1266559757,395710383,98367368,509641954,1902866187,1583173817,861174355,1093029518,1026573163,1340955332,1768005954,981234548,1704830369,632633032,1855605893,807687865,375386475,1024867851,750666860,1280073261,527916771,295100873,5229403,257131699,1152534207,161500899,1792280031,470032759,85322794,903827568,1912807101,1882512616,1696887238,1021975823,19355125,248667840,1679022877,386587259,1257522962,188102880,1839187828,454542142,1312880876,688031052,1717875027,485530255,220711272,1741000115,1138590944,236885519,386942835,1968907871,171241091,770830416,408472919,1538868369,114332910,1252881376,1314268816,336053778,1513769648,641942793,239836602,938735352,1919100551,789295998,1722060925,1106003555,1952389758,474484862,1361516478,378019883,1878005420,1368258724,1147563000,834035486,73218607,1492019738,1576827692,720808438,19908929,47336710,950241874,13323471,283542114,1186261660,115187361,1281993002,707780075,567430357,322592499,524689844,302355034,211181191,430375318,1633171834,1311193769,1609985831,500317566,1010317705,2009264856,1447166008,1385164145,613357184,473862030,333080671,859298237,1554901367,1994980830,945108187,1252801689,1874804674,1498576539,932045065,1136767374,1967399908,34852865,1507774458,206011846,332314911,1031785747,1636361704,1384275019,451203873,1633430882,1884782014,265383629,1874716409,625949077,1835813188,214974698,794914934,1459247103,585714849,1899190219,2007215719,762417157,1298437455,261263303,461846164,444371693,1502824456,73962615,1556164186,1894295012,464572761,427751105,1662347631,841551375,201971376,1241150210,1208844876,1301377149,511647203,1463385952,800728803,524133623,1615704210,1730979804,1930507803,1155200745,1716138689,227958735,1405787243,699385791,603722139,1216959179,1991618442,1898786856,1086262569,1019371881,96485093,469894701,751539457,1217422867,1087523608,221831784,1504059380,1082422892,593605971,1331744722,757339119,1147283984,460998414,1337793387,847865286,1805173692,1993253289,1841260265,1193422215,1594768194,1243037294,1569378650,141886825,210508166,1616337449,324670446,1511427595,984583921,447810480,1202290727,979999477,1463548786,533975199,1003427300,271910577,135438293,1627935680,335572462,678608064,1426592712,1596137776,538119540,1587470779,1587470779,1587470779,1931346520,271165628,597920875,574035614,188137792,149785628,822703299,1123386182,1541229262,1481530571,1596568341,1419537590,1227590243,116758596,1298592795,810066446,332919305,1120225752,262195232,1515395444,1269983295,747286,255538927,482735434,342809924,1386390015,715949567,210453865,297501578,908119356,1640947109,295620777,1527191068,1847504456,1745898345,1994127860,1081517548,108152108,927135064,1040084326,1494357979,1877808858,504218383,80918452,427751105,25590051,2327017,37208180,618780071,1506254835,1278808596,196305831,139963341,2004321897,514939570,1883602194,1943798899,882228931,1648639424,1994288352,1752001552,11435166,478003664,1884955887,1124271032,1323064494,898464445,522591396,1671046995,1699091616,1842431917,629782922,158727121,666837757,426849868,334129749,90297205,805651327,1089690606,142646885,1815216610,1769987553,69450858,1102505712,166146800,586712027,309098412,647418804,881196114,1881213631,1889775247,730573262,1754746735,1182077802,410991464,764908662,1860104992,1392532092,1022359302,1438447085,1229999809,601940150,427201669,1572820878,500457790,723497008,49944926,631133130,1021692510,1283376946,797631040,1943065974,1212916553,796183931,961804557,1317181641,1066873306,995616918,1640519812,1439068566,401067040,641185040,901224709,1868767726,804773496,1013495532,1376781129,928588195,54225343,861793681,940430348,1084870425,1484310798,1420209745,826368046,333856718,807858567,1261133486,1477599388,416890512,186057248,1810790407,412361282,7368166,1678507607,398362499,1215819812,957291064,208360051,980908384,568317607,2215897,1536633543,1453837010,1923318639,190278111,946980122,1094915763,1046224290,1977441392,81505540,376404552,389953391,1416278811,1448673138,208023021,568342929,1350681008,1761395479,1703174898,1859461746,549414063,1912776130,1867903641,1531624382,776468517,223052721,1124441207,800792410,267114532,416545955,424747220,628624352,925867113,1536487373,1042937820,178123601,223077774,723844311,1655697966,1103565632,17405202,1327117335,176030532,597097788,725089600,1912040195,252110864,295312443,837056810,1325895487,1119933974,1298831777,547435354,1120076348,402281431,1426631216,1513088628,68695877,1737340683,899835750,660434431,896133319,1270587467,1213307240,1643883003,1831057472,570066376,1188582361,1589651315,779775866,1066415139,85775232,172848304,1070061102,1443989805,585950657,1245632598,1975812556,334362727,1321046280,1215532836,1989921049,1931459738,590820769,713072850,38777680,1996171213,521103546,704482146,1005643094,580009026,72726179,1529987307,2010467663,146542936,815219917,473075716,448801771,174828081,1942089844,1782096025,1564325619,91839129,1246329648,695223952,1529898027,1245915395,1193191607,1621612960,1766102177,1704085505,486948075,1320273909,501233320,1851483027,1513868348,187889019,1959022635,493343996,1250509893,1622163356,1459922961,1608137624,123556268,340308206,371939358,1891109359,1117681506,1014928623,277823060,1175275456,233241333,90383728,1425042027,1654856523,1515251572,1813430343,1544553704,1850148143,1604532927,1146626070,1874605572,322860741,1830207447,705311539,1258571291,654210066,94844452,989441654,1362936102,1222390297,950456503,1895026159,1637441472,99638872,1248332734,1798474701,745472800,674961722,864849179,1042412419,1435680260,538860994,992911179,1491154119,1412563632,1341132536,1867541911,1681523958,871958275,301806085,1730174955,210564758,1658542471,1864283651,66065730,895064505,1247967524,1194176250,1942184915,1509240739,1102915973,1900304123,1115624633,1750795895,1867562817,659342758,1700578785,117973349,731691853,231343241,40024466,1300019172,1084016396,172264384,1533810933,239416568,1938182954,1829998373,1912807233,1783990498,377223693,333360198,650049761,1601368479,1390953921,1686546882,369728910,1307862962,561807123,879686040,803397862,852526874,40798438,4057910,1614751724,347454399,327336933,209114868,1458806282,1561913936,1353546350,900396750,60429134,710496004,161000024,1256740864,1230513807,1566648149,1181139580,1699361461,1885095926,1643474683,11819184,290422711,543318379,440455781,1664918621,1384335114,1795512102,998181545,803750702,490016546,41454099,926324336,212904731,1899817899,579576257,251951830,705776449,751661530,5223788,90539482,390952822,148022137,1378916948,976335336,1009574725,1672800792,1501335686,1868566120,323653995,1883862459,1607538467,1353382625,1788244892,1453292836,1998206165,1320120841,75262686,330093099,1859723081,1457161796,606959775,1180897763,905697804,1277998960,524123879,1199996534,1895290437,1070145590,140159173,279137234,761434133,1713287433,1017082326,1631942964,266119840,1948458593,817533538,730570219,1826516863,1042047432,1955854619,1059024950,337809446,1290760546,962167228,1061065008,1123813074,1487737273,432827188,1031055303,1902230063,299217132,136945965,133294437,970370460,952161770,970384619,703228325,298823396,998371648,362772605,471854285,715666300,1482225631,332219121,288764449,579339828,1627689191,1880037289,1944221582,1174027064,1014782263,306875130,1900936425,1874032589,724564586,1288203942,460614097,1973491586,1491435121,1478496343,10174714,876099488,732651331,1908359899,575875629,114607224,1947632348,1755917013,1881449169,894872250,1922020444,283618887,1459037320,1031519423,1031727782,515225653,409250964,836187665,1939100611,569472134,1051700135,144390738,1742784601,862675352,1146101305,1836877683,1223376802,1089244221,1557217370,1170256059,1453576499,1706614420,236198767,469839163,1572284958,323369020,1998018547,1254566462,1733323293,1393989549,573764486,763678743,1316708538,814392260,594446523,1417609523,902899445,1976363809,912201991,1857176641,1105927577,323221765,1953550006,908303630,1352628239,104773926,1881882936,1977162163,858286549,140117322,837960453,1629755724,475223518,911208396,1682971038,836836968,1236213468,972223567,344783928,342124029,39507824,858800252,1366222649,1676816117,192134268,1912489231,79982685,1700061321,1597430939,1411182600,200765020,252771019,328079825,1251820427,593154710,498960834,1835031802,1200772773,303095963,1441739404,1054486965,1176186165,1433240549,473039648,673119466,1354553124,1913664416,259762164,16278359,500684900,1168044385,192816808,854216144,101772082,1951388201,305948926,257557082,63847387,1410113156,347928834,1361866579,1546437626,1978355608,788834318,1848252693,34929049,703341708,309701315,195468603,43751678,835154429,693917454,78015406,1147240429,602460631,214973959,352736904,751767514,6944444,947421981,1595333426,193230810,695487296,1682555658,1454801855,1621024423,1372378581,778444391,1346441759,898661238,459235308,1854018735,1442441650,944412517,798352342,237907601,750631689,676067745,1526630459,169137181,1555616193,629204434,201516437,195407229,764125534,322268850,1877808444,1294736906,297246648,535421336,803152993,959699214,989956756,1799071835,438540279,92669325,670994429,304558712,1578194728,306884481,452832515,1409048619,1396326382,36543811,550922365,531639859,909972469,30822248,139944886,10384385,1160333228,949744899,1614077351,1865727136,815767414,1579434729,1025448859,1738694772,1529967471,1645127018,610229908,287046080,2012760389,14167972,646350783,367158370,1862155329,1934256840,46895093,1450667397,2007945023,968048275,1733033854,1691608128,1652977489,1288219875,1072105302,1017716731,621302455,1916178827,1180943439,1896324325,370196133,575887512,1537372196,165060295,851679212,132695084,993270545,212649762,140288015,1240412091,400301497,864731,1318659809,1568904848,1965376695,996936179,1468443901,806646926,1317752193,1275910675,1604862610,525402133,937414007,1666150052,1148361746,1652250484,300865275,1174402548,349419684,1838652637,771461330,1836263631,1337343745,684507867,1838425203,1745995395,452158807,1734849875,1986899989,1535367461,559252353,852060995,1724446005,908882725,1101161930,808940345,711589051,1219128811,407065404,1030622487,192552929,1301918116,1229942648,1434430162,990854632,1999018214,2008705419,1538283934,819011512,1692894936,487693082,716378925,651797289,1605944492,7424382,1987965162,251718997,1142134015,1971605705,681796744,814930628,1134584217,1748606429,1759864890,1472605152,771768714,1968630540,1160786566,1570337043,948209145,1028932908,1942683807,218841508,1052010893,1622399322,471154440,1268901636,1950123337,591470283,4030507,1758208983,461093958,258490797,791440645,873078797,1437797068,862095741,462238742,927342698,752907172,492305956,1018789692,222121630,1816749949,1901019388,1482578887,1185554922,1785072346,1370374186,38236638,1101729842,1393622627,951930576,523253320,608848143,417071614,114645476,155607002,1468531483,868297998,144332312,1395872765,1469275355,1764900711,1282320904,457269158,39217826,1249113486,717336449,707857116,239407653,692900486,927835313,797044138,990391228,1768933921,1570519405,858036876,227446850,1638175168,249814692,750763384,1701625379,1864464494,1209607460,310859601,762103985,1762622136,347041977,1009074173,1520226161,246562519,502533975,1102893532,827073071,492859730,1466806952,293044488,622012743,734549887,620628976,378823452,1790721259,1021046216,1461873087,900500268,1293729503,282304556,930534988,1502956264,216008670,1036382462,830101443,417852455,406898684,569606186,1470128139,856326186,540754760,1997791046,1930980338,484939029,1139097300,1676572111,1845287543,761720468,992414364,1109820297,910212945,131606952,1714974723,1543617574,1426124727,816967784,1088626543,1395631002,11989939,685129557,803608581,1847765174,1596582023,1694774354,496003269,1225525865,1905519337,1092039097,1614083201,412226560,189950296,1187805748,652606370,1971625077,156144857,386162902,480622322,1738007954,1253507964,1036384414,591776078,29350329,397332374,1437677636,1328520564,997014762,1870594946,2012771125,676109258,1471847995,169563021,36890524,600883940,322180909,1574719430,1858966951,928900781,232512468,1550871715,1332746059,1446771477,514361296,1563907464,1566054669,772357093,390628566,606050358,1595047187,1897195173,431922520,511091620,511091620,511091620,1391008346,643385618,722030763,1748684485,138634041,1330982690,2002793086,388907863,1718144176,1281665697,1592284807,1528153108,752687999,221462683,1692733980,175929221,655360,199476565,897608991,947777901,1942484212,1692289637,195260507,1275515536,1398556677,202965150,720744038,1496691291,99344849,670687719,201029348,1019168320,967344481,1926086910,1278270391,877792260,1786026208,1824962662,1710408580,877142505,1874436721,1160688480,1320206422,513088493,484939029,448937143,1269048209,1994211797,538742367,280500627,1100790656,520982583,708579076,125084114,411788053,508674257,366053579,402930653,1842158755,1171037504,835478841,776430635,1336347926,1135162822,1952854513,1139142409,75096001,2008507106,2610734,420998976,556143716,1369419476,668514074,708616745,376593195,634396907,1504738086,1638080597,117503044,1696848313,1498468773,1290550291,1838009173,171395275,129359919,282891856,1469112174,1243082037,1963883672,988579767,1913667241,1180472729,1897447998,233881487,87044350,1043527828,488838931,1774672661,1473058883,1495972101,1003126749,1181349369,1624515630,1401408659,959860654,1243450162,1630381608,1243472154,547115620,604423967,924776562,18444817,820983921,1023303907,1852495729,1037829148,1928211975,521346375,394029702,1833583629,1576847235,747780754,1326033690,154378006,191568384,1989607795,1787434055,865655544,675777448,315890996,1047907849,246247478,1796408847,154138087,1955896621,803094708,1267973369,1261798111,1781352071,272625857,740833988,1513099110,902683935,1902623356,1290907380,254077978,1452586368,1942146687,244706207,622385058,23955431,1771365198,1714044377,1615714046,1514619862,1293532929,1099184029,436833266,990225293,388238867,1509552931,288466567,26321132,615768152,978828596,639940710,1709083453,338252591,1537613889,1461792516,425352914,915294780,673524779,1920177289,296106025,1862728324,1843435190,62942847,1695229631,354516059,160040438,73854392,991949809,449075166,1704158343,1701255730,681829639,519489604,969222639,279358218,1704490922,213706361,37641062,1744938812,2008006233,241591772,1241609174,965569894,151034632,1422920699,462071481,1421746919,1255343515,305721051,343805691,194448722,1767181656,1516651342,1975797753,667849921,1983478997,1774836024,81475320,915155846,1181966057,446320903,257864293,1464081852,1004908077,620655315,1629265680,1108234478,873032571,1035191674,1326778104,56912990,1609025167,939922469,412451072,284350500,1254991445,889034528,1140082314,441453881,1739282898,964254177,1692485713,86731467,57039347,835248844,1752580040,133879499,1090945108,142056880,752439288,381186230,997900243,319756745,863803953,1756710472,1109699064,1077298576,1028094063,245014241,1357342909,637517238,920520370,1349679591,28995262,401172299,516229349,1134047257,114803143,507668342,108108772,765463935,1756110338,1190471345,1610373747,1225010113,1403069869,1060620690,1548708009,142214846,519160884,559119175,1031841033,73676160,1187264571,1401824338,658481056,408733494,1293524372,631019498,1330877918,925513030,139070117,1295008747,727481945,2000172731,1069434081,913983340,1310946735,1047557737,193874851,1274820110,372488648,223348626,441427049,1616486512,1133946322,188369200,1414827967,350601389,308210533,1987466301,487907054,1736344890,1117972953,113178662,1521110971,1290351026,564220483,1418906037,923131045,2011690715,1643320382,1821111099,1262661520,1331025814,235230478,373830218,1752549800,729105505,582629591,636664935,1117123312,1709178027,1671794510,978976385,584800660,1461322247,175360067,851230889,1008142576,954959542,1399050632,1241079784,176900124,877244499,405495340,989525436,493080767,1188684963,1841406047,179877092,1322874356,939341520,532169292,129513151,588739985,1306772841,670664980,568623982,1321299465,744217272,1529710479,208370827,1858511208,1410926501,1749127711,1876817966,1757357964,1126949224,1845021963,421146017,1835970744,618440918,1271713452,362481462,1864207794,72094,623762510,1613530673,716270501,1335453756,1393891152,1804170561,774663517,173615636,2590631,946063706,953014196,575844128,16315568,176003698,1172621016,260156466,409425820,669421981,762387820,693326362,1573943252,1872035704,1458117935,1389572015,1648253493,964060437,1440596941,1655984858,1863366204,67416286,330103557,802463488,1308253102,586698007,1902907911,1541225014,717099317,1509724751,1931551862,1396428223,1742589549,934456223,1824104712,410651641,1966059736,643530079,1714178954,1550820832,1918415832,1263811469,1985296724,1528492886,1143311924,755857759,1919942111,2008735277,1540049455,695506239,359337694,412035228,649239716,56394952,679006556,70616257,388502834,1343257926,765650144,751678790,1711723913,742833394,553245127,1611570344,507014051,1646715531,384729182,713492542,1239070239,1600163160,1806736223,1799383679,1415729907,1471293700,1540866728,1348803165,1929054916,518175191,1739846209,721799043,357053597,1591974044,1147977299,1196568696,1385585679,1229142380,1166718000,218766395,1257823039,1181994427,1441347598,166084732,586865408,1903722218,683879344,812982019,1687600199,279070914,1577998341,1177299125,570285679,338194416,1050987267,484565406,1795453082,905582736,1310787359,1373254288,106451639,38292727,66817324,1966106432,1770135542,996881760,1759567671,1453081468,1362853389,70157208,54411719,1006852509,723860389,543680945,1558782025,1194446840,1614501266,1546842875,1134165411,1932891448,402887461,837517287,1466711155,842311958,342901108,100187933,1097914487,1821372831,452545105,1031325364,1132811459,953971034,834381038,1118673323,1568693464,1020288213,1852700465,1170950310,567685845,1347612013,1722018241,1441556096,1216677155,1838186769,769392487,267261549,19936139,1164439462,1390920648,814803597,298148803,901969052,1383927866,1346852229,320563261,49394177,1201409627,2003663124,684549493,525797254,1454109823,1585083289,1549472159,560419362,1526580217,1517180050,1603372702,1696039767,1647811876,1364798296,806794269,1845581986,1603301929,2002897008,960152128,771433062,1521890694,1655998481,1489360103,995940690,1763709650,1109714373,1678832669,1839623158,1156061769,1761233541,646744713,1426547633,532757950,237428105,941547520,1065272225,1563211058,1772879746,115197281,1686397876,1917962283,735564995,1787360582,1866565357,1812257398,273243558,297885629,1465393135,964224848,877517885,1527413803,1591092766,547491891,457454354,661494941,1714134039,1371803386,391564731,1299664644,254755614,1332324811,1687392637,247704798,560083321,884563103,1484009302,1726574951,1853051747,576448148,1832313107,1047795141,613478960,629250938,1422907503,1820020066,509154232,535264968,450405686,484259161,350227954,1290914182,1678510182,1513589683,1720743566,1608435647,1252909069,729541659,1800214822,1846457064,203227229,1587093328,1788590373,1855394086,1971317297,1128093005,1816642354,1041350895,1691766455,796847099,1973252012,555709491,157956833,537905220,1303949702,714705606,1655160569,1265297873,626768523,1700158885,487688396,511734547,1891134463,1467974330,1335711276,1568184776,1760261338,399710206,1367359494,1003094170,1145946199,1529765556,787697681,1401135740,731435561,1867182165,323554393,897077726,200688763,1532520548,1979913587,1713255483,1848549660,50194676,1912696245,2010869129,273334628,1928726331,394121302,413816666,287242114,83310312,651079120,163576849,1714337663,486307723,1197160426,1594312865,398202945,1763951424,171507652,12488925,336269218,793265105,1574029413,358975803,1661802434,635910026,1094984330,1514977419,650536951,1667967630,1753240982,1550071693,626449084,13280356,836297135,454362240,1239009519,969507986,1383668276,1554928600,723975759,1388200800,427712742,1689945650,923907448,850347651,816515266,1915732796,1759338997,1404091833,1999251869,606285135,361922154,226382871,1927595799,1239481509,745113786,1010464752,1721875969,1297520003,494526922,181613547,981119307,1868434240,1103507152,321249054,1580165176,1076765052,1351020563,981146153,1842495167,1216714758,608908022,91340159,1653194580,1241904294,322125613,904174512,1952378269,772562620,1606352995,101114369,1530214460,1858880769,586644172,1987496030,966541225,1954333463,1197663896,248885467,221987522,869973720,257024104,1911488166,43615465,805798561,976962037,2637410,234366628,300950392,1875314786,939005174,849423942,1484802344,343971013,798311639,379760348,1650557546,1064362438,1625127118,1003163075,1613025668,599162780,1394146120,1679088862,692309416,1231092401,1493659067,88617831,254769014,1996733941,943599602,1572683726,1956162089,530591090,1092808287,1857378335,603972333,552831025,1727417906,832054700,234013071,1250868271,748044581,796745582,859803728,1520452590,2011620425,491478132,529008499,1832510555,36410449,1945396866,1041746027,416605302,1313169364,712722597,1205310696,1655206171,1884347723,301561859,1431491162,1611865307,113253867,1510968630,1029251780,850626721,300907844,1947315836,1562555487,307683601,1909710075,152469692,1301044797,13274384,605453801,986059942,1030559923,1796028979,1457853700,880948981,1162704614,813199916,592206637,647918419,1461421635,1641383675,462319993,1270908197,1662769500,210900965,313461799,149923579,962583977,684578285,216615907,1466609930,704134989,30274565,1578715835,940597939,666766938,511213634,1294578193,90107571,115476433,1160642035,1097460266,1628749550,457917747,1369860690,177180942,1936369811,88022565,803815377,1370158141,1072584259,642808962,425368125,774569264,1436191614,280429707,1733707968,520512592,1107975451,279839615,1742442942,1431010885,601836933,1223498577,176969501,1082749335,53173540,952122156,785452267,75737072,403151478,617561073,1910735322,1845064124,81783816,1654943145,1334540509,460403174,903728835,1248438710,1964151295,1992768092,31450617,1154459273,1425323922,1960270107,1788066436,137474053,565514253,1419613,1260499380,457506924,852685366,645255641,127985973,1931879553,1031490031,788230825,1358112200,752536248,343549907,1952028742,965750068,1109421651,1457634728,1463804196,1442839800,1261423403,1695664568,1303217601,1805554398,1344120846,1897575363,1936348491,314005073,314005073,314005073,54151399,559851104,560923311,1359742827,580086086,1934548969,1790027692,1138313069,1764781864,1207388976,1944389020,1253107076,348547480,1011224805,613659440,510405782,647943287,153377,216041113,1719137421,180152948,719727852,483689277,647911753,288825684,63000259,821249512,975428305,1307707472,208323286,399619886,1959426111,1391292188,1166505,909293151,1834577010,1421218583,1202472886,207384652,1095666912,1030630167,1695904574,1716728115,938600209,88022565,1331255534,573502902,730328986,538754894,1859827425,1931525719,222794483,1262368937,2010533635,1816429064,1842632245,421025565,363417651,1646252409,830060514,1598412818,404901552,59739630,601737014,1296707562,1350978914,636600864,1623056660,305448193,1967959496,596060430,782637797,1795387704,103205992,111302999,489322753,1740384312,646866731,798925274,1425250398,443048507,217417945,1983483599,1131500652,671107408,1346414137,481947896,1400145818,1770577299,1203348676,809018495,665618901,1978116753,784461306,238054870,49887713,1787638275,1570452749,1894966461,801302645,1353586624,1300288770,1144234651,437793540,8044507,45920843,321009449,1134132162,1539553567,1097561263,1426001320,602990614,1679809849,53088275,1619048443,63510803,1896850277,137968053,951615923,714217258,386550527,1476481735,1375124220,1651311406,1435790401,482334244,536977554,770291517,4080035,1557600934,123549917,294331348,695321269,1930883586,949787911,1640140438,744834117,721994296,1102650810,399130444,539748076,180210276,872345234,1446329380,499664965,791930481,1335676822,183675247,1679197797,1871751988,1331879682,1477933044,1207227830,1317022338,890385586,1740558193,1384857220,1737959194,806220274,1429879584,1111929271,551161775,849575625,315430376,1433939694,833485758,917417749,1077604683,418789174,225818117,19057398,526319387,217901204,1406345194,151401663,21189635,195269672,1812325448,268093590,99746118,1629827748,1143808100,799468277,1666539655,449332488,934064624,1050256580,1941129960,1809136561,610047007,1273506561,850352604,1133892674,492325972,71948051,1227207232,1145642959,1949219321,1871182968,1946445850,1200859780,1402457518,959455357,1536347963,2001762968,681247868,804856419,1522592457,604015352,1359151213,1479104764,625462790,1311300609,1140311505,2002905762,901734468,925510133,240750714,171046167,1826388593,1941292809,1241806614,1124831044,2000307223,1192066686,1385629859,811489421,1765882076,273013992,1596693095,1263212351,948359959,1723975736,19111486,956812395,873244538,1857277663,809580488,58208961,41491588,689654900,563210410,857633720,733637624,222422140,806591633,628718599,372286877,1332949926,702431978,1874817703,467870438,1736768614,466000483,1424773023,1883863420,437217225,1917004762,1841665082,135211200,1358071799,1782760602,792132658,319728551,972046080,423940209,1185343009,1882713434,538340691,429536771,515261152,746298339,258392518,1515144291,767632680,72708015,835700824,891120046,528680004,229135917,865091243,1401698382,503351807,1271975779,146342477,612766407,1516038218,103116826,1283288906,40023347,695793133,982078802,875420513,1552852877,1382974803,135709742,1640739621,752326623,447443481,2003352865,831903545,1229784381,1457866900,1927390442,664731197,695236802,393630428,892108625,1413468713,109869245,1177953069,1477181124,944121867,620237905,1889513416,1279928517,286418969,816088392,1176935209,1193141792,457619265,540940304,997593700,1826998282,359658409,1680520878,256727978,1400842026,839365793,1283990971,1101070285,1315063702,1677480594,1519212497,779799069,1169550854,906609142,1781436199,577282896,1731307290,359625314,1967558165,1834782446,1975380860,1088563713,1645969778,899643531,1585107730,780491923,1932790326,235080626,1554016746,1596510076,650726130,360055693,704956251,1886550500,1644069336,1723747375,1287845308,1982406442,797880499,2007402667,1352955102,1628165332,897237119,1264341512,1317025936,1518726626,610428896,1530201425,1906601014,1663291317,528830650,2010392065,439149048,173400220,1409293211,1083511472,341155360,872895974,112642778,741589483,276657946,108772629,1488207240,913636430,1841477503,1760764158,480697490,1516936097,1738487186,1414860289,511531533,871977001,930759789,244478102,1077149720,1464585048,474230181,857533035,1670581196,1843956769,246766050,1718247033,1720756603,1981374819,1379503651,509055082,1119866972,372689269,74930819,377010285,1488633916,15123599,1009728719,276057700,1138679701,1416514383,471988884,1860414528,1104525446,206919242,1433381872,1332041400,1409835792,2324485,1271816566,730829545,1316774793,300178363,1458910406,170981367,1816916486,1527948058,1609027151,423341327,939699801,1598729045,1698592202,1773037710,1717375030,1611130369,598745431,1654510021,277228914,889050777,311364518,1838141914,1058571266,1914218883,479249151,1834782298,1639459526,676088950,1227772558,356621285,511540188,1199271006,268261202,1468833326,1521840527,865360970,592754152,1739194173,1914846565,319228893,1027960593,685555434,1602300331,261278644,370314308,1663095073,1359725531,669595163,1164891930,1712652522,1143875001,858377038,1912747701,117170739,693522881,876046590,893428038,863750243,600110697,35428152,1538119671,1243618764,1550220768,300722154,577411775,309794626,576566844,495890746,710977930,724376756,1683120691,1967517503,388021642,985149522,1048762986,1613351562,37611716,79859724,1653548198,1849532704,939014740,6143445,1649965238,811940472,232978090,1571558324,397146301,1809630768,464939857,522773908,1272378889,1401100979,601702694,317282189,870895645,692660473,1926082659,703588854,1896893058,1138808816,39796538,1107042523,1683308156,137678812,1492066720,991533569,1522150311,412197706,890226416,333064779,198198301,746502891,363066700,899886842,329222463,935794425,922435698,1672550065,1724061120,277904945,970239253,861148476,806515792,1165016069,517775262,943404779,1342147037,1995036541,135453800,244405611,661479822,1061777805,1661209796,577471739,1881492851,1092562587,228694844,1726937984,450927308,354566496,185028882,74021911,655318868,1169112194,1064789892,876350223,1985515260,1826940758,1723030539,1799919115,521913325,1723666241,1744352578,1220730691,1268540595,1356586354,1883146633,1673401635,1035386279,1117085891,1785225323,1036095946,1164839158,332205799,766518030,740823376,1691992434,1409803678,1449558869,79266222,417658773,152514320,566937086,597198742,1523481274,944578838,1596839216,267963849,1120137825,738230533,452757662,1411373709,617285408,172007050,684514215,364421975,1684761565,1354269051,1491001711,1493611670,233228726,1279157770,1738589293,881653754,1505675722,305883375,1510456594,1327001872,1125800709,1592304552,994071339,547492454,1731481620,1309762494,269393809,1078980305,581303791,1400250912,1268704862,1140140544,1551750090,1079061834,1246721656,434182579,520683676,698079652,1975364682,720132387,562203056,164897934,1179397645,1069030481,163355751,1405185535,1729256428,737584500,1883578295,652468483,1770650571,586464991,1853808233,412411467,1621599409,1156806015,1198309629,915922441,603970059,706513704,411425672,440533399,1893186344,1408437604,643892562,542947554,1655996671,495387055,1926744171,1618930310,559920754,1970447749,957677585,1126994954,1819344796,15148637,1969579477,547277603,1437752298,268724890,669515683,571290168,1749237034,410789764,1474083923,1598114004,1821940322,755618832,1944595062,5158395,1118158400,1301373762,1318949735,1075856259,1437299038,1664519447,448926286,1259725437,554433086,1754201657,183978949,1833797654,512687198,1819471704,98289457,611807247,90179623,1232081383,765811700,665179479,1481601418,1528372620,831824342,75659934,780679249,379999206,366748025,1287713206,1667372404,898910190,149031667,1466566330,1209251230,857108878,322376697,691692000,1208615558,1336401317,159935965,481747554,620105773,11992088,1924491959,1104140261,1412638911,1716574193,1683911919,91400901,617635711,1335503218,1810115015,1717679300,1666499080,1075049340,1569616036,1516248463,1269438231,1539708550,1505244619,1218012880,1599185852,1225088901,1621842878,1926625382,1524866211,473999646,549961261,1919156415,349639101,1047143471,885957087,215961354,638332110,998462556,66478390,54637737,1208011547,430126369,458343092,1564152592,1722493628,1550303135,1011488119,296052874,808923563,203730574,368729676,106425599,603293842,86291933,203614060,1902266773,926467575,1705251469,1893715458,1319738267,12417050,1331453793,780332216,105483380,1982558761,304171549,1949731072,1592835352,1162308416,1497857942,591186148,1759268109,107024407,396930993,304105861,33720893,1669638891,847663753,1035701067,14597256,1406909143,1448051886,1088913708,1932500163,1506288260,1634675868,1999308645,102130157,962750156,835039666,1590431948,1610029271,384257723,982397443,1632532265,1414317006,43724016,262041370,1822044438,723791333,1012510036,580053443,1485256680,473981779,43462372,1681166268,966619252,456074033,1617731975,202717900,1123544095,1116468133,74896092,891543240,1854467475,1045073035,664717957,1229931720,727803808,253443603,574168279,436006263,852510817,193758673,750200820,1991649936,882791669,1727708964,1145767272,239648263,225293063,1424929542,849168045,146890571,1463434715,1685482522,1665390271,153418614,1642855437,1173165961,872642041,883229393,257241451,35425626,697366487,133225436,71270091,1043116391,218753963,515573621,1532082784,121852617,229056867,1917610019,1382450344,1927506913,1169681218,1195428280,1799384136,1737199029,477568196,1866277753,1117737481,830803733,178778100,1601602356,481724190,607766486,1432086737,601642209,397096395,127218879,1021785297,624954704,1085333120,431264771,265351646,773367448,1191413754,1914116141,2653843,312382302,473926208,1331955754,456279542,1141718075,286877902,527092628,1681815919,1177673692,739191109,319228360,1060735697,1459872905,1025027868,371903209,1548965128,1268224784,1480287941,1676945588,1012197784,637937892,623918012,985024456,1403748042,1721127007,903833130,713432046,668265555,381962381,638998851,1066856750,1779052068,700665919,1722375716,1722375716,1722375716,1020447159,1178358478,437919528,1162656305,907497538,1515439613,564953301,1547057287,977431376,1007802129,925254947,447597431,565170688,1577835449,1559701247,21652863,1613783698,303471151,59113801,622686097,464380488,651947518,1079221382,407696341,215431736,1324796516,757102202,58286448,2001430235,627339563,1387711488,555782465,1000908930,219472525,928155936,1642039896,1935813919,1038960146,1738002758,1693348860,150522907,1215446132,267044283,58967289,1043116391,762491921,1163610072,857098060,1204017180,709327810,515716853,1755751030,320992416,1390663075,756051071,1969335779,753050463,261127056,1735315010,289847240,1794140187,532579197,991059432,246020189,745372796,1826406226,1616104328,16425887,369698416,1041474022,1559110751,1725895908,1393074918,619527125,808114260,601351772,1050812863,1924045736,1146911345,416379919,355160750,279340446,1490416893,799474264,412738074,265632421,848850923,656611500,1959796142,1720081867,150421285,199195692,1915221097,628538789,424001488,1852462935,1953637641,1609900935,475615258,1701427048,1211763965,613208420,1506870454,1700769966,232187922,32942791,1560267499,648998536,545556971,1992106076,86277877,592132256,297072691,870744513,1348948848,1519277214,1309361328,1100245918,658691061,596009518,638747232,1641775926,1261227508,297725106,1127497041,398852689,1559416005,1716015997,1084071297,1393260964,803839279,322487054,1664094030,1536333660,1526972869,941432921,251463795,289450937,1783734955,894640463,380457585,1632815340,1999748527,1765721257,1288103432,1916802499,375141052,1249697902,1735898107,1130769647,1378598682,480924941,1250154282,1595371467,1366692514,712426630,749091828,712257893,873086926,1233508054,1859713558,1633313905,813427,1822852031,624923600,304942520,275107450,652833906,1831148312,1862803084,32461728,1063942610,1117819235,1912792439,1813725219,455453304,1571436886,1561606252,945868700,700734906,636792376,1103299510,194581722,312639786,708185230,287009426,1169890149,135705937,1858346459,1445507796,1892416041,1103426472,187653001,1164849800,1725605322,2628108,1517422761,1219194706,617637910,1810764074,1167807249,1104807846,1991385605,547876131,727734722,1880316009,1548698973,92245736,731545713,776469373,987198446,1260039596,980779197,722864696,479138551,1407083689,1055686555,509384328,1017903030,1289603595,192945505,174201032,571688321,747357898,1974049920,451469013,1541898243,89001534,1420609418,344027970,301295994,477167468,1350909272,220380366,450430236,950746291,1681742892,1154700395,1321581501,1541930770,637438679,1719384083,1704805889,1108253143,414573072,1601013454,419325407,983549347,1446838110,902782723,541701505,363234062,104255513,87996059,1777470551,1284680600,59788682,227425043,930866822,1704831675,615120954,396998523,735649887,1780828123,968271543,919015257,1505145906,351060795,287229528,170392135,1487490243,420989383,1682681607,832555658,1331442115,1172685878,76890027,1705988814,182627432,1815926826,1403475659,1614446296,551482860,807490948,1423662889,305213369,1254232732,1587026862,459072464,1891438618,1905503950,77001137,631840598,403345209,884826013,1411642112,380285400,722557304,1103389411,368083453,1586033740,429450421,1335321655,79684110,1314240891,1270065057,1787342872,1490048428,925387864,1899991283,573414405,1352315628,1155928215,1162201000,1855155472,1787242041,323024854,1839461811,44861349,1821631665,1920912579,59423181,1037140746,1153185877,1252161643,845588474,1705885049,954236229,40753881,1690516743,100739030,1169646636,826222778,1833884217,179098289,947602456,434877873,773075029,930138190,1212734421,1364230683,1878734825,571719952,1746408420,561989813,1948144062,1677882020,246610818,293491477,1699403611,531035805,1904081827,24500684,1554275892,1718493976,873338685,688588154,450076411,466353286,395621588,870830197,1676031256,1630597053,713845905,1728929010,106372428,1063829463,927630850,9290511,1571168594,545021159,1599873516,550846986,280660270,1692077991,1040640336,160197132,449159581,748455760,1374586751,446700046,1018971229,92862227,229362953,351688159,1440677879,461815965,1474749601,446552795,1412589998,1194717563,1590811369,79770131,646032786,861776331,1913804899,1740148969,1716803615,1579522602,31462736,19835219,1016108964,1199792098,329530446,1339420749,665586668,136250628,232995201,1816092276,1666124963,1617979256,546134312,1222125931,1777060431,80172682,1076228380,1356431682,577973779,1453043713,1835748574,1795138874,182588284,1906018076,72118726,1908919232,413843904,962597633,1714752598,1791873655,1786108345,1049578463,194963425,1056267137,1669294562,470577912,65038713,369223509,1302905298,1656060004,87089817,737480862,1980525992,1403734721,1441885692,14498147,1963152458,265386778,226066765,1491267322,621638682,776790920,1742459311,698660611,1810905716,618170368,1682273795,693852971,145341391,1931693380,1249159077,1128047692,1247648257,1270004378,1141392407,957239598,805273461,1397308719,1937097293,804413487,151486673,956589327,1172422093,314472405,669372921,31533935,324163787,1326878815,1662894101,1965298819,1451771378,753832567,1896436930,1711036626,1305467273,236871581,1138380088,705144282,1404312873,1780905795,1024045001,413066747,641631732,1205668867,1499428578,1624506313,1865229434,498548216,845005084,384749905,557050640,765979481,1474576974,1940712689,331400260,331024293,67090427,1075921179,1214365796,872812535,175934776,314405185,1028555163,1000029292,885059196,474657961,783414736,1724329525,1762534901,884511691,1685489975,708742471,86631053,1900319917,1913987506,446924157,1622622113,1664378973,147906723,1509078653,149993107,1457912163,890552467,1708889721,1872689488,183329902,1421916324,604723733,255164919,375147865,1356122718,1821244241,1359891779,1727992879,97223647,1429872873,1644685538,981261544,1182322726,1382985241,1214342025,891456550,380385588,828866324,1355368554,247067156,914468690,125829020,144084790,1288173949,1381355858,714355525,593596326,853796437,982662167,846181073,598635062,1822016417,1946984526,838794235,1340460713,307453099,171628198,590903423,427121476,814069739,1271475324,665881697,76465027,1158636271,687712972,935096889,1791509417,1242387804,399908692,103673176,958783164,137994475,381271955,1071255234,203342836,1534463835,961082106,1628226481,541595176,1156436581,1604013431,1900326594,1294992396,369481386,557387848,20803523,586469590,1086905723,748143424,805087193,941118563,1197269260,719348448,699638599,946371767,558340959,350251151,1894847860,842340368,870273397,1412967842,1187636239,1440026201,463588498,140200104,988634232,1736946099,411571019,1356115968,729962296,330638209,1298149596,744552787,568494859,2001821493,181727510,1657388771,1389475734,797099179,887600818,153023991,1245381439,793276990,1834632575,255925210,1949629513,340157129,1004859203,182068531,1965835622,1674964569,657658696,1452380509,1596640916,502475888,214241117,1767270203,295495818,73497863,1424844908,111725840,1657933182,746052363,532541453,999036277,1656118268,890994108,1577389508,961919320,1198415643,884216880,1153474631,1468925900,179149138,1259857728,2001777273,1106592688,1059499078,844222944,684980862,579527302,268882123,892050478,1947595470,54537617,465446473,386297397,1238606322,278628236,385218851,92632216,1508337756,1403419499,101663788,1487394417,830183860,1988960753,443959502,479897918,1291257199,929318767,840962303,199428678,833654975,105136484,1573056074,1888322693,108572269,994858905,355339119,1341981734,1719978421,1867780574,1410729619,28844553,231599276,1827014749,1844202641,1066350950,55312555,441824321,1939515064,865361570,175233454,772424810,256251019,1271151293,1994954016,424256712,1977647483,437365559,1694417171,1835028315,593885354,959758880,1283135605,61343178,1615067639,1014725463,1736103244,938691704,1850156945,327262239,244558617,521949394,142152683,1362288994,369705915,776720179,555615735,1554547989,209775752,650640066,345610085,1631488222,1912132664,1440230403,301672406,1660781395,1644851323,1257155223,228010821,1997732584,1717108423,983032961,887802886,1273949880,530458920,379155021,736646711,1526486905,1800366039,1775938417,1739159023,295364259,1527152531,1175209307,1934599737,234194833,1670775129,1850858769,155488945,470292455,234304863,519747762,184855519,499330245,962705443,1968030001,1629315752,816075821,1853469046,905243729,362035929,1070609647,1438903232,317035657,1616266565,249476818,532902972,1969255352,19130147,1668326005,1999783636,2007811201,1747975578,1722927200,149335388,673880101,1730153287,1621201795,1643753966,1280318398,1957771180,160472388,1929373535,1308164266,1660884751,889285654,529244450,1567145913,736897227,386564958,786284144,547134739,1459561751,1468114333,973358323,1348240619,209017954,209209660,1119192683,582906962,1983856761,71904110,1562866695,10692424,569596141,1152001688,697113385,149027928,322708802,525520503,911890619,217059615,1836127053,136526607,11422506,1430671201,1939589261,1314273478,916597900,939096117,1194497580,697956695,1055268576,798908150,1644373633,30962388,975440155,1820834218,609278893,717636311,204030319,542970515,1286240411,1209558511,224741877,518373970,1176419807,1761558850,761622261,1192083770,257249037,1238079744,1067100601,1047576276,648860049,201606153,1681278870,528179580,1514649747,397680832,54774346,522659118,44793439,241257279,108282244,762484976,1329386211,63909048,1210324802,881224724,574087724,165439478,1469288969,116569904,1582116791,1949561128,1434791602,1268562123,1760565570,1498165246,1029613496,870793731,1510838918,1316796674,1427903252,1844585236,1052387221,1538758783,131645847,49759525,1116920828,1297204614,262519855,1552500290,678563,135306661,1577753594,1570566055,578703407,1906997322,646197405,209868103,817336595,782121161,762775780,1404365450,1136615846,361968725,540972247,658197494,1116133130,674436385,1089176988,977547520,1961204824,1793281081,593408593,1271680839,1710338633,1131021444,1297192191,1411508377,1308215338,522088519,691565899,299072989,645199802,1456614326,1456614326,1456614326,1673731910,931287550,1862114865,19786756,1327748978,1112746529,147867245,188125050,1151685654,688195062,1495591093,375317411,1438825098,245858835,1288785058,184189616,1365083516,1269631261,1378110458,1063520763,1661985006,680893622,1755956885,1969880606,1333924398,278464297,460841028,1775783127,1994579464,1507601750,1796266751,58807394,899662429,395976656,846108234,191267926,1059300749,1934292985,716821496,607719338,546182397,1377293575,1107884009,320503843,54774346,1489500622,151853274,1470803649,1569046188,974044195,864996564,907929475,987781042,317372563,455479745,761998647,1270165368,1874911215,1275833515,1809485181,1235217136,722986152,861755045,950985955,733125501,1994819323,956467289,1694456055,1239221815,577453521,1561134754,950926298,1472618880,1615570530,616112350,116989844,1025932956,1414911006,757184828,1785013394,1938835327,306288181,1611848695,1277585979,1164163869,136645562,1884944800,1214958323,853905651,404582107,289598835,1250751381,313336699,944066641,1152381205,863620916,140671813,497053079,1774919621,1373127560,1066304270,481585361,1683450416,455067186,1998257241,1754340693,1675913163,87489635,269643383,353335347,1470202264,434485198,1872621978,1521195859,1962007266,1621285442,732510622,763673342,1865382156,333920372,1268089892,1551236127,178141019,1907737279,2009877500,545539008,1423407061,224362720,40843924,112769018,633213148,1930664302,831163741,1447391338,388159451,1251948830,563682777,592321517,1465449765,835698377,707847311,548668384,1787955929,1075761704,575799963,1356211428,1226110566,105730570,765811105,1441307649,1158674848,858053157,436494280,501050425,519315910,2005913510,131460457,541896476,1886807922,204340715,1375511576,527299157,121888631,115994959,1805225582,1635617423,1783110335,446592313,1634690471,642037844,675335691,568663486,1674445007,2012159461,1226115958,916342926,1981421205,962918868,1174611067,78690301,834224881,632334127,1916096913,471999717,1063632713,1361334134,1444639296,1511940772,1302090806,1446471215,1320624867,1201871610,1918446838,638322803,1448167602,1863458831,1286077812,1793623636,1577823557,1177018301,1875989879,92633615,1429517041,1336635725,354445995,1592341941,880159163,160982908,1582667118,1164896445,1406877705,1801615449,1182668243,1428365871,92160667,1114522278,1347818104,360506290,680465811,914110337,1431270687,526298532,1863139625,504330315,75838366,96585147,1954798714,476180122,599684566,159087127,1836729084,283005400,1057653125,1129410305,1210664783,2784216,504270009,1312286467,1432805076,63623715,346775745,1555428104,1490163511,1209000537,1596617561,930127577,396397625,2012297593,67882545,534184505,138344674,1613743427,1420449145,1905794992,1675440484,1107003699,451104191,920588854,1341121699,277243445,1481598638,1896465204,1304674124,1830030864,987106799,1492155105,620992683,1125271220,1068566842,1169966451,977129495,435940811,1089002098,1525963480,1305654272,506630462,82889592,49559366,504211993,1297969416,788555491,94659864,1541502726,306508889,204637003,193225975,901050352,217596239,189738833,396654796,1941872368,825340156,1988956528,1216729832,125771840,623821998,1925074383,1902148248,1888968932,1302439627,588623520,377542812,1147372128,396047093,1446440812,485640991,1491057056,1488087146,645376492,1754443371,71276841,712697808,1258526027,780418344,287681418,293460157,113894237,332363322,1323154829,1795663921,1523299190,319735500,1383968028,714995559,1693759059,1925792658,945097425,1855464563,131753016,1550394453,341827840,522828726,423072760,1382750294,155395833,396438012,951422119,1847731655,999235594,901034439,1001763206,714255446,1694145753,312518622,1434077379,1826503632,653655760,1296793302,514812755,1514212142,980945753,1661029146,1057539675,788301817,1490718551,142227513,872937934,413060916,1195745165,1999398022,33680008,827730547,666472397,1390715881,1743686481,481351460,434703160,1250906671,1463898687,1372592048,1543629362,755074131,1241607135,139772906,1568954143,1730121428,943452656,462974128,1512645215,547043558,674662376,198929051,531427652,943267127,604970489,1130804911,1047555461,789171061,1000920970,1944556218,533403479,1960173726,4797135,658751329,1893129778,1523037619,465673855,1398004102,1784166468,1952482427,1732662836,1191930590,230086678,559040066,273850085,1569060353,1589938539,86243628,1460471430,1774604181,692858104,291439418,14433396,999570994,1424446363,1957659535,911581874,1801025190,1982571390,24073014,1006239645,1673474738,767536528,1269918394,527840255,1794025717,1055609746,1655864446,1952096634,1411752093,1076951531,1214078756,1190117121,387923248,1245007037,1864547579,807141120,199850102,1458850867,1797815150,1771547077,909035878,688444011,1348476371,1832310864,1144207948,791674352,1014028283,146782337,1451666021,135579165,648003930,838776076,1743871448,8015118,1358336976,1654536147,960905201,1482365209,808667141,1720112122,429275883,899770179,660653961,1847965078,1322614684,1190397766,1549697682,1644033292,2003339144,650279866,1382028998,705680557,915012990,23625621,1827828006,1763558030,1724237869,468757966,1410184525,1799282170,845439048,160438848,1467041472,995800248,1975771167,426667906,334134193,1220699069,1596904225,176146177,711474844,763889864,780808537,1939088730,468545387,1120520586,1170923483,1206329997,1731485630,1322971036,1782918593,731503948,845569928,576557515,1311519299,697040199,288222287,1141500077,92369504,649224293,1863485615,29073304,1879562336,1775489919,211771631,644514196,1888053448,1298316099,732830145,799692026,686356033,1545085406,877913205,543964264,270472734,66644309,47040204,686307142,955803619,1182819985,1972036411,254687965,115257091,1089780878,1354696157,835267486,1019883213,655780790,1241435625,1347978717,291125043,1824300808,774747500,454498555,857929777,1275669323,1986367770,321563779,41228449,860177844,203089649,280358192,248818918,1337625288,521418653,1661473927,959122456,1021236839,1562816812,709544517,1768863242,1357900938,174934402,1869133906,1320720298,971936892,979992441,424435053,393342277,735912386,282166621,137731847,1030200373,75779924,1696141879,1135897494,1749464948,1205061306,929002675,124915815,1298153030,11310917,748322617,1100121431,835074197,1965760368,313561397,150902418,1100585989,1955551309,1806366562,597945772,267215052,1820646883,1403232983,512595420,125580208,613087641,703809878,1844109564,1816793682,771458803,1759932121,255981327,309003710,817858703,1485263137,1346538929,51790115,150382210,1165968394,1113960480,885883808,1416550641,1734927022,826586769,973123854,157289240,1636858260,1920651388,59756900,1618820497,323237189,431377687,1930353989,144930450,816761364,481277389,1940101282,464647076,308132231,296149363,1624813457,1647096305,295634997,1014780454,1608434071,1620743707,1335016400,133908961,378272641,843257735,431193972,543695575,1807371627,298199817,835244266,293851416,641693452,84439645,1877517841,131953824,1158365140,424512630,687176262,337867419,518924761,817040023,661827056,563483301,1901287138,1975269952,1587515963,622333105,1672564113,1432560517,1260286460,122814654,853171912,1354881993,396764177,1255424613,1898052653,1832752197,1018544370,753652952,949085808,1442343280,1575848853,412903971,1331287406,1064617612,1101306473,834994336,632046740,80863441,2002488179,1019883095,686935865,1690698945,1095267046,543903335,1943720734,129958757,1677671210,1494852173,1466491038,1282381344,1927310433,807387939,1542154465,310245552,1927724601,1116389372,897036038,190610361,1643425517,1977723459,1210060585,531256228,1207474648,786486372,1254310759,1911372659,448048190,77797968,1741357590,562048848,925955057,1197050553,68787292,1305484672,1071244345,1542143823,1167206459,179457988,1460837319,216965509,682324852,249121789,1631049001,1029904379,1927180302,1816957289,1004360281,585231928,336579590,1229348254,1982586428,161640052,1599312184,701585079,125063698,250500802,571592442,72011856,337991691,1810529456,92692040,513735842,1937071377,1724738535,1295958150,1799512405,1075602151,1962999745,865476090,608632367,1007568997,472044642,625259485,959978393,1310836482,377232443,1347528471,1863539190,33421752,629220166,1687539395,332575734,1813075026,814821891,1024906819,1584899550,1074795173,108150286,372038112,900725327,1250386654,1614904817,1403715904,1973696028,1675012378,1137142174,1664192560,706397925,1874058097,447745198,584186325,1000886727,989414375,753724163,1128160173,4589967,458163624,1917771286,1233492029,1080607541,1903534385,1996102555,121543001,803691345,248799567,505568110,433359381,812754579,218540550,774006849,1200255016,443097068,1483017697,2006213323,1556264495,5879248,1032605199,210436571,1379802484,1464631258,1713794719,1284422581,1808729298,871888430,488406668,1276760845,66752256,404959344,1416400390,992392339,1309272751,1004013485,933348188,341685519,1037767020,4124828,1723346742,1093681254,1608980391,1699756247,1652462510,848817617,1567498398,1712717480,251303804,820145227,89942241,438763115,752222739,1055469769,866999563,514431439,1802927161,1552850951,619630826,1205914649,1776305670,658105285,1853194298,1819430182,1675940551,160737458,149438248,912246876,1958655183,461550883,757328964,411388277,634982689,1461013140,1261105665,1909877092,561820191,1353277859,1955896182,2005944638,1216436347,953186745,106782734,1585348426,1777859014,465474107,792153658,1765525532,1143226851,425048496,1371882940,1251824625,952064550,219430706,1786435954,617867123,403015972,1937701475,1419210825,407292150,49394614,1217965613,1604299154,15076927,1366466148,1146894226,430024328,1216440290,801492113,1300022487,980800908,1941673020,1741538,1431578561,825247858,20565950,1123974570,946359480,153540410,792415161,1712809568,1580843414,433377998,1318672852,992307286,584988898,1153536238,1085785930,1712342769,452157054,597624292,1155945123,148196582,1509184241,1496835418,307839245,223823177,1625482438,659009033,1875088979,1910513917,695682401,143521288,1019259969,1312617742,1442126854,517282907,308159323,1975097128,1334059317,2007321922,2007321922,2007321922,1728490148,55303307,670097756,371265143,1058583889,1871596365,1318775990,317917906,831256351,178428748,1841125708,1517972940,730943130,1637600918,991169958,301611214,1800705952,855515048,1234923956,1059836757,1188622271,1995403609,1290477816,1406126079,1991053522,947340905,1458097259,70658389,547413087,972281499,763179216,1889940879,1055437010,621879033,1399728113,1812067532,234115710,1201584647,582622313,537044569,318690831,561887212,1692756738,1433041356,1585348426,1087073195,1094826372,1560144365,1535797062,184813999,256239238,1817070026,415064038,281767735,1172834108,1394825840,1551520396,1002426131,873624962,1747847716,737192620,392954937,226258499,348100778,1456267392,54302472,120719170,1274640083,1451859866,511387885,1729360032,1110785608,517134276,158030162,1923100974,1107462464,29107872,743157195,993896064,1157297318,1992405149,973866560,172849143,1938714309,1493012112,1735437391,1841635970,496864769,881845252,990233963,1175139263,99453382,353132133,563701240,1807047662,1958470824,1883113178,1550233703,514999531,1756603357,1425698752,546554598,1330417266,622814081,1908811292,1991012509,704770443,811281420,1225012362,984167828,826544536,1100934039,1190598557,1762180020,526637531,1455939204,1392402606,1911333028,645432943,860738689,1068759375,1053706247,1161356530,1858631038,428081643,1454132658,516331381,1750786076,683942856,883484212,606369262,1033727032,1844159120,1258541593,1302667616,198979391,891965173,654919322,1730110293,919538604,1781050732,1317232004,1974203948,517331439,335819556,1138238327,1294084282,635519142,865265180,1575171385,1740878424,1340677818,1907271281,1764654548,43206228,1597200055,1129369501,810929910,741793620,1456273998,129388614,1205743487,505485648,1294317339,87599556,1010155705,1075831268,351454711,1918524598,1398395929,1373052890,1878090194,794704092,686586958,314606338,1959148882,181684907,119442410,786189196,1004577250,731957995,1917327245,213236620,31332716,1889101974,1656373985,1699596171,586392648,265133422,1948687603,736160412,1415410619,1001017122,490420992,197829649,1428387986,313028033,1047420465,1391343067,805404922,492863941,504565217,1307202830,1747062600,293294223,639540495,1098929611,692678576,928533356,397025235,1585655229,665959489,459141242,91131160,1654266716,1738672836,763581014,1396801832,446623728,1048465000,1108645059,896585945,215681796,1347848322,492092764,740877870,1531081682,79487164,554931951,1682663976,675563933,892922422,463705971,1382466938,1400113426,107558446,1664928302,1595263484,1152159479,493212908,77996040,758239259,1160449107,995193878,25561212,1370704534,1496612835,782182064,1013894468,1204582002,94849146,787895013,1579232932,1129315965,1891632669,172533245,1984801061,693351963,1115939697,1550551150,296658460,2000977742,769064665,1939661527,186516105,55808460,1950118138,812333054,1953402715,1642666776,1190887655,1073521952,758372252,865852212,62770300,843366046,1580426452,928757548,1062344137,1362655803,1865724732,736190904,92995740,1942065438,1536895866,1209745498,158050699,1566317683,600054350,297530315,1483458526,1766507368,1236311192,510786990,1627365929,217355614,1658867425,421330170,1730754633,1583497401,57383918,175504015,351643777,1030285353,713878436,558166065,278557864,1362749523,77526956,557601556,1999247159,973778867,1861088939,1458586189,611491555,163430976,1589325477,282068676,453350929,1013557155,1416598999,628792851,924382962,1461144993,359434377,791561017,484646833,1036200051,1690855186,706189783,616154622,1916866563,1533964522,1857329026,585618534,275202514,69140341,1821586031,651492047,958522505,70224132,1069856034,1794237698,1713987972,551392701,480058195,1704590291,398944355,1774421465,331376752,511690424,123544085,995311725,1802637861,349791545,1382425316,1911787038,899634382,1267749220,1621926503,1607780492,1833591865,168314917,1647115495,24520278,459464463,1469682403,51479520,497043088,691184750,1014824182,1140630258,1198861370,262794359,185269985,1775163490,1248570210,149866472,1694978508,1299521536,1216262627,676560197,1076570705,1552949323,557611409,1607365520,584028289,490030844,1034094429,1961180122,1058532929,896515792,1041994235,693683573,1213746422,1047088010,274962593,765393611,1854216055,1723284859,1911853316,894375837,1334868393,1078627725,1694255276,835558690,535135128,42616228,63020275,1395222076,397094062,911556597,1791944242,169897897,41358701,578884053,516656985,23845073,419582787,1091370994,1627337337,1464290912,1889139110,1842544985,1966836733,422464925,1173679475,1984598127,394578122,342088559,1602564092,1299582621,1136601188,1213440145,1928257751,1461239917,628830098,207745599,1405649252,1221628531,1537698521,16727721,1780304592,1460321024,661084707,1825177359,167733652,1439326694,90395247,1248093762,1356645755,1187656701,1184090721,1643726133,1002977953,930806880,759144793,1171532156,1856484478,272488662,373032555,1633787217,69441936,720534094,1653655614,290942284,147287603,248785080,1540490386,79076544,1775023629,206894560,1212880205,2012429605,1257947314,133435088,994756314,710875700,1075044519,409035780,761680157,1007604084,463139697,181912672,514386474,249910052,1854266332,1569974491,634873794,511555824,1804686671,37435184,890999978,142921723,817416754,916956216,548433177,1901892350,1050495809,892402241,101270103,1670983298,53209833,33670932,1001313081,1558967461,1781097075,1081223904,1312882321,851725582,1186529717,1204133500,361914607,181885316,1331189874,1312483209,734597780,1555811902,1869582589,101419312,537835524,201875801,81490873,361433638,548637870,121442067,152564000,834413445,1197642047,1273342058,1322488328,1807874384,1229991874,624887797,377104812,1607021211,1180241470,1493758212,834693983,247405857,1031778723,313470553,777872031,1938021301,1852961972,523378991,1175305581,927643782,6942462,1059133719,1851151441,1890610345,749511269,89209827,1026705430,1644696305,539443072,927981481,21762366,678721189,1136927733,1902313031,85346987,1797993855,710716492,1975308303,1369846649,531600896,1245368742,1525160653,310745191,459071240,545156774,806876758,685649572,853012798,737208535,1496785116,931061330,69553111,887545281,3126780,550014650,869310439,1058969477,336340436,1778777200,268967408,1879722572,1310896580,600205691,1152513417,764672223,1949438652,407917148,1843883397,1069582776,1609460046,864846491,360009776,358754348,1304334923,1218235300,1712679152,1705225072,283877119,156501088,186050798,1442923574,1758736756,292897128,1538790545,1934471965,1691418690,579835071,1878996509,1089652433,532434611,1038951683,1989418709,1582708681,1935471137,1055049894,271258150,1665937527,1678370451,1445174743,1376022906,414550250,298945013,794147414,712866043,1928126971,1260430137,317086685,731341010,828347275,1804906276,616204824,34919351,1196743559,1271542374,1467307589,749406013,858808150,556218886,554558961,1014412724,158964193,1953656997,749207018,1265536371,1533457203,603427730,1186762699,1390356872,1679076914,1389430057,1237294455,302079609,1196421510,1779379759,846632435,1923829141,911510377,1695062923,1812598352,319262894,1878938316,1654619490,372678431,992007978,1465809094,31855596,1622745015,647055077,1539268022,28511622,1261051582,726873599,287120275,1031283369,1607884436,1108836643,1099440600,1562552498,25675546,1523343366,358055808,484232899,871335957,1545764688,1343167877,1893058467,18599773,270933092,1522999797,1293533310,597117393,144219631,1214689737,1796131099,1442763294,485868662,473772945,617179377,1176399511,1060947788,1250204937,1470935169,397562584,1952682991,1243818189,827449552,1785587921,1041637733,984025763,347100943,1605529517,977441661,1780215873,720575253,1612667555,934260511,15971998,169570372,1345462562,1942483669,920358457,1719970815,593864443,745621421,2005906514,35771404,876454730,350239087,529119219,984135812,1397860098,71158702,1555411739,31337590,1157506382,274160926,1398949051,775221719,939816242,1640553569,1734199692,806338496,1955546771,456468538,1798645407,1031381355,11428526,927959597,1861653216,1416987499,987982746,1521239317,1368709783,1673775713,40298028,937199566,1962508075,1127090377,1886919392,1347997309,3855450,997005991,1889215333,1376484524,1770151226,935626230,1589019942,343929028,1530902172,289514854,245054536,990381496,942109852,590313654,37498110,1067666098,232946294,703469751,1277406493,1820401820,296488560,479378737,99991561,1764108434,450241275,803725811,543373299,522898129,1736879317,1882712284,306064085,1755409629,1610706888,556048330,1839536747,1863258929,1963788554,179875913,508461591,783357145,1493347417,57943330,1645522748,789305310,464210325,909944176,526577066,1187945335,1603834792,155850833,1436559279,1346351032,499368483,20255097,799552696,187548159,586693512,988427618,378973638,738635243,364639872,1006999085,294997793,1029838253,1555324535,500068759,498767374,1639205958,652090314,371283081,1833625187,1440192154,1393839482,406899010,758614339,412967934,621156868,1398573230,365766184,463058971,1743584793,436104727,1601508770,223365542,1541276201,1722900517,282340451,1184268025,1458197275,1734882728,304710556,896006800,1150795435,1780720075,492020827,1697061191,370695636,812767530,954850465,1872869362,855374614,1748835847,651341371,1941005070,1642173101,139060506,1143946146,1919931235,496052942,1887598074,1494043300,1527153822,1836369671,1538895721,999066813,726390284,138990423,766408021,769078406,911523222,1130664974,1168712152,942188430,669646540,86747776,447138973,185621910,910843654,1756460446,1039022678,1498009591,965974783,700969248,1467629253,380598839,1593537726,242741606,1128737023,827770119,236969201,1881486101,361629281,1714454171,186179251,115718942,1349171357,327708886,494196933,1786762395,926408930,668803650,390128753,1374181185,1530417782,1262454819,1312602355,104773399,115371341,1380921711,763164102,767443322,1785817466,1818754221,735220151,1319841464,1259748630,1998778794,898652896,74904439,1564903356,1601027483,1173876976,1830220755,202318530,830436751,1624816571,1857001058,549991897,549991897,549991897,1236370584,1660183355,628147853,658121597,191277622,48324309,958219827,258837338,1152314384,956646374,1323310146,1240530666,1314975522,1320009072,494240851,525726810,1929845369,350044879,1257165112,193542675,1122154490,458908671,1006432236,976599226,249649115,861334705,655294170,1140676211,223233084,1442163046,812730511,1108723278,401439640,1752995857,809262959,821796146,1617164740,1451882484,672725084,257929147,559592565,136210381,1668983734,498978707,1494043300,1320766323,1352508325,617991312,613497555,300142249,1430990680,647259748,1560244747,1069120905,717589554,639704466,868344115,999945437,1116385746,1509034768,1651573721,1985113127,1776052490,380293526,1121948539,695204151,1075923186,828353702,190117933,1246974997,1272348077,362395468,1023233516,17257435,988938714,1984880251,116610690,675150972,1826520622,1711780803,985677577,1660596962,239431073,235578146,994383782,57048012,486039444,190357915,1349375480,1193485566,1946684334,751961327,1913430991,1323465268,1164763897,1948110611,1443376428,1054861941,1351699280,1089554409,1006349794,1242580155,1574639655,853391998,1695476,1668583354,137379206,214631647,637139715,839579844,2001895906,1999375676,1015440127,928604195,631472074,1831967594,518756980,1327884718,465551065,1761270587,211411285,1189203410,328520422,1631290300,1752771301,894672569,872972163,106668374,1778023707,561364775,454132497,1654747308,1160547058,4212274,1691278703,1562053095,1239219043,1674694990,1340338960,1883156336,1310811605,79158156,3520924,922825881,114341528,466155807,1507516446,48838405,1281703575,406690835,338745422,649705278,217227925,763565414,1457852251,1174105780,997741090,578628586,1951504606,845505978,634625977,184714821,825053216,1340773917,1131424206,482011577,26223479,1593804447,1394703786,494455028,1022403343,913749978,1531011730,598967565,577209751,1685429268,1823382316,680632756,702155774,736246014,552388678,482043576,924457562,1304413045,1309942861,1490784837,417952506,595237940,1124924932,1396332912,633713786,1780445740,59543666,384279939,420093379,511844282,1453446756,813641692,1891918386,1398485379,307239266,266747457,562030379,1971976372,57194246,937015637,70834974,532304898,1335902474,183658457,1276439373,1630143729,307147798,1602542894,438020017,959803408,86252885,1983222620,275575524,594947522,506759661,332841198,1382068675,1408345433,1352637943,1123482048,1055388772,462684807,469624731,827898503,1947147530,780865417,576705563,1439318833,1450408869,1125727254,66753971,688137718,1762939735,282380239,498538485,1129734549,759724002,1631989991,48613912,439302100,1219464052,131305661,1630401195,1796007214,1383163984,1888782513,1550364477,1055448943,125944691,1984423047,966431075,1651265464,1886590110,1129410994,1872663286,1404888697,1127783662,1184405138,79589442,390240855,1631122084,1111970977,591043089,1694528908,1234967930,1888851338,359210289,993279805,362246845,389662962,1170075356,1187628936,1863075506,1192658051,1402245852,229775128,1813872289,999514459,372462300,343581060,1310971362,1305169043,1697422536,697738231,525495885,1580452260,1247393051,515058197,738578343,533463531,1106730082,1648389978,1130865603,439592284,602140513,1380068375,1578582483,1717565052,1960005415,855145996,1913141293,1184497793,121314680,369176555,574720889,1303781534,259581681,1098666453,1167004080,1213103771,1143531628,207872068,111904048,349683138,390686047,982032436,436004653,1014999183,253896684,1897232496,1670938582,347075112,450444421,133606675,1939629708,510417992,324035338,967256527,1655880937,1746026424,159112169,429403692,1012932968,933633292,1029928185,574922463,1819203574,1292550503,1098124438,1935592296,798226477,233020748,1535467245,110305008,698912389,646839191,99840127,864755229,1997951956,167178160,99445255,633579149,788155797,1239558888,1918117995,1238604482,1877282718,1513954934,1924725946,1277567014,755152183,1333705872,567159724,1080578439,1912248823,1303378333,47035839,1786858353,1096426163,805251293,821775704,307046044,1114879855,496322034,1624020625,1345073136,544521070,533896358,1340458788,386344204,1257936282,254530781,611391560,254979393,290179988,960543746,1105779437,302815088,405049471,1625653778,1100058941,1455757047,763916113,947122683,913289795,1323069311,713911605,900254807,540643261,837044728,65380250,1226660044,240941511,639199699,263348610,1390370449,1274141920,1114533731,1136876386,1404110391,382178854,859842095,1305863990,386619829,680477382,855328959,518976826,303656446,434868310,1072723161,26138720,1125285868,1201779671,993584467,1932887417,1030758517,845622311,1856646039,486383803,1147495895,208628777,1231463688,688311272,1649570,1641401214,1908685153,1210030082,624313901,318050912,1241997422,1085167504,1503282656,512406811,632082169,418299213,1883337698,876328304,1608802746,1365817596,675542543,61566856,1576150220,809576410,1918350232,1061433343,605068205,1138983250,1910822759,1929549765,174507868,1531609587,1200484953,211910774,1752025855,1001690429,662457836,1558965212,1267428105,740514576,415230410,1986531586,1927782262,717744862,961413220,1506832505,1678314623,677413063,327728553,1156702447,1206820994,1191909981,13731881,1977638068,1380406526,900621603,1368974917,204923223,491934731,1958599024,93545551,1613869305,1511112666,1065838690,1653312523,975107170,772831017,540650518,826808728,1409842179,1988666500,1320319453,1928479617,1979240354,667868050,1728729810,104581384,514309782,937226024,1933557511,611239604,1437077584,1149825077,1659333018,1544099148,872186998,486308045,1687537325,1306950527,1497805123,1164087203,549991195,186742668,1893397088,290766283,559811595,1484013088,936089408,1689645138,899688674,636707564,1538332574,345182332,1925479742,812009049,667929232,1410071359,865641506,391845387,703192536,238818564,520179720,521860565,1984470157,1568011070,225426394,364099544,953096487,1311615207,430630530,1356593821,1507037051,885880773,417876882,1287940539,229221589,255837633,892789794,731052537,480230999,300186845,912279866,1120763879,479216326,937566052,328004289,192430498,834523368,595777602,564085305,1718089252,1555831206,1179030016,171072934,784373478,706374525,1000872331,330026725,229306701,129459548,1282621601,581554184,1316193567,596166122,1572884947,1860287479,1530705816,1580787617,1383508413,109319732,998083197,193584819,768226234,237396507,1657179867,363112375,7442663,1747659212,1503787105,722821332,892126697,469409468,1438294330,1560646565,38358802,1085847849,115979021,1253729776,225297653,101671485,1128677936,1925956701,1848346582,1210299427,747435263,1287354322,1495498409,871559734,982136906,1916692723,1936827692,706498409,930757638,847105979,1009246411,373792564,535387066,241038541,1366283673,171832335,1311296090,1824745819,1139100959,1281664556,1555710268,549783790,1276536064,1944608873,764801564,684533391,1029030323,1501032755,1936643413,491493701,1820039709,696937457,875940412,372122599,1257125465,961158810,648295847,548269940,703995545,1832218057,1715782003,1589609587,1540269467,8415838,921130145,997469915,313365986,419194548,1278774232,336763656,346310541,837674569,1635007097,1290642215,762029532,686775053,1899871979,808664206,1285267921,542616200,760693525,674530993,1874073801,1936895494,1037555134,1404627027,1719547741,1922391767,384882089,255310048,1539795696,1106304717,12720329,668049274,1319541258,773173858,40762710,1015119920,1607971645,1679566194,1900323520,421993703,1371670235,132518584,1902331151,605074866,487481152,1351121383,825549018,1224270283,1725186271,994399545,1163283099,1178490757,948998498,456658362,1323216297,546885681,653404714,486682786,1942142862,554786360,159832669,1959647090,656854078,1174402548,349419684,1838652637,771461330,1836263631,1337343745,684507867,1838425203,1745995395,452158807,1734849875,1986899989,1535367461,559252353,852060995,1724446005,908882725,1101161930,808940345,711589051,1219128811,407065404,1030622487,192552929,1301918116,1229942648,1434430162,990854632,1999018214,2008705419,1538283934,819011512,1083964287,858930942,722633706,1719029208,1396146387,1175207373,930417924,930811558,260247966,1013717915,858844179,1058367547,1855231148,349674221,302787397,197381963,1451136582,724006428,1985814887,1276859611,644186164,433289720,1465179112,308993541,223190896,1566835572,264860509,1903231079,391853235,355593231,1788932837,1313718398,760682225,1308295611,1608254944,828667828,1346247163,1452494684,1670464537,1774973143,1223381659,637850763,1196469680,1338395501,1177093260,586488003,1565481810,959018798,874569845,6971532,1080616586,81906750,1698910272,1442031358,1190149012,1743913351,615466468,711613873,391130834,503822471,151650953,22358594,1167267138,195005746,1747308545,1393921306,1752849326,304973016,609974522,1174034574,220129800,1511260351,1781222744,1642902998,101466932,1996759195,1067546255,1441689308,848572891,819986389,1772389553,315723630,7463483,641746312,423509718,1203029656,1660418530,369528330,1762622136,347041977,1009074173,1520226161,246562519,502533975,1102893532,827073071,492859730,1466806952,293044488,622012743,734549887,620628976,378823452,1790721259,1021046216,1461873087,900500268,1293729503,282304556,930534988,1502956264,216008670,1036382462,830101443,417852455,406898684,569606186,1470128139,856326186,540754760,875431260,1799730213,820486819,1367185010,759245727,254848423,1166726712,1738265575,823191095,1683161815,953212066,446589779,1902710566,321849711,579378013,1763687072,1935536364,328739248,582426332,1452150395,278358414,520870176,1041933408,1315831851,1534780148,297764616,634554314,1466479907,900388742,8214347,1567390299,1907265972,23209322,692771551,1434627912,460266862,570844801,813408501,606134874,1279326384,455215157,650858146,512628838,781921452,1433925018,992999685,1890754983,1314227227,749269637,95664058,574687252,1740587223,86764389,115396144,1309199499,1028548404,201377883,1214851538,1106028126,1752189377,1531324273,1346082765,1110867563,508154711,602402472,132254228,2866639,1309271470,1630183744,1038248772,1038248772,1038248772,171563110,1455792135,1134769744,442346030,90232322,210744386,46099222,1133490430,676232463,1076294524,97760111,626421886,1236929122,1486630715,773763361,977371640,725031930,280660830,710212723,960892128,153385025,841253309,1629040454,687692441,1069077745,622684301,1955458355,24814824,105450330,1102484115,1099414262,1465080111,273841104,1489232925,1939093809,1601759859,1177023628,129002464,1208348990,1741257666,1142215361,683169611,902382828,105729047,820486819,795015353,1463076170,236621929,1753038092,597491589,202977468,811373146,1617209470,434044035,471118292,1979991413,1450480389,817814502,918796702,771804092,1251204463,1697246037,431347226,255718785,503533959,984482380,1030169855,1717089644,21508867,1861686541,20284028,337242270,588131903,1246522173,25293312,520375863,1410720760,1547618339,582345010,1378643386,191730142,1491025273,24048809,836005768,528511242,29488942,346242968,622873658,850478754,288457187,1836763682,1285665705,525986626,1035679434,457071366,875195169,1943361943,1886341043,1989911930,59042005,622691807,634699007,1930449101,225761382,1401992557,81022914,1409534314,1551943229,1761438054,354581681,1274847799,586513641,1769463077,1427621169,127083828,799939737,1674384201,601975247,57607286,765253336,1467800869,1159362612,1868958814,165373602,1750964855,120315883,1390252551,1411427090,638933862,629221303,455621726,1739512136,1121473777,1706165736,623710474,1412838016,488360232,494853182,291654026,333468820,713681183,169177269,916945604,532407728,1750745202,1230126022,287842893,1777235623,1715953172,1715332053,1343976256,486088705,1287764294,1406387939,520182707,560034314,26490960,807771258,1448890898,836333259,784930646,356251751,183708506,495884912,1407324287,1873907811,586040622,1691231619,1358955353,1691282306,759918354,914578019,678894838,382628838,1221845246,24773812,1535519907,1442163620,1666625297,1347774986,758959394,551602486,1574585991,786864168,1601122826,1488154966,1791166242,51803434,1528562473,1465055131,463798829,1069951554,1484490052,1106815863,1448239926,748454045,276288270,1772951703,742641284,796536005,1650019584,1331103138,860178301,45523423,1939399645,694911016,1357534908,1488161106,1543391365,103338841,1978434523,353492867,251025292,1929917059,1318066445,129407501,1967668062,148445279,1006517824,1260515382,495376380,283271704,985953964,369376240,1326778104,56912990,1609025167,939922469,412451072,284350500,1254991445,889034528,1140082314,441453881,1739282898,964254177,1692485713,86731467,57039347,835248844,1752580040,133879499,1090945108,142056880,752439288,381186230,997900243,319756745,863803953,1756710472,1109699064,1077298576,1028094063,245014241,1357342909,637517238,919721925,133132041,526435104,1696139184,678681615,682776195,1773593253,1231045456,1452982646,786245524,1460426936,467182912,398851728,1701823531,92830558,306474986,1758241695,255952203,1689655504,98591170,835161690,1606805257,2293093,939955820,61656959,2004052010,1942162654,1422084944,1886417692,664861862,107835384,1746877122,1337487792,348806216,1243232248,554686180,1500891955,416214511,811844500,1724297463,1579813071,1152154001,687349903,972901076,94751530,1340485926,504397885,1592896483,475393334,1018361313,95105363,1630604704,339363332,50256005,747792067,683140195,311322300,1792008167,1138287044,1409801027,122209072,1626998919,625982561,1190720098,400882774,1523674715,355513707,1974458224,62739974,1768649265,134011594,1123322785,405585774,944138833,608749921,1359520467,1512740347,886660394,450727462,2004070452,1315583198,1647965132,413935944,390152638,690922701,1339424427,1388406725,1659049305,1841406047,179877092,1322874356,939341520,532169292,129513151,588739985,1306772841,670664980,568623982,1321299465,744217272,1529710479,208370827,1858511208,1410926501,1749127711,1876817966,1757357964,1126949224,1845021963,421146017,1835970744,618440918,1271713452,362481462,1864207794,72094,623762510,1613530673,716270501,1335453756,515219966,1567930147,832953496,276504009,223456444,1922396866,1993648649,592864131,1493507296,981574951,1318190561,1087073911,586775119,638785038,1647934730,594072016,1495075040,1513149415,1486540782,375675401,1095470540,69510475,1246807503,1605671730,1205195884,117926562,1521714122,357232510,218541366,1177265817,1251677615,298274636,1897435651,485322864,227386187,1505809831,395855272,426441175,279259459,1953222387,1667017178,1773149020,233111636,1788647789,1491430494,1175593397,1263183881,796672460,517960145,1434331434,1069981574,1714614110,958688265,923878391,1567109794,681246766,209279505,1579115881,7632417,726779916,469417639,610398163,944097525,943709684,1416531824,1177734337,1002503855,1384905231,160470319,1162493898,678514704,1101399564,140279125,1855757257,667176668,718760905,1822465528,460108075,1880119487,243592979,257912000,616083576,571682252,1021493625,985443704,1535790361,249812254,496149424,4540819,940699489,1427760575,1975176096,735681518,1214340691,670546272,1896519131,605518450,877365403,452210472,522936056,1982300982,842010849,208680706,1307411271,1837665268,603272018,1673031060,261953145,1534627135,687815931,1613707192,1188709896,1469465580,729256638,2006690968,1193448323,337143771,1857076684,1176597683,393440746,210301363,172452889,421808310,640834849,1223185258,1339895828,777282104,1714620458,52803846,1813561819,1548081522,354756569,1109142029,1291780319,102552523,1626912188,505602678,144836431,965470918,1456890411,544836802,1706610777,262917140,856564783,1915834754,329334935,1376928327,616403727,284959350,507907819,1433326514,986314892,1940867921,1222963560,190864785,1133096849,1489557603,1232265366,1006980669,1541140324,210490061,542325204,2010735904,1221512971,1420956484,1695521423,218316376,1966701386,1149456250,985750409,1783670721,1495234560,385870849,1657045250,268648857,65541749,946264891,1618795667,119048717,1472284725,1808006598,514310465,1396232363,1992629790,1273092706,616603783,1868697469,1582075261,1455547304,981018296,1802397931,768015582,764799988,396848490,1110978218,999918332,1394009498,424651401,1914359097,896081362,1958715856,782701626,1844405217,827417275,622046946,821600692,1346693322,931374107,389718294,1774894983,1529468484,687222203,1471625815,1929517923,1451819344,1690205837,723917344,1965557103,67761453,1319931523,129333842,1223574606,686014477,1878368096,1348079422,1330171107,717661,523057326,1567174070,994947965,1171601914,813722950,605609995,1840831409,1432228148,1786530187,1591166755,195169141,1469699451,736896890,609409197,1066430132,1450064903,598955931,1669215235,492567368,862113366,982874498,716942571,171304705,259801201,1380405179,1489571765,1979405007,1732416345,489570466,98658,1957231942,654098819,1932499006,1991243868,1530779372,202292036,1113116072,1312678769,951435302,1735874823,1835161347,1415754839,1828469622,1108678420,465648702,635538608,1014862006,410978927,1951381630,1847171072,1017451574,1013564506,13050182,1749633004,647390783,1992119496,1431135501,339656369,138937094,922222983,322904974,1512414032,1587782308,605385164,1526717705,1754733240,1678911224,751041466,462779650,1376288529,1259122356,773900172,1934667049,1655345532,614784406,1887903360,1651782785,826815799,898947117,1395580127,361620608,1987735292,269108720,1982719460,771376638,1015522247,210529278,329533458,483393012,1753645706,1954457915,898043690,159202585,759684962,428586453,1896867339,820957871,1499474568,972269172,1706155564,13979646,1860333006,492160151,1319075452,1557745949,1576341238,1555711356,1338533539,645140088,1873590021,190929134,416734051,1626592931,1990812228,1094748516,111409489,684283495,1103413281,1630481831,510511902,1662929004,1404738310,1061360632,1828423098,1458261273,1522282598,14591363,68421546,68111774,695612281,1199911126,487059791,235406402,568655647,617587256,553491517,1365230890,1854518049,483539363,1093839527,1618651325,1761044943,1156623949,707863624,1159380898,331845498,1543597859,242603729,264272876,87103613,1478137776,1941679689,636582831,1623994766,1628609364,1252888781,1841269984,324041658,1141854102,1960142448,467320262,626817030,1882901205,1296961957,1246547455,576603820,815469917,1383391159,1882029928,1561858178,1183307552,336314888,89384657,1250709643,211083886,495484326,799661341,1389310127,628102089,836138672,1101811294,733674631,243284068,782085952,1125130935,541538658,1882971520,1219173547,691508464,568823092,1327783951,1875043736,1528146511,1437803020,1839013556,673289192,761967131,1061622709,1311259826,811706866,725548487,752705133,1320895444,825858611,338588035,156180176,418792048,93714345,1196311678,1463491267,1630986011,456045057,1959016845,1831668631,888078295,703541101,1961528374,1915593249,22729449,1137368670,1891289123,106315725,1819277063,955884843,1364963057,1836549508,703835126,1127511082,1171958950,118484705,1346314539,644257927,515281218,529264993,1565429369,726716742,807006276,1071267411,1581484937,1488503805,526338603,489972254,1847966897,1614748707,1634323115,1461962922,1036852805,920855265,1179808637,916648200,1657704856,1591305843,623648432,1579923810,647842329,314748015,1907618767,1921252265,1116477395,1664170445,976320121,1291325930,1956385042,566104607,240131875,337321622,858178818,880400424,1388079396,1502729649,1646080828,408706749,1078558940,1535188475,1211629691,877658045,1240571845,960656590,328417895,618204544,1266184731,1890533158,1995813731,660702917,554113278,942077243,665890794,1647044997,1535541871,429980936,354967753,770270690,1920802756,1874226460,436285385,340369427,1300786884,1027331065,2006316973,436456174,1101110489,390158105,1897444162,1572130686,1004909762,766054366,1238273652,1604428860,244186446,371543299,274364546,1379702361,1242656900,796570595,1442305229,876034819,473437866,699382753,539264192,1420150855,736362163,554066166,2006481001,219663757,573111675,438991151,837627379,79921824,314545567,1462113501,569727704,1500480293,670632041,355367339,552674463,800957631,1804193902,991902605,1037471908,1913718430,1449200537,134519501,1284107730,1284107730,1284107730,378810375,1053309163,806451765,196075364,675163687,825759081,322550111,144095279,1091368398,1795150525,1062613856,170283364,826993473,1390858902,66805726,1322317411,1563503434,1959466956,1729129915,905477416,854611749,1190051615,396026133,1570821671,608271285,761176724,935427854,876107661,1240067964,464148839,1215176495,1538779583,1825703181,1128047886,602164757,1726143939,76104491,763620781,850415842,500838421,1678122305,1121690248,1666113816,231006276,877658045,401007751,984845975,1031957026,1005901014,562593987,26125670,1173447315,5708985,486381208,1418019974,1993130768,750926898,315435399,85201781,408198888,1145079918,1794947860,1918087164,819908942,1795265881,1459317877,1506747807,962681250,1686975647,1909198083,780723385,487547301,51312052,580544698,150887780,1537780417,267835447,1330668007,830207038,1874367028,74749122,526724137,1005772192,1494851079,168952959,1969381461,92106158,1431837216,1325348951,106544446,95837756,432594896,699675489,232809762,220163494,933693810,446096206,1605319889,267725376,1481335818,587058241,1349200266,640977165,1055591166,216517730,1683382815,459526224,1559891365,809761493,1745020345,868126096,1930361828,233023907,1141112899,1814570092,465809943,877959932,301218862,475445931,1692652233,1765695660,1345891632,2008550953,106468559,1335211578,1732982769,1380030331,509624376,2007738611,308672966,1229930614,1250362283,1075248556,709691412,482979457,1014847422,524653641,1008164295,959600593,1052811449,337531502,309215962,1228593412,1822969011,1302649398,1899749834,1450036790,893095662,1105495809,1429574347,1719579571,1413826267,1732818193,1107652217,1550063955,135765938,183359921,780723831,1631794981,1444955930,1083873163,1162170670,770005860,1502602108,1356147461,1064786541,969902921,1804910755,958451831,1387675522,899278414,546920667,287846294,1108258032,1319524224,303168608,647124721,327476535,147315132,1906269161,609681582,73012178,476504745,1818918378,1955595395,1806396181,560874551,917326495,818256109,583300094,1454428106,1397483612,376786304,1903243845,972385899,908411862,54655074,1367973234,1166295535,586283068,1904304496,435304207,1122261810,1776661667,680103389,1202527610,753298991,1324594592,304148190,1777894345,1369909646,873580473,1410596814,1940173594,1857245163,937960340,49093519,1805208866,763125789,575475525,1813071370,207734843,446699873,1099558541,394933518,86284046,998823848,816907601,135631692,576254443,1830766187,1061450362,1073185802,1464301384,1164376201,1792727385,994868896,1153277964,757280336,956718810,1764894461,738638681,1492626641,1789543042,1989637983,1479343988,1508780810,1745038007,711923814,445363024,88049074,312558960,2004867717,25117521,1151636928,152467924,241091231,1611885206,526598660,1543630524,98677920,170298564,1108132105,929434293,1543557877,59503385,1739308430,1862489426,466926125,951205929,1079487431,975118660,1688830103,1888410205,389022641,68709665,1838680459,1153769216,729542410,805295081,110266363,1341703294,1132718062,176834932,253405926,1304089654,693507370,1827638502,170701959,1720516904,1666721173,1428475732,665940138,21750785,1489047956,1777978456,299820545,1851514125,950801810,477605135,916480701,813290112,50852798,634124278,961521222,1740748727,865577934,306327120,1459845655,960727480,980871248,64170584,448002920,1261561985,267232288,1015977814,210394680,784518040,92580841,514774463,1220131742,1720675085,1435878641,564479581,1021331800,2004632402,455007222,1533828432,1574656963,844852942,694683639,104247166,1976875989,1955061787,1933516339,1579496036,982271669,200494286,1419461256,729549451,1020364888,984933948,1551221808,835716118,1016569311,1590612939,1509386542,1660301291,74652265,753609492,1434794031,218441833,339640519,1426916003,656788476,1499473243,1286249960,1535970741,1686698112,1688643105,872100292,258591606,300235213,1958673237,468902646,1003055783,534146850,1175765509,855164495,233843044,479177515,1569464839,1466133202,18066286,1210638565,2002232418,1706111177,560709910,795199085,715301110,464401439,784396343,436925899,1660816985,844905048,1426336406,1963759275,818200180,33133808,1212058171,1598352853,1823225903,225082959,600066405,1046857534,74631611,1077274932,1057508075,196195038,461417719,856787805,1088418043,758573799,1895401202,572327382,501758955,1535528678,322780380,1617437976,1906517056,1017017153,1551366980,1581143778,555049848,559450240,911011513,1780444855,453635098,1469092363,1668836753,507304069,633779355,1972551804,402839740,1991902824,865810677,1304800718,386706466,843036212,1745047958,1451426529,1502635092,214860008,928986402,1649541456,352694421,121558843,692491098,2011768396,1422544033,85189696,1625595521,737375985,1549303395,879095127,674128846,87859323,203377867,845807570,1646416748,1619419624,687150317,661103468,1157736053,949702556,645850159,1348832165,1577014069,1870801502,497175918,336915228,663559515,1138892912,1765726324,1783497435,1789254868,584591238,589603841,69974208,1745538880,1587852469,1754663047,400096676,1539597631,1857976408,1234267136,1982469294,418614035,1250098599,1303783997,1460750867,1263093189,723333749,1225539942,1688462780,1042218646,1160358537,1157853470,816506507,1133544819,52067198,835012362,827020923,1332768377,527032260,291878562,887366805,1102688673,1477966009,2001073964,152250164,521459484,1628318064,1494110142,1544272869,970742587,1231650183,1367565364,1412182597,209340476,763796030,1813822037,524701828,62173063,959065036,610623986,656190494,630041789,1707473282,51322489,10252481,1353632434,1527790948,524765001,52699731,620969220,1297926125,959251934,1005647606,1853623031,1517545343,1694744541,1527015951,1320542947,1150506959,314674078,1843890399,1131235663,1749876936,668314511,736059425,1945264525,1773646028,677302228,1291928964,1349730222,249485642,589609649,1757827620,1232386289,24046698,1501343051,1931791397,528948763,1493232969,176922363,1934631403,679544968,409672698,1643734778,1931369716,819469752,1285103182,1106571653,1809574412,1471247673,1748601638,1773302467,1525069634,1000878285,1482339333,1335720346,925745367,418267731,362018070,579394576,1023553825,1629175475,540627562,627787416,1326765639,1962320395,215868396,793415419,299147088,1429856012,307390818,1451945595,1918100244,11711511,119042276,1215130716,217663520,1114065508,53480605,728542363,498115004,1394406814,808886855,299952826,300608570,1140749967,1743941612,539122263,159114153,1582451695,338517628,1466331210,1333135874,244764064,1840405742,1530442680,757892152,441651594,1961210353,853018685,321884052,1020053826,405115548,711808438,561252301,875347372,240170708,1718087717,338969331,1608815362,369919827,1633757334,985081797,1848029461,1651103486,1907601901,576307508,948435776,591179459,1532869278,890710325,1203577060,951790802,997579917,332239106,1673996394,792752044,1037212050,1159674455,1990482481,245183136,1698718287,1665086923,168191140,1311759601,1615390915,1459755393,435556177,404547969,522868492,616888381,1413214859,812411746,1773233578,70873200,1291056076,61488207,502399526,1783108703,717023618,288415815,929237949,226209998,857014816,1431297827,1916794513,1450923416,564123758,1025661739,1469198133,1139764211,812141658,1439395696,889611914,1973388070,399274133,1932000065,114196315,1527761714,768381860,210458577,497502275,1147626320,285332236,132243557,441861678,64486142,997062490,7108892,697772083,1143088184,1487821094,540213571,663150463,1817013342,481328720,1394840541,1361483688,744090404,1428106816,1118992058,565984082,520416462,1468044149,1495250700,418780660,1551810495,1969394872,1042035527,440018063,1582595579,1187591908,152410868,132787425,578328745,1194355100,232645944,693203416,912520786,1690790367,577454244,120852158,1597905668,1130720906,1580192556,1013957468,1245993239,343581952,1603161290,559344255,1068215220,918377376,1894497318,1576861457,2004129137,759346800,287476969,894490889,1719779746,390384885,149383465,349471628,979052171,1821970941,1860886430,1849841339,1651136092,854276960,794184363,1957328675,1961878672,852813962,687639220,396184581,1043480573,1085598659,719801357,1600912213,898011619,789617658,1409049999,254623243,1442231038,549750764,872426438,1547839483,1780417810,1802724469,1559051564,395999215,1704622458,1305042734,115820735,299039456,678803058,217758645,762996290,7496440,1473008928,631758634,342104727,186680952,1073531531,1123698959,111633910,807357130,559806118,1903770226,1217468969,958825108,635806075,1792546091,133233560,1364930789,364558181,326675629,1852589432,1250874880,472612785,1185682109,1200642864,384430501,173474858,228837733,95433268,1427307502,1054330912,32856576,436586328,747910606,394463762,1459264249,1278812469,6203391,1521038465,1304347389,415038883,1465791379,1826326544,63025603,725642946,579034107,253652464,1307047542,653608026,1259486470,496182449,478866423,791555943,814707463,296485989,913128688,708996751,363711134,327668078,67576149,1540476958,718575699,96462256,47701571,1983853548,1023453081,1911236273,822137513,496865259,679638840,37223137,1883796159,78211020,945362661,815958102,1484178093,1384863958,1713850218,11004012,379056978,658616847,1629307818,934271950,1355660669,1253457698,1357512720,6761638,541896366,690024854,896962856,1881649668,1853664430,748301863,94607765,975535050,1898826019,1553916400,119456407,372834233,495322641,1248418835,1582468000,790271876,1264902728,1367916504,420822016,276382142,1516089971,1212311606,1536360477,1543209945,945528002,414812109,1473263864,1159775285,1115751629,1293376506,746431113,145555163,69423937,794195639,1470739411,133882486,510201092,592158537,913588841,475544654,1015699389,1110214581,1029458779,1556548320,10510948,281766526,1001725690,1799436896,1044795653,1977855766,1450281884,1916424147,1752747643,1198022720,1512239650,433779100,1317584500,1108560999,632167200,497966921,1445418108,610656702,336153165,293379504,727169911,1279837974,1489839176,701554083,1773857744,1472761438,640997772,292414149,1806956724,818616337,983468168,995352496,1914740642,1914740642,1914740642,1038039579,928325766,87737687,261342463,1964505335,299339853,763126626,1647675432,1561944146,1835313140,1229573264,1647259586,290763964,1615028279,667609297,1707354488,1521918742,1865427554,1734159601,1384826924,1036863751,774924366,1068517097,568474472,1674513604,936504906,1132879921,723354175,1396407218,720368709,1392767212,512406881,620240233,1371132938,857998664,180983874,1846970084,1473393073,695578773,764820706,1851740079,676031244,671165393,576859945,1553916400,1966013027,705836248,698472139,301173365,1396910570,258941829,1627646328,737163676,686940996,220552533,1628954978,1018336705,56908941,1466889975,70047493,1804611008,1368136904,97375254,941802947,232291134,480509955,1094295327,1334222108,1117641810,1718838783,925992264,405831672,1506795372,1513249024,1636849772,1896549517,135578218,192521062,1511051570,1111094197,894820585,938879712,759408662,1038851199,1766776045,155808275,1218560260,619080876,600464491,155021588,1950190767,1143682641,225618354,106844598,293817000,1592347576,1927729991,1408705181,1257608488,1098949424,1695556347,166045669,1198928595,1469367922,1208617986,1358822818,1106059654,539759790,1222089040,821680084,1803334952,424874352,1690893877,1776451134,1561509057,1463870291,642674456,1406223568,1688588575,79466345,120652431,936255491,1657401649,280484227,1218867535,1406264340,164108239,1354851346,448361444,1352163781,1138037039,756758530,173072339,646712262,1581808227,1108311376,244441620,1104009362,381774833,1616227041,1749307570,582440593,1058348933,1600318537,554350298,495381781,1025638043,1344258738,1695716991,1740874875,1747766862,115719998,806662803,1256744197,551381483,1145978680,1699628508,651666125,155790956,320361848,1849132753,265385697,1345173177,28160410,966627250,153062437,2006104719,1113443927,486575992,1735243984,1598553969,606630049,665704338,728544859,1269527114,1337368135,1105536376,1573548432,920909566,213281476,1338483870,1461556401,1334536750,1745120801,1249216166,1836080970,1866549736,1927344971,217002802,643639477,1456179338,2004286868,118871205,466637650,1152529146,1037061582,565051597,762665406,115933796,790038499,11117441,1611758387,1920179654,1443254494,159089891,1637494757,144912182,430339764,1782370508,1942878842,332614452,223104212,31492972,1209899419,72229624,599507652,333838482,244450351,428126236,684016957,1378192428,83523975,746026148,362433991,438606951,248346840,701105995,563283585,1010327125,1386250158,1622309543,295258586,931002851,369386649,691676185,1542413426,686528517,469804567,1911843035,1137033268,1508639420,1405658730,841400550,549305676,1845270662,791358156,1466750296,1678377780,1406093866,1571720117,1598065858,538605456,1862922405,1324926953,1402966559,409164795,690574043,1538919534,908006587,1954935639,1085517720,124154219,1002167797,779695744,1477967772,1072282263,1994038603,803144203,863676044,1858345326,228477971,399443258,159430619,1653439751,663760396,1787799109,206879797,441942413,187450068,772247796,401203371,597887003,1348844622,1700390038,1836851446,135191487,185727192,1704983295,1797864489,926960190,1994559561,370279663,768985380,610182704,1046740953,1714311611,1236061286,1438619303,1915903830,883002737,1921733646,1505384030,1986912260,695121545,583649773,1241237900,234123554,1380272840,774858565,1952551923,1210768204,1113178209,59828792,282752100,1711860009,814686879,755711599,1911590041,56771022,1477233543,1656751401,1186074478,1662794384,922450944,1726697439,1482010267,667734669,1231867397,1630217670,220448340,1342997149,1797482837,655217771,1397595745,559965597,1046633407,1501923175,1768481019,101027585,472206856,1513234776,703620894,1951939052,1849381414,1122970817,314388188,187266900,1104206771,1290909765,961446525,291901945,380334570,828201907,1749787202,423699710,617802691,1741799523,1519484351,384414635,521128200,1003529315,478158548,1027456593,657098656,521408077,363390045,1388508958,1636452831,409209196,1679883916,519925037,870631709,778981670,1354027529,478281976,1376467700,336344502,181517402,1876773532,666619304,17853467,1300169747,695276250,1902478891,560422455,190191823,1117076351,1529933672,354450527,1730875061,1678383189,1721077104,91610239,246323752,1902919064,88695592,388041350,1464884172,831496267,1157491661,994698324,445035580,59551726,1404160433,1156012805,1258683852,1047844388,289177909,287170546,625075708,79852002,61161537,1505954528,1298407259,969687884,1195589709,1638099876,1776799314,13696793,358101303,368940746,1647570393,1587291593,345073839,1322065067,251130015,919672984,1899085652,1234036953,273166951,39586821,120107169,1111619257,236168939,725867471,1128773493,1364490784,249722707,728087202,1129169843,160560058,452921331,1739439733,1215888985,1506950979,1813182820,1509713740,56823397,1263524474,1143577404,53773534,712051129,1962323984,1573202660,826993677,1815166493,510298380,81506163,965758319,846517920,97378272,1612219902,1970147930,353722401,1786390355,1207771881,373453095,1805023123,217078151,1832290438,1615669485,1918650446,321695311,341077978,1566583814,707701648,265592609,446603855,1890215503,765509301,1608597892,1222744420,1279024995,1514723056,253954734,71919288,954268546,1122360698,1428383644,589539815,730215785,1185614579,1441700725,303278946,748060609,1671742617,1740259129,1173916690,574451122,1622806914,810508437,1871480224,758523371,390018882,1456597962,536899462,1853352003,316209264,38497625,1426410131,883765794,1295761824,82625268,376272654,788134460,193583799,1246940033,456815565,4599641,414228373,801771464,362502175,1640856027,1404072559,178263680,1821074365,1772003756,1418683300,942456891,678886309,1527135053,797995719,12880565,1314145755,660842944,783008099,1719698907,809409009,955895127,1497616343,615805552,297571804,802722783,1758601486,1800300840,1699589690,1266150285,1398075467,89239081,568536124,1247554563,1702441667,909372192,773036151,404922030,1201765924,837801480,791112059,649775232,129498162,632614846,560504290,162328946,2003035227,1777955212,1695867874,1179294005,1280610815,348484166,653857342,1358032535,190857316,1849804335,1172764507,1485202431,1867537616,1509792934,169488370,1064203822,1047754123,1208916754,62328314,415835262,1309454325,486615551,242988183,727278798,532564895,525671402,115987621,1622898426,574503982,182845967,1078312964,1695410127,1599266364,1936219201,294728294,1360002606,1295582367,1872935718,436512136,1162145000,1430410028,1287990011,1298638050,724358435,1330300543,813962783,1970770184,962088898,520659123,1492906147,1080138738,457527310,1582333021,489725989,732057548,1664257360,1780001669,180346300,1596764848,1496470645,616787699,704750705,26093240,87041060,1380503174,794345262,1480772333,590235574,1941874588,1649593378,1740312432,46171747,1003513561,546896086,761647073,1594997802,462895338,1471072137,1451461515,595233916,1476495966,1118634799,178025884,1396710417,1259753811,943533860,2005724074,944926052,884776271,687339919,176944794,805426376,261623386,385045262,778324122,1489065221,588814562,196110336,1238015440,1325736501,1200407706,1443513955,976630702,699627859,1881182751,183347402,701350702,1978395867,1111943086,746808579,1631408881,777744197,1599198416,1647157423,1113504859,1217347790,1692606312,549049992,1830897096,879591583,2000128039,87037974,597344648,275928361,397179533,1280027329,1246749930,1450522998,1445866702,1640360893,1728006209,787316067,970972952,1938472839,54395699,405414938,28850,1301610177,1056380244,424765136,1515218936,116921300,1080825149,1990140614,1797483362,781409149,1248914034,460057154,7507393,1069747918,897693378,43815785,1513916916,1719768908,1399829449,2010929809,839162941,1618344429,1620277850,820855529,456088894,415480833,869266572,490260855,768905245,1928870779,1318865408,1182359714,1219604016,1309247410,455547620,1762446195,1347337460,1522770766,993191785,1897971859,1020158902,452196535,1880381789,1733920870,1731839844,276781032,1864596259,1976864028,1591635743,780597620,1977312629,596273190,918458250,934172302,964723221,76045367,1239053148,779535282,1183947058,1206506637,105278847,539430323,1343549242,74631260,1736471929,720036338,1218494047,350490654,1214377841,219905292,403625200,1612138389,1368331313,214131781,192965418,1284062126,57875369,247987524,896874547,663165682,1932526221,724067696,1748274299,784692486,61442731,1907625953,1191438138,367047648,1546774894,861485525,1988873579,1763142219,1025737723,176062981,558746752,770335252,496324880,1999811725,765154644,681600528,28963581,412752730,1802006905,626312942,120272388,1506178223,1539088932,111546570,1345733560,469378444,655906992,609120505,595875960,451716917,488449052,168482193,350996793,1629659536,1209723590,1647899897,320908450,77379549,1563037839,1061592468,446410876,1957673303,1138906291,199106728,1520612416,1873490451,1081292533,357194806,1349818504,1092730079,1904533362,1463754429,1474007144,17617300,67645323,139861443,1185629826,1938282432,1977229196,1191706534,852668569,1816928303,1877532702,1167627081,1336039555,593331925,733838892,1766575622,1822144645,544678838,429087038,1532309325,1756595330,249494774,1914650683,486139164,1208858141,397876538,365074414,1420552301,1340023065,668081040,28045734,46552418,1732453776,1094415334,705533053,1843045314,314801471,247639413,175403364,71951751,1659358645,81197375,62380073,685341505,1969950228,447732651,1868634610,113801341,670655528,403203971,1995538879,759743096,935430442,655864430,608267915,779793669,1627556854,1921424619,289888170,1986836331,314163667,497015209,1284897561,796347119,1631270583,1730403887,1647379566,443067534,97796606,25868152,230192395,788515093,1153049489,842500043,1565100308,1544137651,730656514,1177409613,883894816,1146549770,1084481728,355420877,1152010466,1103182064,1569402131,397666964,457000,448648200,948977326,377604182,902846200,1402014600,84268671,476549513,239165553,1428370661,1331015753,1818861240,1796591270,763958468,168727470,324212663,542141810,412366707,1378439652,1780163018,1170891661,1124311052,1890372654,1864875816,1792355924,1792355924,1792355924,1633802164,570738643,821032367,385354756,1385003387,1908386683,1583850823,876310410,871011528,1926365684,902523120,1913894513,1642826741,1791353087,1617284651,193535613,1314718888,1524301378,370053287,1528140701,1909658356,349751409,606009947,1773591617,1196272168,1690846907,1273070014,1671109965,135871796,50736256,259186239,912268363,77262281,1856641909,660752241,1005018118,1727714313,351374097,1978537231,1874174327,446050399,1422153069,1928910382,473085292,685341505,1510730075,928304722,1273443515,531391501,168333630,422931767,1470482481,719287166,310194474,1393169996,1623591090,929431540,1406593504,1145804769,1514291347,1819483385,653579690,1073424285,1131504905,1613669468,1292252442,634804278,654100984,724884353,1374068557,1567545935,997047326,117944865,1160752617,675888331,1099621295,1885031623,1386208942,1267740338,1647824376,11801824,882602635,1726013955,1776784681,1084055507,468495481,599886322,854963155,833569873,6462508,295115940,1233723562,169657614,946393902,914907871,297343067,1080847292,163182425,1136026971,32706009,1269815416,1340996324,996805882,1933038814,1688065194,164683232,1320620051,1679808279,893117024,1708135895,1950461093,811961274,1287982647,575606593,1344289327,1371846557,662741033,518162368,372686920,1886527170,340825037,1656273969,348470319,468905499,913464710,1852948389,900372920,994268800,755100436,633295307,1958547757,974934469,1603166689,558393910,1143391186,946244479,1845857550,1551039570,1708770998,799911437,1534287896,1196445344,1709626704,1433852653,1304055026,13338204,72626558,689122835,1110387606,1717480019,869079509,1936943444,1396119603,1275276955,1852431646,330707240,1885075038,143813137,240571645,1665959842,1443373655,243281727,1268966523,716854089,377997276,442693199,919124469,1666904948,743291975,19267231,726911517,1351784828,362215216,1084859717,1553497909,790145428,1051943719,177096245,707623443,624097485,525336235,185348890,119824426,496265824,1922431535,861882724,576316747,24719422,1655721662,1689557970,2012406889,512584859,282176053,965117009,1220809559,674762277,1186410690,1824440435,578720626,1428373819,913050664,1350758170,645899907,290855153,359602474,312176431,1305216092,481542594,223436329,1812776235,439964091,730468383,1295207402,1201782010,1745950578,1362091460,1808890036,859642613,1858077099,1370911844,1047794789,1447593356,755382513,1762698839,362500997,1705713351,1867297081,215030136,191070446,1808128424,1693713223,1136270026,539819088,1726940496,63453791,1077145469,1070348639,904868535,187550272,1615265555,1070694292,762878785,1587195177,1917344480,430837199,1142165875,1445693574,1097145964,1940372431,631952320,692141176,253321964,1317559779,566109895,1148824185,330926272,1435816859,603331896,1401237759,1798023415,764673917,1101872954,439355354,1411357002,1601147991,1558593590,994694067,739767578,230021138,622784837,136286671,500290431,242753643,823608419,1130215487,1719035499,1594500181,1582598400,703352996,797561731,1380215198,570679167,845825250,577685168,1353636244,1093730831,700422020,47990976,1835921022,1905133858,1997365144,1078103614,970102900,599336162,1182952210,1327656482,623101564,1961022825,985907621,1979675019,108650716,877295951,1082740972,688594269,478615803,1094559029,907494889,1183267571,730114495,716750416,900252965,1303295031,1672345578,1432822166,1077878559,1424745903,876624431,298307552,1163244660,1786380831,952203976,583434983,1616174818,561431402,1832999242,899523914,1569827650,526626443,959789725,407500054,1091058208,667895265,1663453520,1777473820,1622681111,487903258,312175802,1898843744,1341048405,36224872,584303148,135310327,875018085,457091740,251779664,1383982542,1690800664,85737087,290148115,462974345,632941360,1011800559,881441173,680546628,651681933,950887064,332746165,55748121,618901439,1584281896,1763787691,1599060509,281684483,1010361393,901074709,1089623347,1922752780,535282670,652366599,1663954636,1928228970,162434036,1082856489,247384762,1456922441,594500291,837540457,1865200196,494449330,848054769,1298575838,1399581225,523601512,1940149728,281512314,1109581003,1130058788,2009048841,1697235297,1372932515,1811303342,1621703633,339868962,679103524,303327718,1059030049,1660694296,1077242141,385979065,1108759081,1843609375,1948843181,859212854,1039749063,1216648006,1766723380,1634292055,753041073,1112912604,1091706330,1334512429,1349990178,1591434464,1733427483,546212465,1657540474,2008905103,1368280485,362005524,1570452639,34338638,1285067958,805991584,1616934873,540807888,1621552546,611003516,396992504,549016231,1540669562,984704007,1777024584,1217275611,243780630,1793044527,322453222,1819761247,1533318823,736821696,1082944120,229507833,415011960,1233110607,725505804,1305584900,986059008,1554661274,1329809222,1637470994,1027584581,1392910725,143638932,293014324,680606379,1657148611,835480958,1594179294,1814264983,59993711,1654484190,1964585363,1126204456,576805335,1731296168,386181805,1478972036,1985246210,892486486,1809274920,40538490,525768715,1727174689,147920640,120690338,312146409,153970614,269673088,470577837,660727888,719639163,601761304,330259096,231068209,903506697,1512040686,1606767165,149833002,225373320,1142631170,1332323206,917331185,1750117278,1876890907,71391022,1763567505,1707759063,724376756,1683120691,1967517503,388021642,985149522,1048762986,1613351562,37611716,79859724,1653548198,1849532704,939014740,6143445,1649965238,811940472,232978090,1191096264,517590315,411697629,1094390208,1576662012,179631467,640182346,1165244240,241901390,526003295,1021415163,1209431472,620376782,740635344,546769733,639637955,111688637,909862752,1910377272,482696257,134182137,357777668,1441106321,305699513,1158758999,1590422580,45869604,1975661400,806960710,1786613233,1606911648,292619984,198539120,494626194,1246593583,1561092223,847967133,1706145944,1048035951,566516544,611019871,1326202458,1160069026,1140726309,1486787904,1137236223,478736828,1736871288,1707007393,503344788,1268960629,1535010414,1124951601,1135007497,1716754319,1458783061,1687732490,171876647,622498973,1320840700,778146766,379311614,62136052,1883115677,1336193103,1710068516,726587233,1441312699,502988,815354900,1848510191,525231393,701076650,1066032774,228675206,697890619,1849325456,318279932,628779976,1950501531,368966327,444924354,781835559,1740613152,1995211679,203109056,117630851,1722410778,1063017876,1485842884,1202779909,718728571,1658847870,1719960537,626586356,1387835767,938734900,17866566,629138496,143798685,932965206,712067236,1780214541,915878508,654515417,989117125,1175408168,1370041613,1658574574,1636035203,1334393199,1105289509,989320701,1031698172,995418330,1011568085,1844124914,826411712,1473250094,777129204,890607824,1205789570,341647888,417054602,964432944,1717406931,588699488,180139074,667847510,543566001,1514580172,642726495,1897152287,136974237,618256663,1488210141,586663006,1136820676,223072122,612028218,544954155,442659949,1439639048,611721760,850525021,1608598312,1931593695,1029418853,469145192,1146847598,373257146,1672163007,1621898459,411201820,1399100904,1694986586,1060411369,1430547334,1985338504,84967809,1342494288,305034561,1736480690,1129700407,609749436,633799152,1504295370,1270857497,226017901,679472367,567686822,194131632,288703670,150010225,559217821,441524908,1179789742,724373156,1918008638,525439549,1761913656,1128237388,957921259,1419790606,1320575955,1723594338,733008919,1321260581,419676867,689570021,90564743,549272112,1613878001,1682875797,1974349294,909604526,221109473,496320251,1116166113,899359574,538253223,380582856,204091431,1126805690,1593412602,1213426835,714944994,1438095396,219602131,1311481041,1051715075,182108804,1833833950,205779544,1430019183,562752211,166966216,720706418,1385377905,1761145432,64318458,707248614,834965375,1543047806,274081840,649884593,323962808,553913833,143636661,418692181,706444444,841838404,1948215778,564502741,200500826,1498721349,1267237482,41673256,178947931,843548672,635335350,23405274,1390509786,1450222368,539470720,1096225964,1717313200,51372056,1565238801,739314644,1440307911,423739958,875298002,901997370,1204919293,186792196,1193023575,66108726,1064370271,875411338,610514232,334899296,1056317482,538776894,1078994494,727266963,927149163,1435155462,797303994,735778067,224603695,1062590160,239353092,1232962465,205680441,1492867955,309628967,1214608083,279266683,207784034,288912055,1553605745,1171747821,828218069,1072989336,1829872547,1980223762,626594181,247399473,443822317,2003361446,1349736196,719216160,154984517,200423680,742628791,362653688,628415742,624269207,1565610122,1232178749,1959928960,1777365612,232087521,1619554068,1568004729,1448187329,1435624972,176538821,1951392822,402795616,405842834,798297727,1151273234,345661217,631070276,166291464,1072111112,979973252,202819252,501111121,1949638495,1406192227,1453547426,980415261,1990485838,217286570,331297524,311699826,1528592308,502186135,284803362,918631422,345719646,1234667307,1458297615,159604037,282747671,1561046490,790365934,1397668288,1547023999,465533447,201002816,699351379,370904281,1197331009,1091489382,686517645,1386861870,1194261756,978917622,7392091,635278170,350469124,1275936556,994951533,1386272071,556388776,1143291710,46861785,1892047093,109838876,980090962,17299795,35734563,310028455,131295016,1807268511,1266264550,861062260,1086338953,1566985818,1002094998,1404815711,1550289832,963888181,1640829680,1057391063,1212606755,59800896,1751261569,937231083,247269946,643490469,1242609737,1154186838,1143727470,101574332,600329349,1750725981,616289428,1484276825,1927490907,1280145249,1340503187,1888046314,1039789170,1167483313,1830694700,86629434,1837382757,686217519,1850873862,779826986,963938072,462197969,331346545,1697304369,289043945,1788947535,120809645,939182970,850171388,1723649205,1890627388,298697226,647491936,968304393,655296990,794909376,989154451,325341190,1470982872,349831141,1980694275,1448032985,1248659357,814446600,1552415998,689904180,546812497,693667860,1914444253,1914444253,1914444253,1222914594,1070651229,1322121014,597129113,1336712208,957781086,1462747480,454679432,1035279529,778149101,922127590,396296495,299338474,64159230,628742140,102184571,936721130,707150944,52908966,853951124,1328963891,361693311,1911472106,1721277899,1517494621,459582095,184621,745444458,1714093682,223354451,1048854996,1549783896,210526570,509032966,575234451,1059736539,72642476,1820376107,542973807,1832780657,631824595,104558651,453447341,1148290359,310028455,1481953298,1052686075,2005491621,604323109,1790242832,933007701,1202804469,330368193,876899428,137822744,855562510,338960476,839841534,1383855148,505366708,867740191,857076770,1767233840,1988545924,1194298322,770587713,241905143,354310414,1160245046,1822562713,918832763,1427440024,1537946630,1810712852,150340596,638541423,1638716228,1529678333,909124831,1867133320,631030532,1015726551,1420670712,2001980153,1218798626,553711382,1476330840,986181196,810987310,1708845349,281046433,1239055959,366634843,1855408516,1920474514,1990367372,50333892,1430463299,1825311785,630697160,764881849,860582314,427756409,1175228771,1077918137,226218029,1270381450,669760923,964554251,1097724391,446517650,1491515572,634889993,68403001,1653539143,414765900,1089584573,1922999156,61042087,1434570618,1607319805,996604241,944260353,1679616460,592333466,1116417018,1848637333,1899313941,274410638,162154162,1966057019,391494064,1026215863,430887789,206053357,303974838,176092846,375548536,1276613077,1667753328,30700603,426777243,1433736504,1095994144,91646279,1486627155,1943500777,582154454,1314268691,587931477,380765365,602810262,1352632609,1484433057,1648379371,572705786,47271537,1347845733,660341877,1721401379,1865530615,1343710937,299474191,490008715,1885568664,522593112,1052695890,387700745,924508618,159570203,1924878460,274785266,465447370,1874737435,1450755672,523283207,74887378,1488019776,920429970,1858455272,68153874,1286062385,1650136459,1713006107,41573686,106363114,829275756,1159284411,1502180616,1538886762,1661499717,1488128926,1187599905,1058503042,256309296,1808557558,1291998139,1136898959,827147892,1898666278,646370195,1454204672,1633730948,868736269,1014445360,515324454,1546042769,239538557,1388047918,830733778,1068362761,1830850398,1372158000,953270647,1707885194,274154211,1345380137,1543243879,1078258940,38218546,1293510027,771997889,525121174,555254728,1454712132,1075060648,810792358,805906739,706876785,1757349758,1770146496,1946951252,1415703530,1733856733,1613817670,692885379,469872618,1016462175,1279553148,1315284090,467542882,644410047,411912459,367714083,55788794,1525639331,537986096,1436466078,433121666,1705568245,226671123,1098281177,1533160479,133924208,17888164,1264355806,543843919,706548012,1249672249,208936425,1717770926,1013411531,1596446534,824685219,719745675,898177075,1515093419,668762174,33164017,1423908086,183703233,896162345,1165898027,881018039,368771944,657084267,1803345140,1175310077,947228642,1000797900,1144884976,1356981013,1119830037,1350651686,1608796013,776703593,1584543557,188153654,482086124,201174347,1502638067,416453801,826054594,1638788886,900814252,1696736879,1069725692,743921870,213802144,1511941687,175639526,217119379,908154111,1835163575,612135676,998861285,1995211425,1723848146,120055198,740226657,355188576,822726892,74783052,1779987262,1016603355,1627241533,1313082810,882137412,1333497989,247212181,1486135937,546584561,1863145585,1991986032,1026488789,1051249165,483466069,1658913376,1447983848,387219275,810730544,1303341513,263518882,1962962885,812342100,1197862133,1193697091,284809135,329536435,1659098558,360180889,1982305497,1714916576,479219520,811434224,169694619,1544376318,1561882964,1993156856,1588174577,136685674,633151107,1698339885,767416516,1384824925,322547079,1397517617,586292391,759757887,1110451977,623730655,829977605,1904337355,241197558,1181237062,428293771,1348432995,1691726816,1859756445,915047617,1594875922,1556754549,1182248433,1306049021,1787284785,1766979833,1047800662,1735508027,299446175,263613711,449220029,1742585669,1944194565,1087911487,493708612,1622951723,50967528,419994635,133990449,1912297206,339944262,1762664787,122280901,482573985,1938761635,1310392649,114905423,296444422,315366927,793665400,1489156646,1846895397,1949223086,658031748,425262496,787071538,1360732088,699335585,1676979606,1321324599,1180448364,473453288,133149639,343348575,186404596,414929610,987566420,1807185588,165250706,1512294475,1017955024,381652003,47906056,1618768910,1826963551,1802685834,1144436659,615194221,255416562,1325194122,1704443189,65904084,701437409,270636690,1499542776,1574539489,1567926406,165434736,934583215,1819213911,376853603,1535738939,474406448,1438257721,254331569,1568908009,621788802,1190872107,524160127,475249666,1098293112,717048196,490510390,1150865193,1487542028,859056084,279081016,379136311,1033855117,1040278994,1076441468,1803707968,1851023988,201261875,605633793,1616218873,1094366157,1803915858,160508435,1856316807,177578694,1751345680,122971427,1165487423,165193111,223287034,99294318,868345909,921193408,1003921095,1975851596,593028605,1165217662,1509121682,1647467112,1194489199,999216059,1273432280,864635303,1902195679,1861871846,1579550003,655429544,1135833742,1335661887,537025255,1346733159,1476067119,1766417000,1607447036,1297187256,1599931376,521827392,1290932815,477129183,932526714,1489383542,1569053708,188537950,1182022027,174647939,1646481092,1520168042,1046477741,1820433426,890546519,796987324,181211165,1017973894,490559760,1077752901,941740370,1732088564,1420771565,511220694,409499222,847823264,683582059,1647466443,186991209,3721316,950990210,1436661867,104872737,1099456990,1067618958,480529182,984139575,1002126949,1072747882,824058675,851261926,1946495510,608516778,728077466,335054637,1573901793,665167880,979503955,755762778,1414668628,1112198298,842110933,4976083,126529268,556945914,963148428,1515443257,447404749,1635729540,1105950399,257859511,331071625,59495053,450388149,1318148264,654521615,1934060793,1511777509,1342125117,433488531,1555839756,984937561,147430286,610072624,1805698231,1049317759,727761050,1784510830,512039754,1226943300,1782989650,1397740045,1488450077,48096225,675647795,1453240475,1090361668,1889023425,304318093,742032009,1706829629,620428425,73083305,1990409322,509460717,153711244,59846732,1885115843,1974370493,1805375870,585223565,665678732,1683153193,1622870650,1084550176,656772460,485364747,1172797134,750892782,487501077,2003896184,1024036017,282812903,1063512936,1455044213,1593909176,754921909,399126174,425755589,423943058,408628136,783752802,49908552,1674105478,510900134,1614818771,1610685004,1132054595,692976582,1229367250,311790054,198347212,1809607596,812848806,215150491,1871408490,308998544,1199731220,1550257020,984369,1188244416,1069165510,106223095,172657253,1764280078,504566327,2009807243,659599880,531912357,349475878,60277295,2012016220,1392277495,1434157971,687891312,1146837312,78631267,47781514,1627522837,469838871,888935689,1137421903,1255099605,169583592,770500864,194911027,1113108735,439001558,1410658645,196579237,122176530,1101643800,995380241,1912124217,1198259500,1888931841,1193505463,909658685,806092348,1408876702,1933005364,1879138038,1300233825,1114448875,1629924314,1203738896,1144000632,530335010,1914991091,1348257752,928727176,619458903,1251982713,1616293268,1404741939,1336283327,390290835,579676610,789949977,942548936,744232881,1449388020,1241189567,152840772,82689415,1955599798,1582569393,531330281,472513405,464531007,561243964,802777876,1443507311,2005904209,1990288332,417589768,139027726,1209186395,524869462,658247886,905822250,503722072,1465914379,299156693,1209280958,897148305,850915990,1443427217,67590808,310301288,1801610820,1758467373,71899328,200235754,1755259644,1629419321,444311313,1871194832,741921463,529726174,864217417,1294060857,590938336,1959719160,1807661239,601153704,281592135,797539776,1290065991,364857883,395975687,472757426,37807222,931416932,254117899,195178633,864952220,1795132088,87531631,1120099917,674822596,219780559,1139909854,1217893656,1477710322,100109584,1054431203,888482407,659955392,1419975332,652269721,1956348479,264156203,1094195041,450714088,522966609,1498677494,1832582631,1141441630,1283097060,821862415,1701766211,1195553295,803016379,1522280805,115187525,15083436,453803335,866311116,1789603782,1332579142,607057972,92587501,1473800965,1184499778,1521600689,522804784,565986078,1211649846,263677774,383416423,1356007256,1783233810,1793105966,1642121087,476808040,1502019945,1675950371,1590731950,1593787306,331406512,1519605381,1951493559,23042160,587242367,153228132,1371091529,1054641001,1601277363,310979379,1677067598,921617512,62272012,202544486,443986729,32782279,765974657,1181231831,841500549,1301799211,1262719960,1357340598,524255268,381053552,446748523,1958542412,739229115,931867686,1651525155,1368777391,799932212,944406941,117283286,1935824946,1533774008,1047751829,1717455008,421206989,2003390568,76485517,289825137,1215327501,1694384989,1593508183,1024800202,633127642,777713323,947579856,1365923270,324520828,1711740066,1041459512,1941832088,1817220350,811287652,111443506,1547109225,1095863266,1142871167,730721070,1163633430,1515598735,275468180,973036394,215963081,1783755769,735016822,1933198857,1678216474,751738231,434659835,808776558,1439161451,584138981,1551128658,1017858001,45584428,105965418,1061779323,563805,1778052209,650513716,1717415261,1287780407,814687059,81885460,1063594586,1873954441,1778899543,705136962,1005790424,1222233220,1148621121,1209573816,1139021375,1163039922,469785380,601049423,1650616645,236049463,1835164802,1394788047,1760724737,280663734,577266597,1835406142,1186208923,889054486,1921870270,1731002777,1244205236,453542168,935540216,1165186366,131263793,202091162,1978647413,1700855084,1464775047,622470413,1908779594,1009692823,679938462,1881393312,1216192801,391394407,562236954,600917109,1026326011,1538414014,495994999,29973047,1101803407,103831864,978868975,978868975,978868975,530231275,1932811096,1207788424,566208085,580784831,878376776,387179606,1584957566,1233157746,1629315076,1241274713,1507317864,344848151,1569849075,215201953,910799561,1688576016,1643958385,390058590,737352578,1858814718,1029542070,1372704278,268277930,1211319161,581964704,69397582,960811312,986876936,1359221380,1971364744,821326152,1687838290,75210946,1970227211,998747320,1984584502,584269928,184109521,1376412205,762924429,334164726,715438503,902156994,1933198857,765832771,1953147169,611741615,1899897754,1097784188,1213786659,197355812,1996436565,1247072881,1772187512,1894448738,653102905,172704678,356731186,876266858,807200214,1680520689,21741293,1369129212,1393734080,393202703,703453962,42374238,101231528,911722464,1382478156,362058474,985117838,454740152,701549832,395174017,1922859799,1227043748,655242306,602183109,1897083439,1956224934,1684001652,620154317,1613587499,472630714,1672374347,573203822,462590226,735362765,613654151,1611036090,1936483397,534828055,1151990365,1411589053,601725610,1740581208,1310349954,1502860491,1876959203,1470568340,1555293754,1875392372,434653018,830439214,646178189,288341946,390859061,648860920,883904738,1268214313,105625852,1223793892,1896265211,1736463812,938223190,656501955,1205977676,1107366355,1603908797,1277163758,710332019,1879561468,835113957,1715099619,188390483,305731024,740322202,1243918815,1222263079,467453293,1640006331,684314356,1030642307,963602380,113172163,1697800482,885767417,1032351054,462442728,1772803504,1561514663,1069291675,770223099,1500674094,226130669,83052465,1108391781,567568883,1146615232,335959268,601808485,118281186,720557564,672148884,2002702692,410765775,1468521426,1677433191,1754623964,724762591,56382483,1390543726,1563201556,1316288876,826977402,1620679805,826785928,1232030647,678872755,325407393,5718051,1049394360,1522218821,972057990,1221120894,794645207,1816505906,1018468060,1909030422,993675912,696929098,1279957020,807923764,607032998,25267676,1167148717,265381685,362045001,1569750413,1220544889,1055049048,261920894,79011666,1160109670,1256490110,57703954,1289676035,1863863728,202787723,906171288,1377879702,17003517,92283556,992650460,1698233903,1316484621,915989168,1728406967,68573167,1077872901,1851270909,1698854375,705943117,1203522209,1216895242,1071344004,28440022,828791597,1414870508,749973190,1834391749,1183821688,1993916820,1879464781,1002679242,1974417593,401833593,325708384,1289823307,84160042,1689802171,1024586765,1272127658,549627812,1743016577,752837645,1767034777,772539670,699106998,1001087359,907933296,900245319,1114017890,1225021882,163548301,589155669,1579896246,1687969300,1552392320,903644336,971705812,1444989709,1469385113,1307035096,1726918871,1588017325,1762807933,1820057582,90053341,1469680296,1357860108,661996252,1822587982,768999762,860306639,1693681071,755036354,1372345589,1289243980,1678942850,1464597365,575742492,1541358085,952098267,246472675,1707904634,906103708,1735993952,1989383694,566076032,1429426307,53978590,1789764873,622862322,1539058294,953651356,1994492467,848583465,1489581480,618043891,738203376,598536495,384984573,1280381283,1813435290,645193318,1766822504,585782955,441147836,1818200323,306808951,1911427707,1229272453,1023212387,201916200,554893964,1337287024,1231760291,70704805,387956465,629137022,1473987978,930663763,1637349035,670538748,1823889935,1485325650,1606882965,313155172,1068453450,1810978154,1496528587,1582006064,890973533,1292313658,142283108,446793762,1700060716,1518157511,395145852,504295314,1039646628,614595292,1354662521,1750133212,1519746321,99368720,394222178,1405322558,547475077,168248152,827208584,413117889,592858503,719916460,1811019275,108736990,1045091231,607639940,1154951115,501772687,1476068863,714517749,1314409278,98969410,675749893,221910811,1363618182,415349487,1907468062,822019161,519111781,776564706,1815795446,298385490,355824464,1069211125,466919504,1220084323,824883212,2003748797,1046245135,1574508574,706364581,1034633649,82527545,1257442183,1985759054,871903202,173762483,297287468,1084321116,1177051064,539449973,814511079,176408796,1677773630,538050891,887601623,434408391,1492891924,858540474,1716805842,447480093,1882770947,85057804,1734976618,1288316754,553040592,1188124806,1894418061,1816448967,975269276,1973619652,1195494878,222585004,1020150782,1170961739,679947741,1354573677,273082305,1330117011,1409839314,1215115131,1151432902,903258453,1235891599,553267937,336596770,865340597,1352539593,399299246,1665072477,1313966366,481232225,1301111780,158398379,1694130792,501813921,1683488233,1858504947,730482009,836774760,482419145,1446775340,626181110,1950232579,1377027536,935561307,359139277,1851362971,486712037,1549256310,1188100373,787759055,1769111832,1251429919,847329946,1123461186,343393717,161356899,1851155371,1425823221,33038528,1778973705,445514890,1616344998,949167261,1000731927,1154955086,1940578898,294668705,846741375,335779869,78276826,931439471,1452716750,744019917,1731265759,1838319399,984978418,1669504635,597443574,1288678934,859691837,1310585123,1419500458,639250893,1577100249,76979154,1273294861,594669861,727604597,432605323,1828533774,1478742524,560593482,1934856854,1867363597,1392491108,1019002212,663617524,1752098204,14583685,137623086,1557116940,1574722299,58626378,706934626,959973657,258851169,716413479,569472134,1051700135,144390738,1742784601,862675352,1146101305,1836877683,1223376802,341058717,1247969017,1893785082,736832549,1748169132,1158539366,392088456,1663953349,1400069089,476376319,489416671,807988440,615105353,282257569,315422141,552116525,1830639369,1358822905,1445340206,1024522015,956265587,1296918085,499563958,756909360,263335551,1833395942,567594933,413126866,1186206521,1782578875,678843304,179126689,100939415,749411276,264710911,697403380,1292393991,87611606,1710275883,1008477525,1319046161,1296468865,1232861974,1513801843,1148676670,33678819,405747741,1483111842,566547559,1389012435,675927428,1874967058,1205877438,1388882290,825614760,1769480771,868982552,658660584,355394637,223770420,746637821,1378554116,727243629,1743986920,787585778,115564696,1314574176,1718405483,781250052,1855169466,1611792490,472872164,1730173833,1854918420,1706084977,1250958778,546999167,291847427,1885347763,1867575889,263740458,1160024952,177197524,876854083,469877781,637013529,204927228,1930626118,1019063254,181839906,234858971,481911741,1276775160,259859107,1219452450,1926226601,954785503,479792210,578255687,1697483569,211144438,576773085,649346624,131728928,1339390425,1149847333,1036661716,1954492511,947979788,770809840,2010323437,1488937852,1505185998,335622916,1259090577,833440716,252823157,216727305,408432527,543522071,332945400,1551364380,1641535310,521112727,787170210,758516422,1102344756,993334650,579885133,1930512034,545585523,1848967143,1625407017,1499278636,1322683051,1340669912,36130636,409157492,395541403,220437886,1346964705,1654524217,1053853556,198125125,24112080,343736250,1138047259,1890092958,433219007,1049949172,38689537,1106052575,445392277,582618119,47530873,1200538280,824226334,757585603,1348691167,939159425,1489876406,876635197,640316357,1052712595,517958494,992127262,644836883,92761852,620059483,1525526040,1799313766,1363580783,1406559579,907209495,438119809,752781470,1487600078,1870047867,1997878600,1685330273,984096899,52342974,1724978506,917298759,1492370328,816203985,77666144,569681920,142201862,582690277,48145766,920093733,936403960,1712035738,1455618716,1623676423,1948901134,268934627,474611814,716965145,464884650,1287073157,492360558,1175326103,891332528,1135993354,308746371,1162620763,1946033426,695197095,669170804,219421460,1675082207,967140431,1125141037,849485888,1551267292,1793976161,1223672028,595833649,1307114358,1435814175,345068120,1995285228,1115518783,1615395433,1468550515,533340200,1297332112,1921511605,735765368,616963516,921288187,198184780,1634185000,1434136436,2002244552,986557342,205473202,974358347,154881684,870136529,157692928,173955394,310105658,117824352,1241082077,863167485,676044293,800852603,82578987,284243236,970417546,1802169871,106543505,393135006,1761356949,579415415,1218625765,1680765174,76020310,1057006266,578793385,536906983,1914464282,1048729280,364851275,1505576806,2003911361,1714414361,126234672,879492071,110458395,1422463491,1232900114,737800965,1512042076,1841883935,1801736964,831848096,619885302,1818734963,1703696225,308061734,549272904,1619585308,710454631,1173284185,471984057,1950613880,1950116667,683248083,747721739,956873662,838556441,1144953254,1707203620,1242535101,918422030,409552483,1676714492,1848892389,1027945119,306787863,1118274774,792577486,1586479109,134978602,400417445,370977367,876309036,1083584625,841620029,642633035,529115777,1446695743,842719004,610487278,705881124,1334012090,719280684,173004822,1898804851,707976171,937021302,1417647110,893939487,785010755,1978883620,1655932590,1791441307,1895942271,1934224188,26732733,601386693,1317061035,733427137,1111052763,1837154509,1091820493,1599339092,308250282,1824533945,383477826,1644583389,272500225,1718617729,1745773748,1109113291,131652313,1096317172,823920304,1583098536,639916462,192274096,503246310,1304468467,1555520203,772799375,233019196,626792480,511144858,1397485908,1512852026,825618538,30874935,1240163864,800819602,1955188121,204891346,850607600,1925240999,429617751,972971926,814413566,451096553,430024210,1110809453,296129637,712042351,394522413,741984786,356412711,1584444418,190046578,1172805279,349412164,1572309117,779127350,1233306114,1851658405,1399764074,1984747505,435534098,318246380,1961978174,1092028680,1977252238,1567790240,906851297,1676905540,740961600,25519696,1493686217,1264477321,878312552,1358010364,1767204008,592521767,384319702,294135621,329843502,681932847,1102546167,56766804,1616512721,1984755529,507841269,223143381,768341726,728777753,698512763,1489113113,1198299100,1144939810,640780964,877450273,1149293331,912559401,250047181,664282651,760372289,1820200300,1446420970,1446420970,1446420970,897379198,313949294,1080685880,622485390,780873248,656566457,1464649344,1110458920,1274668202,1861911442,932142996,281855095,1920626494,1476514402,1241541023,450367101,1527600344,1483490495,1638664514,1165667918,2002162298,38273268,962192122,985490791,1990420571,1095508898,213178863,1694311259,1447547339,1122632429,518407490,1656162757,1629391466,520412411,214403906,1731519283,227536122,1111755254,805243600,1218351389,314967887,1295863830,446760838,489574961,1240163864,1404464765,303690711,957723090,666308952,569234213,1312129289,1903499005,1539612513,1817646679,578930512,269250290,505889382,181151094,1997435837,623071725,1605763681,171200946,1388592189,1394931407,659999959,1070884395,783842624,668902915,1683774265,1102256281,201895574,69276152,1681589536,1679869594,1968075963,253835173,558722338,143789504,1295882524,866441698,1884689119,2009639843,1695187077,719681235,769275512,162875099,1201412356,908093419,323935317,883800197,306185965,1852338744,41965688,1566268572,399116872,93215260,1893800408,1463486108,442297881,1966523867,1164323041,557909822,876655754,1106248076,835244128,408450780,1729954448,1206279870,1542557999,1999488279,571038505,334792347,1864667014,1349834049,583958929,1980081452,1435287136,901166839,1367126114,1861894021,1469484769,1522369859,1032318825,2002387349,195577632,1517076344,703333781,1870324946,309754364,523062247,1940416087,1313014281,256645450,1988666127,1316806372,897993402,1327884942,1398282081,891684522,1774412742,1108761958,664566153,1910210207,340629299,1740457858,51407498,1973344840,562276857,427341300,895069517,2001856,1646627237,1348431367,1624310466,496481644,547767441,592552369,1351626849,493050774,518044060,1489009690,926977296,613088119,436837059,610566127,107292484,1763398284,1195391684,464954392,1562914923,1788539658,1881361801,1344873798,745046962,1495464701,746019607,1953523976,599342105,522162787,1932258249,378403544,319049826,1358446919,1954670975,1793498556,1495841302,1231457686,1643736209,118402816,1684529157,460505457,880051115,1909645559,1674675251,155129847,1073154301,617330319,1292699564,1336126961,863031973,1618063502,1690148715,445934684,1789810985,975982936,539583134,1656878695,503167620,213001942,1966747883,1487766480,1338622622,114550456,1515112420,140364327,906295454,1077314801,1666939561,1797831764,12788647,507460687,1586498699,181075340,430962278,1282961545,962143377,1755864402,1494242214,1048690144,1387651733,45297838,1008750886,303656763,1812517667,1042168716,1983680575,1374418181,1424746056,314790863,812970437,1328554496,452402360,961206586,269290358,541939038,1349849286,316572648,693852088,1000308862,908457936,1503802420,865083151,1436582266,1283560544,1484635495,588334124,613867283,1970141413,459688900,745687671,1191153697,604161488,380778941,461836057,1610252761,372800217,700565445,1929438986,1885210918,188622465,551632018,43294442,544670960,1774355608,1802332285,1292764924,1521952046,1746686164,1897159951,469656495,712879701,1670807245,412696289,389336056,172035389,1869263100,278446097,1713742113,479713225,1355821243,1531229716,878021051,443654783,437439072,688672554,159613297,141551665,987265921,292070784,1832365587,999223617,1727616993,1800821094,1537847413,590835689,744796741,1578442469,706777814,939178750,151719777,1969707243,1197579814,180636034,1925493228,1757358752,419533436,668595808,481654875,466883783,422998788,1794372815,698327233,450950915,783853712,1300075624,1696861265,1459339020,1694390953,1819825749,1035419015,551436855,1321164327,1964546515,1552551796,860540673,1116363557,1311126165,1448659559,426272802,1435196107,1980088115,665595,672079416,564864301,511577812,678655135,980155685,1011604165,730390810,1671676749,227574839,1394669365,121352948,299565305,1311814295,489176958,131726604,334739436,70261441,49041623,782048658,1301958763,757994210,1461550038,459919262,561718423,88899569,582042356,1592473533,1111973518,436524117,565677527,744054532,1998872269,1714506109,658263213,1460813888,1717217944,797984466,1355424081,117549044,1629969863,1207473334,1228000257,619648449,1857056035,952017756,2006478515,1826828898,7146368,963271196,1485344457,1409011500,114448061,1105655677,439399250,1512948080,1364361570,674471962,1767601324,355284876,313428401,1227265385,1801246319,917473701,1761152831,1344850202,880367483,195346505,482647349,932319247,1904428552,1272945651,1556776171,1817772553,510946181,571635617,1138101394,1321394646,176149021,866606990,1303663928,1480777233,589900733,940000298,232943644,690598208,811345340,1910902676,211719465,51261018,1002575353,1958268889,1884930846,1615536819,137656027,450039537,159050008,753389975,1735183017,354109017,1296849154,1368253725,1424414606,136454979,664393055,881179604,1910993186,534596423,1363915669,1460260361,62826068,910919289,938379521,699545054,769932703,1917876638,275815690,311005654,218244337,1139085773,937499179,113382748,381759157,1499745973,829846870,820224185,460167102,218450342,1992716046,1179805530,1338166110,1291444410,1532015665,1941300165,1192935732,520726004,982314015,1981931618,967158411,1068745471,1632896080,149824924,1639569221,609331532,108958556,964985860,748393981,687074834,385289228,686491990,1640883117,268170950,1657740443,1818327695,1120364888,391307942,1409302071,1714709236,1898883197,1170032121,757117130,420195909,984925882,1733046353,956801880,71214805,1109974928,1876464982,730729215,752105765,220896576,442579576,445438266,1192884740,1252006863,1062401819,57344526,1126924873,174694836,1845538911,544732225,988561050,447198566,799573893,450236735,1859802351,1735729170,1325794012,947522658,465839095,334460685,456072945,1919115627,509557102,889280025,1113679723,1196015680,660898312,667163713,1220735004,1410439572,1913714689,432830806,765990795,1357791396,857447047,616462957,975325476,911949027,1113855396,1010128176,1280474667,346986007,857845766,904505132,1624591435,1190310214,1076931017,1677753429,1244845383,884551115,1295930205,774013447,1218608623,227420255,1870629093,278071005,54929112,1794577312,397640917,138973387,1619299038,256403449,1535011138,295303061,640285211,1515653077,1598537362,380013368,777546438,1979553638,568201399,1873479667,1163288158,1628003206,1574676711,999577220,1960102570,1187861817,879807452,1526632187,1288419262,29329704,1442101615,1660866954,1194908143,663403657,1545677191,1783112801,97981008,256561967,1026501609,948743897,497534441,1342280037,1118683100,1434338335,1501083028,1545225340,235276050,20289520,1763142671,1363904287,1361442797,1856698225,684319759,387906569,174527688,448465147,218493248,1396229111,829778566,1492672328,1400085061,1051199271,1225542453,989138247,1426321740,764524175,1442671718,281999134,195334559,1156187171,156913137,1597665559,1290370343,1632228336,1516284137,1488505062,683879214,1599082994,1613556654,172166983,122646122,1707541545,689124142,71637705,1129118997,1047684346,1427068923,182285919,831910985,1959656394,1265831254,229728017,563774285,615173526,1754298863,1126790751,1378097664,740786951,2008029998,1214989232,865174445,1705166160,1300800786,165279022,1627901058,1624912006,1751350445,1573355370,198147060,1720577543,194584464,1663256500,1074932768,1042490715,195915894,721041660,538109001,1966108068,332843543,323696112,240247324,34125677,1041618614,1331759200,1073678524,1256773756,1843148578,1273038537,1112616664,74059949,500487360,1776407449,72227882,124996808,1262232899,470241551,294929486,578776857,1637642442,1587792641,199424459,256274381,572810013,481378756,587317201,1804656858,1708650499,715482436,1295102525,1876910364,858624503,1172317522,1686504574,1728140141,548175627,805481280,1715185767,1171137773,1208632409,1375424593,878809192,768176832,1755974553,1517313871,252943086,1295877570,1552419823,649338242,899782763,795989476,395945985,1003833746,1566488092,1515836190,967988982,535543007,858936922,868275141,1806776724,977713604,82839307,332784906,225755697,628823049,1049774543,2010934516,892374418,1337207572,1266468338,885860839,495100044,1023378013,231388891,872087942,466140618,369144275,864299166,1830785004,1282883847,179762898,183506773,262731348,162146704,1781043933,1968915475,1751907064,956323607,1768192374,1682751307,949729119,1964748051,1801666504,1791422962,484456665,843440161,498549314,1213361796,568842693,611515733,116033349,64501641,1873442075,1249436765,927141389,16110762,1969884736,1294209401,19410007,1690077751,1231159138,139229060,537365331,1206519253,638206952,915386991,155441546,1037401902,333390599,1581511966,1899524461,1226422601,676018096,807298247,1687342090,579108191,1079321066,731834338,398664354,1807746817,512396887,1970650076,1590528863,613669469,736599718,931588221,1369548244,993937975,138075745,1435881973,1261725778,903563033,1616854117,300712799,186223492,56820220,123778535,208143928,46460152,266313887,1285036789,409678553,1341992294,462188871,634172213,1959939280,1566480115,19007078,582554037,1526471424,1108240005,930548353,813414037,223254852,435295473,129747678,1154102091,1292309265,1355265873,1745486728,1466105505,361067852,652313277,1538684465,654430531,819626518,802317262,1245987116,1706365460,603725934,24346638,1479353003,1803269205,277623142,328249412,503317867,345221559,1719711980,74212308,1198690987,1969225158,1810595023,75656993,574525217,1479880120,1755842485,1646519654,241049145,17569771,1459973676,357899791,1252318050,641608580,481708086,395164400,1125519963,987969965,1633124157,1663941634,469109875,196299341,1225480967,1806254372,1823882772,615433042,1350928329,211280299,654275651,475875328,370119922,1980654080,962743846,1366807273,1825323072,811904221,423054710,871844875,461523381,1222772249,1757698558,637713035,1327203580,1947280096,800754772,1710274944,217968386,1032242112,1129317932,1726603944,1146698251,539732099,18560643,1487382910,714774952,1947523155,1096576815,1889264495,1124635648,1298592880,1842412314,1045085969,551485718,1050441089,1230916613,229454200,995075264,1011922855,387571499,1144065639,602808861,1807645166,604207693,1854668912,1854668912,1854668912,486626420,1638279106,1989542992,1383030283,426590581,907468399,1046370643,835442904,578830201,2005606626,944475260,1883352239,1384015109,1524209426,207242413,1325204078,1409280158,584798184,386824886,698280782,1650169481,252990475,552465013,1772841317,168497451,952021404,863607549,262623821,193767370,362746499,366155739,344736760,834979591,1490073981,682368348,969719813,200596620,883448364,1618515300,1092173636,398838262,1370659707,727631689,1834503429,1755842485,1054546164,127000452,1326022499,1351107698,274719129,1006553485,1609995346,678126874,82555234,1036501918,271328665,1397607899,611024304,1535005061,1193637349,1477550160,95946464,1512144411,1821823573,1206286387,1302468626,1033873590,1659102087,875734734,155812965,59691538,1500988780,1766112917,1146687900,1822881661,1248117845,682759515,229011486,606971386,768617599,1317026251,1096747789,935111663,1539447031,549919996,1557623695,820318844,1931235067,1224262364,1391269855,765324970,405797065,1191544317,1689470834,947025952,1074692920,429680533,1233347620,1549150324,1892077628,782181317,1854338247,1603992398,37953400,1330017968,1227840595,1549173610,1414242691,799846876,1770580840,411284722,900079232,622613332,576066671,554616376,799878912,756231574,1740226902,255557010,385513570,1222985874,1126781850,1931179732,1486586855,1527641091,246954727,603486420,1332415444,775418145,1415940803,1930622653,525540909,1268634659,1161583627,1229439205,612182194,1682202211,1086431164,626111442,307818453,125780464,1522338056,430203829,423955684,784108454,1579759626,1052697232,62321450,1632677470,188447679,269116417,201008427,1380084444,928880803,1290004906,108827415,470151556,1116270135,1268364591,528229384,1726292361,1862460059,269805389,65581061,1607618673,1134199072,1823163502,352873706,1667403835,868110199,1241254744,1987675508,474234007,820511631,1773390155,1091657540,1160391388,567029557,1268154224,984620553,63141965,1198480555,162143585,1186330435,1351005435,1833692493,380859110,681761358,1543711954,681290728,1739622205,11108545,70234137,999228982,1548465668,1918779660,416402555,1751165243,1738813749,580366927,1685295005,1916699895,699024350,404888035,1728626134,315994803,1607199565,396517319,1286559341,853235716,1422682155,1776645780,1747625479,1870836279,1776102523,1374314813,1735365314,735760594,135758292,1986389676,1186921634,1093450676,1179007975,99731364,1542031393,34429673,844351015,1773804136,1628445171,1965166041,622170429,1012418486,339815092,642929935,1278743495,170087959,647448586,1241839003,1852632415,677084226,234631944,253815534,1793083923,883738713,816361919,1484309193,1379618824,1539591272,1921565930,1681127933,1555305157,455510096,238194052,1276965599,1334457003,1450378393,225800334,390860302,582319631,636844175,272262618,1940127968,1071723095,1793293237,326811389,30986076,82140963,1874127233,928126553,72478134,478272458,197824048,478062080,904948752,757178729,1980147780,1336419598,1179442944,1374207423,1932904032,1212360334,645981135,1631070211,684897863,1120671997,499843677,1782474615,206616383,1689387170,1306115183,580991904,1749697679,891851756,611809978,1236284244,1186684060,1626499297,964253013,405490309,1236739420,1766030034,429627903,855891517,1806057449,289472450,1969536280,1497799266,1151400715,1079205841,733050114,1864177383,613309401,1314218103,1608948147,353608719,620981015,1477763784,1995475496,971561180,1367389265,1961007962,823640491,939181308,30890882,157389639,619151086,371091751,1530787821,1997052297,605976264,82608750,351380944,992588813,1065241398,1438744535,1684948124,1433990788,819968680,950518841,999148886,1790691473,1346629842,594066011,65097833,124743717,739809632,1186551255,458819991,1093993235,250328270,1030596418,215621848,554440070,1676666129,215522810,681685653,174404478,1341949303,331738732,859781473,1671411256,1478240423,461527781,878303978,1144253649,1770747249,1569782371,910531636,593745395,856651302,593592464,1041110323,1811698817,1879355988,777552474,1450678593,1016240973,1124142330,873301723,1569962525,106885439,108458917,1488544499,1229520479,1091759849,901266780,854244874,401956638,66186380,538756868,882555058,308684507,1118233408,128772373,1613167745,712363314,198545668,557731646,1700837364,1849678552,943779681,1098074269,243090297,1915548152,1320207492,1921223144,303216551,866090388,1121927737,1481155952,905788912,149246457,566533518,324738242,1439773549,551265579,1070568818,550712373,1857243041,1727802939,1842037082,569962230,652754832,349281891,1465909533,805167373,1444193694,208589547,78237690,1911048643,977709816,1900203018,360405163,1154772712,1057638654,195532053,575411567,9938119,145172583,1263026659,160358050,826303460,1592582468,324613489,321375617,662333123,1670794279,1553355444,1356495198,286720818,37381104,1711822804,789046140,1493539147,373660059,1320223118,256684944,1482737977,243643213,272336822,1224348128,1872478469,967026142,806947348,1551146337,62123552,347949445,1952753411,42273851,555825644,768779058,1464380804,69412915,1121071150,767117416,908347370,892860477,850519920,121072041,955389368,980489998,816093836,1879284826,1481867389,1974339755,1059579875,1775687064,92062278,1213345531,457796288,993816378,1936332463,24345094,1813233292,332061298,823970103,490475736,177372512,1170122864,11074400,77656249,259122695,52548942,833217829,1777297839,1535302585,62839949,1199263693,1371022028,734657333,1142017474,1510670007,116620398,1869407839,772662715,19386292,536284190,1609654489,1850255932,1109459789,642388176,413267790,1119668995,1945257859,1082262276,991003072,492444898,1832745026,714481352,981243640,364425954,29282567,559099566,1035227334,1738129409,91171054,969006052,801028203,1205851648,1905483272,1426371643,5536243,1581857681,296129087,1787083365,1823571045,287612639,269627276,127507806,566221184,1382230747,536789512,456891219,1920787353,412056038,884682868,1371390688,1977192442,2012010254,612827845,852435343,887215856,880661247,1767126056,1942403385,1600269835,274649276,160461896,1423150642,658551543,638547288,1283599405,1862519749,178641975,1291305381,382385174,794177878,560286231,907492873,457114583,1846625371,673607676,1668363845,775188991,1758539193,626404403,9904673,280177973,1725070288,562987255,1922794345,1611818425,1179409338,1084284434,1530026269,1992654797,119880934,1820057408,127322351,1862589233,722400857,235411694,225887955,895564579,750404073,1988906899,1266781043,1285898346,414731107,875526161,1345126476,757311191,482477784,370882042,912334238,708102061,280256795,261837033,222302755,1672269816,1214672269,1147279759,686558306,1202268917,417756081,303106523,695175237,486762808,1213869348,390498955,908638566,1445359363,1969536014,1635388833,1227080281,532350123,991937767,1049873608,821632121,361990620,57746647,1721545526,1909023115,1018068508,1098635737,690035523,546009669,478782763,89157241,432981517,779174415,959130772,1252387920,320102166,933446685,169344227,333943482,1445076739,1589174800,925095170,888813930,1728574245,736433015,881347632,64354720,310093896,1579502785,730488603,1241912847,1182265332,1392485676,1777535281,763947258,1310199370,825650620,340255381,814229766,1829604309,1908559162,880734120,1301741306,1262302289,139914882,655287956,1129185533,1854948141,304183084,906344745,442303549,627981136,456821356,1008336223,1947174294,410600369,421719698,849197873,45800453,548912339,1694090967,1606113507,1538633681,1293026828,927670069,1772173286,1069562469,863607983,1861089880,1303724651,1658006442,398031239,178005442,89509666,1537460171,1228835535,601671241,927212092,498174044,1894242388,1377073713,1967861748,1530110216,383331147,1710035381,677740836,397171625,1738906904,549019283,4214666,1309902310,1196230625,247852243,1860861613,445080456,1361900505,480773037,494667701,1269870341,1664950875,1251632083,200089116,1223978667,252407007,136687296,658527450,1991622377,996270937,1765803272,1145582949,359184142,1014437176,1084533456,608111326,916904512,349770321,2000965455,155745170,1627363600,44622393,1059243733,1399848226,1479815467,1730386081,511717832,1023302903,911650858,1068778866,489450384,179397370,108438846,431259789,623388138,132151703,1055530656,429504008,1637008639,1858349781,781926869,1961377442,250916585,541787680,149380797,1812761474,194227124,1547640962,739079182,9703779,891176756,1860132063,309497715,1323254232,1205542248,210798197,1647984392,513299901,1465029638,1155691727,1694788000,1725008076,482729310,1367473452,207113397,1172894437,1700068526,1902292239,1961169007,1915225705,394044817,1723889049,1423143684,1061664607,1407118290,151128542,285720174,848632959,453350848,2004781321,142942184,217554473,475146822,272175363,1032339542,645231759,957112524,440341498,1060946218,582400715,431619708,322800293,1065302527,910432241,236343034,1878243457,71663665,342581524,192959692,1958411782,1433715733,1180980026,1832523581,1282838821,1726393037,1592530294,935087970,405263859,1103500036,1068355591,1399343913,1418188587,2011571483,1431965662,1467321183,1989512968,1065547694,719874579,956311171,1120437119,597788200,60097766,708660796,1264433083,1038519735,1164450936,1764200170,1599723730,661805272,479651919,1006176788,1746359961,198911887,36199222,1078712816,1022199691,713406963,912330753,716344623,71428858,409584758,201705146,303635746,1424232321,1932965300,792456361,1287590847,291780311,1527128745,1412801254,623947753,362095908,495753684,874035880,1541449575,408511694,784287606,813168664,292375096,1872034543,1287324287,817538152,1184455214,1072501851,1083499998,1824107089,1496502904,491819878,1325809310,86025338,1083224735,671577118,90896751,1762753156,557743569,1374540690,1396604020,442381720,1814842274,1876366476,1345957786,87796948,1393098643,1255731207,1775054902,922955288,1891126473,1577525029,1035082934,1258330308,747301274,892064880,1139359159,1330645038,81653868,721766928,1805415215,1667667780,843895594,122030324,159607599,181964812,1255565643,1158092118,133981136,1803718187,1616212047,804482604,1882396480,1833869934,1833869934,1833869934,1898731978,13412995,1840262528,927540820,473997386,1204684898,915455214,757068116,1445493710,1870593617,35411832,377261144,40804475,1829871858,175700214,873201939,1370626158,351770695,512166018,761032903,1681021509,554358447,2005061146,629172000,1540971233,1775144888,306694886,1565263919,185928490,1859514396,491955170,349955320,1952033866,150264705,501168388,1588973384,1083962913,934369464,776872941,1676778982,1932416763,1308061362,1977630006,729133284,303635746,1602528621,1588702754,828342966,88130110,673656467,428576725,834375329,70504907,1270495281,1302841687,832105992,694310332,1990613371,577339836,1244439642,187875695,418793063,264023828,1802555016,1293822954,1699711081,746520275,612336216,156169482,362187490,1385967938,1263762237,1118323035,1304107101,1391020614,832276379,1856623115,569753414,575304908,1990225590,338374550,1885828341,996151504,1662045703,765755708,488075319,391930244,1105679284,1365099343,991769390,471979687,589791680,943689931,1325067699,1282418657,88890587,1951671129,364544724,730021748,160945129,28329011,755097067,1790163526,1417489593,1612604224,1321356506,138604693,152305121,1527149572,582361301,1266086225,599134773,420071619,163317590,1101759784,1883564790,57173924,1324186276,1246131190,1088458561,60707981,1736035603,712619018,880079104,1578204012,946402440,1541800106,1682111580,1422101812,780393725,1842390726,1565792085,1691301856,889629625,407240511,1147993947,843322354,1493420468,1269922886,752530345,1356947067,1453802882,1254080931,303928619,938156410,1210401102,1738134155,1225334898,982607068,869829522,1884786960,1801772180,1033652692,1565334535,545806267,1326064118,84731138,1091465848,892829943,536518989,582329130,1871382700,274583314,441075256,1760940269,575082430,1624440005,1051387200,557462116,1109655785,534125267,1921364716,170211130,1909795883,872470424,1914153117,809685398,1167726147,538887676,98285402,641667866,1292975914,589196257,157212783,1544070821,719218570,816854865,132606750,1891793699,1717385935,147631816,1115960520,1928179594,726753658,283212712,1114718281,1640574789,683311086,1291488613,1151400721,1446017847,559873993,1129006785,693505518,368929996,1364268696,310284140,40351369,899022635,1761085060,1994918405,311066923,1794641006,1173647139,400230946,594760431,1044851664,1504396778,1264386691,705977353,940489869,802795286,1120479238,924898803,918485349,1305233409,1999553793,277857125,765446306,290285380,796817688,693891664,1926388054,1298451471,108060362,1100292873,846102052,1577600870,441504052,1855786646,108131928,1707906706,1506760361,1643085328,589309561,1248106243,2005923346,1324045527,18429130,531257004,618858883,331172819,1175399141,1846224858,166056400,610173363,132891430,1907567319,1319234315,1818039342,162066652,678047909,1593896368,1448120803,1080460528,1554066363,1195161959,1278878633,1434233639,1721184386,1229318761,1658776366,1003489588,1893289288,1784895591,1900610602,697383627,1893253654,15832398,888474294,270450330,971363138,29237119,119211438,1312212083,1894056667,1203940052,249167345,52222169,379770366,1302937892,1729927521,2010962830,236725968,1819976763,1022056929,1940480035,849929898,696670991,1334288397,366031935,1679247420,871294963,1716460041,1033198287,1087102331,1302223171,346900263,467977590,1447520181,1727029406,1111763702,264005495,1858076073,620808526,1541832184,1919316733,1804229162,101978131,1592976535,163719365,1260532611,1447968432,1300492766,261661217,126296404,834566262,1674780054,1196184885,1602309545,1728003776,1048220595,1024335920,586607695,856814784,1894182474,381857859,1261091332,1897663645,1129007195,587387362,1645070371,1001484737,167769523,826185530,1146964676,575770586,1718359377,764234969,126235781,1191296906,1028853964,1987651148,150222342,443090995,1742611083,255324538,408842679,1818219489,6006515,1220444515,431780085,1552919946,1607816008,1171194525,1820527775,721009200,1086231152,1815540703,1486551878,687929345,146038627,636506307,1381441807,1877328475,1697211974,485223529,218115494,878601246,370102054,1053632962,1051459225,474735746,1527883841,294498901,883938973,1964134864,223833901,927532473,331100639,838048038,376603482,276129762,765076172,890034970,795263432,852698148,2507984,174367936,1958105286,1033340486,741411415,490883004,462887704,1558691004,509265136,911373995,204679537,1496742671,799619336,22196574,38382411,1536775108,1542244439,914233838,1408442433,958860395,725484607,1793083800,5612736,424785513,1047199912,1306313377,80208366,474588709,917456390,1039828918,1909435190,792553975,1220178560,826203344,629437434,851977114,1520274600,901157703,1972777316,327007598,1878172104,375268353,1479666692,276964236,1395902241,1845603092,648942401,184073878,605446107,132234320,1744297716,272599355,611784441,48233396,178494721,815058615,1854615738,106872923,1128169498,1251525172,903274664,1139708262,1180097546,1912028384,660013742,542077768,620610385,49313662,1581879453,1241874313,1400639042,1420065832,743017035,696796836,1278611176,553325873,4812698,233271498,1599700681,870065176,436330060,887411817,1905836374,573318715,1392546224,137913323,42998794,1841847442,1380035161,1040169991,1690487057,1248580419,1212898959,404055501,1784972349,541984755,1906618165,268994632,304570507,176093854,786919074,73396756,687115963,1251369320,36594964,364544861,903973044,252120537,461438982,1457724415,1574180785,891035734,1921245954,403008489,1163321636,369538363,478942080,1081663616,1320223258,1047826920,1490776722,619498494,62599379,1773632333,833824894,409768407,1800645917,962716576,1776459689,559587744,1458276075,1484070657,127913169,1522028073,342874608,1384259939,1466683971,1238580193,714066748,877250628,889849031,1239276833,553846506,330743179,907159271,227317011,829003387,534046714,525780883,1572781008,340072992,1496324503,887946950,406213730,504317083,1277300292,888230748,977196628,496643010,998550451,250090515,1269301725,699429965,1787926035,66742456,1271648337,1815246230,1303812387,1663815380,1142208974,1163263191,88732854,572653607,56272851,1477053049,1023551041,1339094864,1903565545,1488203684,1286837893,603303291,1276605360,1251449149,1777317874,1373074338,419348118,1227628872,1387833003,1297547378,1118057735,1459208077,496538389,145226867,1257670519,977699309,1258181462,782462861,1468056085,1815761245,106066256,864087519,1450546451,1350093152,1944248612,1843289711,228594574,196954875,1593408103,313080027,1685547851,1367212960,1774484300,1730254269,1075557100,1885696268,451758184,531815419,1062351045,953068166,1386207547,1378557866,923820299,1979792166,1107138485,389244178,1003605324,1562448334,1132196632,565589018,1105780929,306211862,1619548669,107697983,1445195651,1424088534,722333938,560976141,454315919,393310347,651336849,17168432,1090498310,861959949,409589377,996749447,1831494694,1838500506,570181792,815627106,13459278,345577571,1954718857,220596490,104762005,1679155966,1328848759,1355725521,1811380708,379971272,234299596,505342795,240039668,16186488,1900456419,1179846374,1794974658,998670244,487004261,524132183,1822867168,791817028,1590477348,448443825,1021886374,1101161539,864701592,155456683,1083280730,396399716,1964383515,757166428,1943733490,1126023505,414862510,1034445591,1179628936,867283485,284495373,1377549567,1413640955,1564160363,754146895,621454925,1926184103,1933214631,59090196,1832082211,35859085,1408587681,1539939725,845153510,1003453530,1438927189,1334121181,1449178785,1999971337,1001545242,1699773559,1437667826,2006023901,1927013591,1069492452,781197630,54771667,1406570575,2011312827,14808468,308209944,1730536392,593527558,1291494572,950573977,787044581,1025020176,203620514,530606208,1126067448,348046828,703856900,392305845,697182893,253240039,1220879134,1409054544,681040582,639437062,337436800,1816204807,1738860356,1393867575,2006592937,1814162903,935695924,1851080425,1049450973,1248547481,1649177561,1194651339,781182882,897764564,1270835227,234436854,506005729,1282058167,1443675181,1726466749,966816803,1947997738,1144396107,1898821809,1117656780,1912950696,690937032,888859536,1162282931,1589649883,1095589259,356202076,894452735,2001555978,1607245235,1669943172,975275581,1283621366,131585418,1058736490,1973789789,132448532,1789334955,1191742366,618782540,1018779338,108537818,208341194,1149794413,1993024334,544255149,25425660,764046962,1167927286,1801429479,704755579,1144308150,1337972673,1387417692,276571218,299207908,1764050551,264162374,128559561,1285556463,1667811087,1295365746,1498412644,794934798,1745226982,1879496993,1301129925,1393241203,1380774675,1631159002,1981483552,1613500621,335863756,23845985,819782748,1109795078,1421624757,764466694,1426216555,1440550962,642647071,682453367,1315047837,934935533,1360332076,1373622149,322957678,893906610,228801894,471277757,294355468,1979791629,1387301363,213759607,493354672,426126242,5513237,1693957703,1736243501,1736120351,1205845430,673865954,1637356251,733504881,2010458007,1528443200,1076650450,730827014,845427310,517476270,927565867,110341497,1932959317,318167256,997172616,1179230838,848621579,1526956277,452101879,1021035549,1072423871,496868195,610124343,873685040,1617826707,981519232,1132514821,1143799569,966622552,980224518,1410771772,1684728121,1238346035,1943461444,1582711950,843971137,1202585181,177180829,94953050,138237149,532818363,1440258469,1133007881,1670819326,700683750,585151798,1434215409,748318458,933050086,683309786,863738368,756178826,416913890,1211439367,1498323509,829123174,803519104,1276371436,1798220535,1113652463,1605088184,1202151286,1025757554,198055672,335018062,414218411,1004800481,982730226,1645466343,808538095,1626917584,162895584,1559762286,1677104330,930882761,386590036,1840102791,1251869087,883803086,1278165320,80618864,1076249455,177278759,1615587510,520910539,944096619,1522662616,429186391,505713524,67300181,1207882329,1107952435,1694535097,404399909,1351501502,1780317939,1357209839,1520638517,1275683226,1418836660,153415833,664523512,1989721490,22118337,606410355,1904195863,1357107477,302271664,302271664,302271664,547839188,929100714,897421515,1779198502,1946342796,1469577650,1105847581,1620284569,1582795641,183827756,1997444466,592603354,20787887,532497962,650606316,372240531,1530613528,307278790,1608015711,1819738548,1005596920,1410192354,891858222,546972798,181093478,1059134088,1116319820,1168134073,989942875,1475908360,1509845459,132001637,1883574383,1030570640,522366828,1740156190,1790225273,913997905,481584802,19607589,1262325557,680879830,1824004739,1300134564,532818363,123162247,441991264,857291432,1910170018,1138207034,497228297,113253121,903076201,1236180340,29961432,1333532496,93639206,1218798851,1933782270,1877215176,1261614702,1410305194,1845786238,2012660753,992177430,95316779,357948463,1043532891,1475203842,1490595946,382687639,1065941571,780306147,382177998,1289984889,527095713,1514780497,1091934647,1056248026,124205720,731386696,894092713,940281982,1521086683,583370302,935670386,212355762,1924995075,519413613,232078666,83630224,981968256,1306793697,1586291116,173348866,30961932,966079786,56562119,83852688,1952177419,1921989750,1846867542,274730246,485031441,1911282950,1317762990,1930016392,216564326,1277379721,855648303,1314734746,1459623191,1937275720,878114923,1448809,1022513439,1232385287,1832938853,1691997110,1398061269,932676656,1170569569,806212203,656758874,1449554254,1397158122,27549074,1551720193,475629756,744595655,932755075,239337155,190839838,865715453,1504066419,1159062308,1880101528,1362908924,598257669,1343686926,1799622097,1573822761,1236889386,241291727,1738119627,1392384648,1480249949,1774479242,890081190,1165273166,479466886,172273311,1479670097,609898825,595711442,588332607,1864293771,1492759949,418971982,321555355,1546199817,630014660,1506629104,1848731662,1384677880,1293593620,1291776662,1879807022,74479824,89231446,161173041,81821083,1084326884,11812905,1118491088,931849404,647042260,577235604,1146524720,924414987,1000005855,1826092871,925698831,1195387835,1479334934,63217707,1370406429,740030402,745264779,1842849218,1111782342,1450645794,1645407835,1484246447,1690142171,765337849,612751336,1934464639,829095548,26209200,1189678335,213342598,212040181,1534389308,1811816818,987515788,1689823957,154681316,1382728565,1815929675,1963441987,525329297,647783678,1426291851,581923150,1750266333,1713624888,613801587,964410357,319878349,142770562,598581878,1196672467,1360059591,1116022083,1764892910,286526310,1213989283,193415527,1852816800,1318345501,1229671285,2013181781,1825234394,737481947,760689582,1985824398,406058517,1158872864,642780782,1393667039,1740364362,247387452,1008513664,1915165020,589944781,1748524798,135642045,1404462270,1595287544,1576295486,148279130,1128419930,1116153835,745226089,1104693240,1155899493,744964915,484033757,3618452,535790301,828769790,1528187839,467368224,1687168886,178936771,826572235,1860327313,1066642758,423657320,1571607220,175819799,224706088,467052416,1471495764,1715681276,1753586998,1072820035,12001966,1021996420,58344253,742492249,1036159249,200483531,584514088,838473347,867398441,263126603,971567042,883709626,239148677,958300816,726842050,1702482252,1216729945,1955112661,56900421,972698673,630622278,377486981,762377032,1612238814,139437846,1957275513,1021541736,895144152,1423537539,1629400103,413395042,1017151250,1073907929,697781177,1185540326,1857543100,218745846,1820682015,1537349451,1934130310,1897299169,1896653354,1064681248,1532691755,1468526793,591980035,106078816,1812602438,1950833985,1607879048,1177249150,1108360413,542912629,1105640777,68497706,1313333701,422359874,1982473856,1316646166,280664430,274357948,738366323,240950807,1240274374,392386876,1003533198,1334147304,1919782371,622113742,769512115,1090831411,1351486293,502901369,103392395,187273373,1805993567,1403882445,509720764,1529896401,961141613,54559801,1033454452,804306355,1135997374,50847484,1172141618,810514169,129202568,135558301,699796871,757606239,816662488,910437276,1748014504,577104361,1447739684,1124042852,1398768724,1297986759,1706044700,845731440,62895364,42360284,827957158,1038916148,1469536023,1995118214,1416472296,1865368052,1648115748,1507943320,121620714,1763181826,508320143,165254089,468333611,1941241332,688812713,1521500043,1261544399,1931914102,404235281,669199849,1255245460,1937741194,732784797,1797872956,1250398625,59284989,1430193743,6195347,1180647286,139574805,17623004,352024444,625311098,1871829950,925996545,700099743,1830425403,304903382,483841146,1936654286,1651688927,1284127772,1060949058,1323621112,50924695,76884684,1453727800,886583237,735179087,1496035933,1878223901,792828410,1958536289,1641662499,1931069349,1285997656,1268767052,1148363515,1568409522,1736000987,1619373255,1331249024,1518150536,1260548972,958282866,402534538,1448022974,1110250211,1668404967,1345296964,619830858,1000354713,1723590369,551796954,1134848196,1878001179,560417977,368659721,1034755925,1728876335,603572872,141804540,431244288,655349770,1119363657,932614639,119008084,178190235,1326333753,988091706,1619505302,1532456037,697465006,1678107280,1397220010,862388388,904078573,623574749,319594201,490817680,1678159186,471015859,1318758062,360008841,716069491,1408173479,398970239,907880516,233765905,1721087066,471024759,1700301237,1432853426,2442304,1607901276,1392960444,1124719258,771472366,1441827371,328020710,12847829,1271040907,1525815119,91852598,557253163,129745498,1518828418,1597578654,1019797874,1360672744,1053979549,1124675302,1139667484,1630214067,1040648197,170889225,1030175469,19012249,1267898574,1112717006,579035983,628576727,1447280087,856153491,758867795,162755044,1960701099,1985069679,198183751,1444425078,1867505154,562405774,2004176272,1760398642,391000626,984277865,1574557145,1424949639,1453775184,177063390,1097979319,979934197,38600293,1507139746,1149307689,1816967319,311850193,1916101139,653552107,1620688572,1954267756,174612888,1190159396,147982681,505633956,2013226849,1792497021,1404803756,1558572909,459481681,649390184,593966379,926111475,693472565,592399617,640147669,1545868368,1939816097,1571235263,154190080,1678109340,246463804,144882804,30988576,895356214,1837346193,283968533,588338061,1128177616,930116652,625967925,632225199,1115767097,1324980861,1828674253,1252494811,92134543,1169138814,1336621166,540662985,1665430057,1629191365,175776955,857100484,1566434298,1729049602,914717020,760962146,1544876420,1688252562,118490284,413119891,1434705829,924611425,350882257,501344120,181791810,435149485,1050554276,1137968449,1651111608,1279086251,311714902,1744047291,398228892,404972620,1885567886,960136985,757949751,390699803,974081957,1487937997,664054235,320189103,1865706991,1795924790,986758616,341829683,566056859,1854171685,1679921022,1100664807,825610051,1708881574,633681060,1890454713,227168857,1719455827,1569495508,1508751957,1253179140,932465820,1077438363,608142430,1869980101,1447088028,495772444,1630842023,1732885771,551523263,367610017,194966527,1551091010,1729780234,605547608,39972144,1452383565,1783707498,562396980,3734332,1112682877,622441571,399134997,1214446214,1506015438,1099842881,250960535,1814918302,919940238,259596662,857960136,1302165053,729630177,1198575159,561109394,432609550,735620313,1349232921,1424809199,269297379,550223859,1105625253,992808916,1415494121,1426140759,478013000,1990420093,480942876,1167300270,1634393149,1834162668,108422739,558626917,970178308,707668327,1335505563,1720827955,1170663832,1391910774,621876542,1201305886,1587934545,1732782970,1059942613,1958645299,1826515578,933182338,544774014,1707888835,271310471,1311757930,1205324550,706286896,120537473,688902344,1900520237,531969210,919212947,1305610600,1902025769,807061702,1114856423,1729153811,109120776,154758852,883927312,1515368369,857668207,67790130,498229874,167144797,1035359748,1421569518,971516672,538973416,1453475379,1074993942,984414398,801491011,958692962,1854725305,1684836276,793567377,343897258,1181145818,231166299,1226545952,438719247,1887457175,1965068553,274044421,810213733,559418480,951173375,1199627369,219176903,346128788,358523665,817517469,1915715976,1791921918,694842082,1024361032,953209677,1288425750,1395834337,1516290901,601445366,248166360,2007393944,1676576365,799870727,853795933,1135742699,106600378,388936249,1541603770,139410042,619510935,1692169725,1671509905,360148117,1781742007,1076798317,1879729845,1808883220,1963260376,1290933301,1478920002,500250486,1008463020,947079963,324983700,664426140,65439222,626314677,1796903883,1028167231,724724343,1290084352,766413136,383363867,1121614808,496552000,1099452296,1873992320,32311688,1163266015,1267370877,42543319,774061416,396315454,894849369,478278426,275296581,1738349241,1718089431,1008397781,1487202646,1787823661,1331120841,1907449448,355802866,226381082,1734675392,35440383,402652984,1323486494,1942055240,1360288030,531641420,1443892143,1637683863,206294805,1769764983,1515654557,1167577826,762709276,975105846,1512612812,1217581889,1104746590,109963053,429863971,873037805,771453302,680749149,927842447,696259205,481446173,637533371,1279841484,1681642005,1799710647,2012445565,1637889677,507766355,964018508,339510481,1825312080,920208427,289119115,1975526875,485152751,1529702682,1935481600,1175513638,757627717,1627890713,841494382,166068562,1520172469,1353761740,1504676249,1649451757,1636023578,58762876,1517138216,125183696,302044616,1653150281,605713310,1374160151,375680577,1555263221,1324303227,353532079,174993601,206808209,1504465130,1958187438,755254302,2364632,1276378492,1118608926,1365456789,1822310943,1380475491,516550841,448579231,1435106715,340307752,1466740812,1623158177,442356319,1069334693,134003609,849074044,1337604782,924449689,1747532094,1053812090,1922910351,913056851,1190690090,1506630011,1040591990,300767687,1730368446,1359110351,1094737697,1334166711,1640534501,534976694,1794530215,1687748670,73886454,1415684228,1119553531,1755783311,1324441041,116025595,1253679542,1376431283,1481488933,1785381115,1239141735,906526953,1597225023,479093294,1369427603,994742584,73832508,105028442,748200912,748200912,748200912,488026902,1980086215,1939745183,1749260062,500714880,872989652,1682425834,1199174323,1391223677,1534660960,47444863,1621536542,616479177,425956418,1301439963,1233092021,1654383145,723359408,555355608,1080843063,342164799,887827338,1676975606,842424226,1354578687,842693563,1166089521,1451597661,1553502718,905039883,70749571,732593579,261943457,1262505745,488676206,1638845755,1549644708,1667532507,433334720,558832008,463369203,905574734,1861823640,1002634819,1517138216,945203444,1195490640,1564170140,1403783368,142622545,178537311,1334507224,236334796,201126968,137019961,651531157,1251227183,652076351,1617258538,1983024810,1262753025,335294724,818569258,1040512055,1337385984,1751377080,443005429,1747691572,676238799,1364132908,1864303295,419642630,1667801960,154045927,1660382073,1803790278,533960028,1689708245,556949839,1300299799,22540204,1288130955,1406103791,884118000,605124664,1363390042,546536029,1684098841,1589585849,1616990096,1247194618,116045897,272900197,71511533,1153782800,1835688792,1820620010,671561766,755954412,612362170,559255057,1536468518,396961804,1620265270,775074179,1697386445,1624588153,1706989674,69381709,274220944,353643158,1662714759,1245509902,759596943,120953114,421711467,1958316343,1508198469,910458774,1546806309,1410487655,907228171,1704537643,1881848984,1108337683,542942815,656179656,1034697039,1225353374,1390822106,238970912,1567586218,232736492,560420785,1033674697,266187058,1482707971,1034460981,695737015,139627842,1597497608,462957755,788297245,1643238791,783214670,78188392,1681217583,1085211765,1076215162,1925849518,1211545439,508375336,810619369,1499788687,1422853631,1800018269,906707995,1529450403,844466692,392975569,206153337,193436654,263821822,849100880,1222845809,373436554,1630895064,1497405400,694885967,169670568,1371585916,1090458750,1703865499,405642676,1430852721,762887225,947423069,1123162533,1813175303,150991330,1050213229,219118755,1216739338,810004735,586086062,1061875554,1946547417,1996860023,1199555521,120223233,476215129,913433746,1347846680,1754611395,1440827290,1705660691,523945593,1215257838,1322245208,69553317,490854255,1552392847,1071536041,450223497,733793360,381102900,1762687595,857888368,2003816106,944343690,254434167,602603442,1424762984,1296335713,643152915,403509946,885751032,213797429,1115791681,434758884,1274528288,426119848,1258154962,78941603,373994694,741780221,1484021053,953528718,438461286,796496853,570834725,1882659711,1875124866,797643574,76090863,953193076,616967878,1701028653,292237804,1771019888,696136338,1519500785,578023598,1193760061,1551304186,1734089638,438824286,1815769322,1265334052,679293659,1544827369,1194443616,746235188,408261540,1945430386,1941925370,1955367781,493276090,622304574,1307084349,928978817,324501224,413186242,408781378,474013757,440694903,1240554257,1704319259,117661520,874149941,362926322,1476270910,1464530089,498422734,788539472,1416539367,209746491,851251462,1937126604,287670137,1300492573,1419656012,1700232416,410002455,923269730,845005075,1548592680,1221187172,1304820025,1944013749,624009252,1554926790,1636332992,592378953,1670861108,613106239,1576301383,804989087,1341481318,1680126728,450814004,728817834,320943014,1741566774,1331612466,505195532,299404385,1602525400,1435341506,1726351697,228710333,881326943,581662548,1409765628,1206273133,738879130,1016783029,114036259,772627335,720963257,1087082226,133328165,1097280160,209668622,2010783239,486186558,1304125982,1924123906,231384488,772658340,902661373,1817993914,1811953892,1783506249,1505101304,577045139,964206607,1666222645,1670878173,1126729421,743139420,1891437180,1369303127,552781242,1859927570,1057374964,462300248,1995595322,569661024,1407262316,109032124,1343015697,588664445,1304041468,1275641112,882200629,810463249,1247445317,229651543,1375027590,110236304,1756790931,68546341,1640221504,1723939044,455828730,1467339842,494473432,1687038928,1227530911,1853866935,1363946859,485445762,870270816,164538973,148123785,118328378,549995319,893924422,1699149453,1365240510,2007058459,804333914,88450862,972804923,97893622,625699603,178614761,1619927774,1166507144,252599382,895588686,134032735,1230227503,867632957,1671820291,111466936,321101321,1350803371,530368982,1794446104,1762797502,978707116,46424529,314027022,810854589,1912434523,1529566888,220630296,305374380,1911028413,1118382110,375731384,1578211401,738439013,1626777136,961802754,902970442,85234070,1540761251,743819526,960674584,1432992499,495224931,744514365,942019245,1770044939,970548597,1224517948,1895490260,1614815995,1917341857,190506312,287495825,1921978612,1095707484,1547771529,1489241144,1755983975,155366713,487122767,636596115,386577991,1088707400,1943220880,1199750705,1418509507,1862638229,1770324796,1449137460,1846176005,952645655,1902115295,621800361,663950213,1458345182,1945964055,719213819,1256142343,1778809016,1031163895,788770987,581995876,1110084314,226105244,1136926712,1886028468,948984832,1798536415,186809373,1083321992,345397706,141936505,1428368796,1362206241,249079515,1416571072,92870686,21717153,583986712,855335393,99760453,1207011361,1782975972,751981950,1344559970,1457880508,776545806,521501508,865329087,612108829,853029067,1007951391,1597019831,841116836,87096309,119427698,1286964206,975694409,591278591,996377144,346126207,1261311595,229890281,1957768125,1227803268,1743301734,1341304561,687612077,449240969,156097808,67727676,1452536797,608028318,865015505,1199905920,1367109451,661246447,1163783742,1718872851,818096970,1336662123,809464584,905457325,1262347042,1109875842,243484455,1634881563,912768399,1804001621,1047796863,874668738,448195875,207727350,624674766,1366610717,1246715275,266730682,1111340652,422527945,908733842,1063485062,1835512406,1545969196,1446974052,1215409244,1392177749,1892445756,1248590481,1481965521,1740968781,279784476,1494487567,1534986782,1013926417,277877818,943014681,1342695215,1379598372,268344596,368953909,1198823449,1389741077,1107952575,1121506997,677699133,459771173,175272378,566005575,1858546002,1920128326,846173351,445609599,504101017,264364939,879016749,1367632182,589373620,776030261,1976463554,1221340957,1428487722,1385228359,1088747570,1424235381,1541874590,1436567132,283293925,156158685,261472507,198729402,197198698,293586234,668985870,1606158802,921646386,1114883555,45383012,1059926417,1339209169,1036338020,972223195,1854698239,1614638961,1599903405,1935795819,1482870805,854448778,137360476,669817240,631687598,1299245054,1423610274,834930416,134934843,802663506,1200366062,1884638640,1205918040,155354099,906127496,390511593,462530705,483984088,847354141,1441275369,1063158584,172442022,1135404399,1379354533,1660129960,424593254,709776724,2002924874,905922830,468090971,640026060,685238093,201408465,521322355,1247433680,1295295079,291553334,236881793,796370670,1925468385,1995701674,1584147322,442613056,528203591,1073408773,1012238929,1441955582,111519941,1475786558,905167143,1071706074,1741361957,938619822,1234946852,1583276525,1169876548,1224505062,400285688,414111395,1843171963,1588736152,1883109467,1339438778,1214340426,129314365,460909323,702035014,1612600641,1953446793,900104572,289602176,309105780,1366358020,351243242,1350693095,776720233,103552963,455265442,190723307,165514868,1974204769,1760093178,757669851,406305834,1613999366,161699091,491968345,1380860646,1784062452,969394892,1012048764,1091795968,600805559,1184757024,636111769,955406203,554201009,1146338646,602196651,1104605520,852536698,394189383,1133153811,1643469520,738412305,218521672,1452992076,1388634827,1574802824,836027752,521154052,1449463003,918149784,764240726,135236812,989790323,444002664,1341562743,1430779852,1688054303,1284360132,1507644048,118721219,713674828,1885632905,738488853,405605993,1443174916,780258781,807262898,1593022048,1078362427,1444456558,299175630,663911721,657622177,1272522482,522841425,1624353158,1546982245,714406197,1941594056,1638182106,1652947247,572878498,1062564897,1858007312,1555676102,1294322361,1597405091,947830745,1740567415,345313032,1058334029,71664661,1866102493,426613642,887107489,765563114,1956317609,1376143649,19763265,1506888349,581019900,1257559669,1965095459,101718736,1202200309,1383871729,433976923,205373502,631848647,430016960,1926345915,1116915539,547369743,1619494394,361584205,1684002428,1537367535,262769244,1260371430,177376069,1753064413,1009706077,411997108,1119691251,1582078694,1743232014,569382972,1675536893,1673910728,1255194462,248307572,1251228824,716919610,1554880982,1651651507,1913933803,1329409948,1803932172,912589225,1363274198,1012577549,1906258906,1283815597,688722181,598132104,522324240,766199048,440745947,726592130,1753617412,1481695851,668123737,1710972997,1416198602,1460459264,878800246,1661233638,763305883,2001396994,326376030,926610704,1630453465,1135675644,1694149042,1944079751,1379386315,592604337,575732126,392332616,1268305151,182813,1079236113,1229077367,1231080765,1424883069,894409551,877297755,622301839,345567189,1352599685,503151382,202974051,1221692259,364664134,1173891820,216133820,81538371,361286609,117526903,692254239,1586595829,611549711,1536658076,368295506,1101177493,985560328,813111537,615630070,564645322,1552351637,1215619394,353815020,49790079,1881605124,130613431,34087105,421444148,1605855870,145614459,821444728,869032591,1074279342,87158893,116005011,1474197988,1319635823,687366944,466017537,1285910614,562376445,721243090,1480152760,1164075226,145389508,1185480076,1031762620,859441951,280651930,378963839,555800064,1260665837,796113127,480355394,858908983,1752817184,1228983749,1388333592,158302631,230464329,424510435,1484024257,1763129441,1709629053,33867240,761930880,1071796567,443723047,1649206573,56990167,1818577431,1384715113,1470319401,840750313,1591626214,1012578365,1229721261,711952545,1506300338,988322494,35695761,1445585164,1967422326,1309894710,1401451648,1741059277,1633877839,1311101587,1355826278,760915501,1464525548,1398462656,131689937,559321485,1175162747,206233656,976756942,1125620132,1125620132,1125620132,1005228098,1794458038,449418095,1179457328,1631831934,1247322033,1094309186,1973454373,86929950,1489492968,693317797,1399899945,1348411144,1189449341,807000053,670364106,513003487,1149334218,587331058,248363896,1962258027,881283210,1742067744,1683425568,1147717453,557801194,1484010810,1867894687,1096828665,1192994935,54175948,1304188963,1661644147,1190641199,40042403,80437259,737573893,1328972115,950446240,624815673,1028975960,463420053,1571350646,146678732,821444728,1503709512,1479156688,1569999285,381787772,1713749729,1825540594,552101131,605331036,482266178,520042313,1940133109,278345904,1336578924,791729308,1800197689,1919679059,1869153927,413181495,1524577632,1333712826,1742489812,165305492,981498257,506281484,1812409173,1321086078,225698799,386052751,1864796553,1125608416,1415942068,885435210,1673169285,482864610,1089525487,590460748,110777027,1580282654,1010383155,806499355,1511376437,99413980,1731811834,1741004984,304046440,1192489305,297285829,817326833,1525936646,418312580,370501748,1871441724,1022064922,1574409332,79251421,1367875988,1629983913,1577853284,1531060760,75736140,1524122183,1916376605,180717013,1480719158,631780294,44839940,1072765388,571940713,1181620051,559293888,402711643,235766841,174489609,834981550,385894635,997273764,1349285443,1063597162,19185535,397552300,1523854761,1721863420,408599186,932514192,928810388,1989835433,1755354074,493077326,1126088382,1314160609,1390130355,1337286789,665700587,1765196776,382036243,595946144,1646933840,3657986,1210739530,587067282,1418703913,786677148,1834101200,1784625432,633938761,963383188,1004510234,1698291543,703390794,308056147,6558334,1568444404,850055207,1042430417,1508221947,1483065102,1719185931,150569300,1554665455,685972515,1519645610,1675597892,784917947,1778898378,782658419,1146615913,925406503,1192486625,512421121,396780848,1687347953,1594897975,952035768,1927838216,1506539551,900222807,1555574575,880683215,1673088959,639600638,657318430,1246497913,1170349125,1873035851,102976509,1837859072,193769812,644265129,333845400,448871973,930800337,1087684495,914058500,1540994129,1088915924,1695673444,1063386436,924100723,568471209,1290903216,1457202893,527265941,1551125075,110215525,1353918218,349453876,388570200,1742055552,558357267,1392900116,1106489174,1614128359,1396954734,58420749,2012139025,758408427,1479390800,719748714,1412285850,1921247320,316829129,1617642516,807766910,1845501905,124115588,1857905462,387269810,702403768,1000432211,1318580178,1166686890,1584977586,1902821974,1317894572,1409630799,1853196583,1826364782,905450013,1635429250,1562448336,1650088878,1024537010,1766174020,547929421,217493928,930911687,1921172871,1571669918,15986009,660031561,1067978981,1588433209,176118533,1118031104,1383761534,596179027,328106650,599316823,1717054038,1567280749,716927971,1767895555,288911228,452188424,1229866561,643512608,1903482220,1116152648,1172468817,1692024721,1667742335,543969903,569104156,296075969,663667030,1870753027,1245511092,1411989873,197718475,1677599662,48517790,1027925249,108729299,760435304,1582613285,626168160,1717640928,1892882130,95073764,1637260541,1546735230,895109823,701118030,1561427917,1621550652,488418492,1456982525,535352886,631245723,592846874,1035304004,922504844,1328615004,1997404089,1728666498,1521809314,123881883,1000222959,1411787314,575109167,1781991345,697312410,1744838731,884404157,566429938,912714159,663768782,692486699,622573155,1693422471,686936103,1894896406,1823163481,1463622151,666280584,360609338,1370960705,2681636,1238769909,1773017460,1986356921,70095930,219402224,977397027,149933879,434709588,1958605559,10718251,829234103,1814726710,940627127,1288863257,1376130723,1840682221,1818889568,1680942521,609713116,1002587420,881584229,1025586995,582468721,513058718,1695710772,1585580128,268968098,1654147024,1091669741,236575404,1973518182,1248206242,512021864,1180031735,1849746330,1659659021,1429529760,1339720000,970681844,1229560752,1753629026,477550275,1121996271,1606097709,967564124,1109174915,704616078,1234939696,809598952,1916864467,740748895,1471384867,437155897,663640080,1119151507,117558636,574766388,1904567621,1172342543,238092087,131016951,278482154,803708894,368548907,1815801734,597061438,383800511,1233904086,1271672831,628386150,1210563673,1819019289,1152037741,839092395,1403063680,1073065506,639841147,957792508,1389902429,1783227804,43208359,920612366,1633591107,293749025,1277072215,758298685,378699869,1200048535,350046101,477355205,407270222,1020669210,1288713641,61601478,1654179400,975141190,1924535150,336835900,444283143,1319642771,47289776,945209461,525675254,225211175,1183037001,1083695260,462130141,1040303058,52280237,499535201,978928203,1781878318,2002436357,1527346624,1715798993,997707096,1130524116,1827995011,546383802,824158230,437270471,1524309181,162713322,428985775,1644760555,1921959359,1230678928,696361280,774058740,906622382,1314094297,1375344713,1131676105,862764973,1298408609,1495822269,213272030,512836482,1969993476,844331646,1319486418,506999449,248546390,1652482586,1828936952,760263884,1525660263,48547000,1500568236,705372900,1807779899,1281374398,1470669307,812736192,1049413232,693443056,1313086767,1411555293,1259512635,1974130584,940430120,1542897937,1211071993,1917961196,672285547,861479605,4024973,927460768,1232247281,219642094,1753694628,694425819,1676570257,1786034788,1093594777,1516024737,1016472891,1305703874,1346425365,156206414,1089132620,939888329,297015946,862594423,1176675386,199614181,1249448720,707903545,557019428,148032374,1875478141,1216141902,844459809,778876045,1933990334,576488112,1867591520,1976389627,1039451076,227346374,1783319674,1816359876,1732028507,563881622,1197537270,731904413,1491055309,835308974,307306162,1005399386,60965543,1613760764,2009188048,1304690532,1450694430,540767762,661430940,115716532,1325406041,187636007,409691206,1022993630,1529737228,1704897618,1123741130,1129099971,961854751,1180341833,775038251,695974499,171019534,928345378,1230233717,275845312,195968484,1803754100,1394684197,1688745040,319431758,1578086127,1580459492,1708536106,668483728,1083032600,668705102,991246522,687182502,1441700533,912370668,489095969,811751960,1604878516,399539471,1854574042,1559501377,175328306,1304594509,929415757,195028124,14757462,380629581,1681057443,1010000155,968928463,1112984170,223975442,819207241,1288295549,201496421,172318905,459701598,1706097472,696054255,891111552,1769219965,608406657,1312544158,797074316,21427484,379325505,1993534235,562435087,855506657,1920629337,461268312,774211005,53118334,263238866,1271049684,1605361583,1843694326,374119051,1604703527,1072440969,1989051842,1189350330,125567650,1365193335,423281506,221381001,1942650250,291342921,1451786361,1073881941,714016722,362967546,215010869,1941615404,118221329,346505944,967261174,1630689319,38360976,154715121,67644459,1807282516,1151520113,370400624,1568727456,1011038256,1206764664,281909699,510826551,1330991412,1230638523,1519125599,1478975712,1913578223,1097811886,184088469,412205103,366802007,1421553646,558833146,804026638,375969394,1808670852,1956965937,1180070766,1661850153,97809987,295425402,740442114,763920708,1550090359,481521079,1941735729,1759889135,723320845,58068238,1869486566,1692200137,1705777820,1116047654,700333424,1116614987,285478456,847366934,1664367119,434742040,1362176876,2002630596,1506266861,1600523075,307548232,1845611790,776652492,323246644,488044437,739294798,1457757090,1360166711,317830945,147063797,350954878,1949840143,763222620,1309795272,1435353832,1915682531,464311324,683803716,915318906,1946507019,1771703235,1108619517,1060343834,1695955815,1124701709,1027295745,151408374,1305966580,706506209,1057880708,1078446382,1334016690,1692180362,1400111911,1059499961,1214760690,700283353,647500760,1253977101,922932110,1726898264,1334239451,1510744678,1515966596,1377972842,1115752839,1586143881,1307770486,1274662057,471871960,1914322673,687879371,197270065,675872743,659674844,772176212,1836959649,1638909219,1864316502,101563820,1412923135,579913243,1100057533,1182187361,1467304987,1473682423,649556180,103150509,527607685,2003517227,1226207141,1790581644,446834273,1065419364,799472961,1796943942,965675002,1592533775,803102049,570971938,1961116313,923476686,1269951080,1272886896,1786544204,1799189885,1106771591,657183495,1760722325,964153573,632137444,653816225,465806913,709690241,1835097999,1345860140,1321034094,1960720990,1487138033,1513857472,623683415,1174283995,1690107447,758401490,274959762,939859287,1708808003,1050426887,445028974,1208017882,406418175,124374336,800080457,1131265250,1071821516,1956001090,738414735,379313857,1640537175,1837197085,926140724,731897169,1809217607,93798856,1126457092,1058857879,1457636588,963920144,1802031320,644528753,1787911066,1308454623,1276635369,971519801,1459933955,1331160993,506047561,914063908,1979912708,814856819,1501554561,663276938,126593423,834473920,1113731893,1128981814,1130980573,47670121,756895146,1897420424,445703013,452746019,1200761444,1646832293,1331530727,1082954882,995833403,1417486980,100160266,152777511,1985817704,1520662669,692056974,661295462,373718014,137558722,1527914043,1234776801,195253348,1865139443,132495446,126209721,130844414,561536864,666486826,644233486,315798984,590995630,532535969,668419752,1656625571,1000306097,1415826063,330294584,1886834631,878085518,1058042326,442723420,453329726,350310214,138966060,472833034,1111367980,559180955,1327629454,743144265,1660741969,643462083,1316111930,1234102090,163428151,1432608300,1557452357,609536231,1141648032,1083882083,281604775,1056839857,403777296,1515654605,23902976,1945785180,1722163027,1010453941,1113656074,1048297869,94006470,1089548714,1141731986,242932459,1685022329,19497655,735923777,1504346783,1755812870,1893081984,128742920,13758120,727693339,2009502594,86806760,1101980559,1968807561,841845718,526389402,663525537,1338079921,753352836,1238918668,657847919,948212258,1754031691,1388196696,613860613,218310272,698266218,725534073,1452985622,1234659266,1234659266,1234659266,1175820658,1872566695,1902792670,1658906887,1294035775,333540862,1805626883,1865803196,259090600,695874438,1293672811,1934072221,128568762,512538537,273529612,1183237488,259722044,48534617,79387368,837024155,974906935,1903832819,325513655,1663212627,856475136,1132245363,1905628494,1245365790,101804527,816307295,934527112,1218748808,490071210,1051192298,477212452,937432901,1078980888,430730332,332457148,81452302,121141606,1270213786,1373710158,1467915029,1000306097,1861688993,984995861,172053230,801955559,1692780510,1004436182,1596483254,800668403,1712745788,1225187188,1495269424,1987289688,1556015008,1600216724,1340179882,679824051,1679526076,1342372555,1429950455,1814834791,1146811575,1210633038,1463420295,1881790066,692727094,293884379,1591738981,1591001383,283602088,1089095095,924448410,886235679,1824124977,158150554,83691411,1053923133,1944880425,269197822,942370588,781583474,52555254,281430563,101517784,208605620,1662095785,285246955,436918341,546677098,488026174,1277409797,1121045541,1546963478,231046964,99247859,1074889084,853586918,900042773,1959048017,1681542059,828549980,786246461,651920577,460932730,1707597738,1088371195,1376918598,1088014066,773595162,1039337931,1838331891,561526416,442010802,969559257,367238466,751286345,1061910209,651119810,1820526216,297297077,1722097722,317217813,192241543,624848601,300520963,1424599702,1180387368,1176946111,717797527,836277968,316725366,608142349,442216475,1811568947,1759872325,1455181522,810328793,1828397766,1155711739,1888499221,1810847587,1130876632,695508074,1754142176,456121897,91307476,1177093213,907493073,1738215833,332622973,1276879912,332917346,738038245,1584534290,1167866349,1143277757,1406754189,1730979332,1283020793,779772157,1432743729,1732582162,1819543507,275379899,1202314903,197428900,214159295,830789858,179217262,1623564459,871213478,1370212510,1610483074,156839923,1404580435,48474387,522859776,1565485342,956171694,959671471,65161658,1462251438,2001560958,1791341509,1429445326,1729028280,267779625,336753364,696345326,1969069707,1307261955,1591836566,1970071362,1008014112,1618623321,223087945,1187580592,243874612,1528207288,1710229556,998713142,1169610047,1244831370,1378593300,850404380,1571328557,625484889,331227287,1554427808,1490387285,1561461257,1150979169,1643299866,802969012,1654399613,253329594,1180921301,1516633949,787402428,1903328573,320465843,215125731,675769883,166655480,140294211,715694011,1062757445,631592953,840700940,1151073749,167635125,1178479362,758546231,171245156,1568557867,1189405526,330602194,1629696426,717500802,189476766,1020910190,247008988,405190138,1845105040,543852193,634425580,1360235182,715031233,1981477945,1081333108,1618175252,1905227386,323143266,1852187424,1753745985,1244693823,1116268267,302669632,14834129,1581421865,1170597420,1351347620,1471536239,569092843,779847991,1403720225,367559201,1455973471,1701748279,977070315,229324034,1208368380,656926870,10038222,828550724,1307317500,28198789,1753703519,978635880,957481706,121039142,1391251306,927088558,1255597773,888659990,153087108,1217787702,915776363,1758181891,223775810,1733043700,1900535448,1116087687,1253656348,624622777,675926602,791492233,1441703027,2011552480,1215036724,335012932,1574626744,1842727097,945744316,1313477050,1799177503,1878095643,1719818045,1512620582,567650134,99333608,1957180506,68609808,1728933075,1980358229,1034834070,468489726,1493130587,1723444262,347570868,708974397,372404118,410345074,1313047943,702516800,1778894261,1004232857,318809538,813554512,1888366683,1608921843,1566948566,1004652186,1548757435,1116442850,569585387,1922080553,1899944575,1407746628,822144718,1498255471,76411518,885978349,1484900075,1262189645,1487408939,478826097,1626056383,1350364067,1855143810,1481031326,348875893,751168749,545299288,1143000388,1588531314,683331528,157525596,1819632940,1959538072,853096803,139597697,1398363890,1000255200,502002184,338130265,1714866854,1227161403,2012440382,170920903,717930215,329577800,1290574632,879991032,775948328,1235702090,1729612600,1605663735,172512985,410173352,896307482,960778597,426420660,1213667624,741791272,1684808667,222303082,21158593,1791762750,1993037270,613136269,786342861,1049107300,1244382892,1060984198,830924477,248881519,933766705,478254343,775142706,1536555057,1636195605,1095961547,1964186330,898290981,221555742,29754962,956602042,185725318,528324657,237104246,765170986,1358872457,23785731,378922418,250355878,852269641,686563686,728973031,513648104,180299843,1578235851,172842502,445958722,1734716096,94843213,463824143,1411738918,67106562,1726118767,811059053,393008855,690351026,252196368,300777732,1412595256,1881688977,947453383,1945669273,1911083752,961613247,1904800625,1907016646,1980689570,1647578678,136329797,226302770,1128859409,643146097,1513442272,989751412,304495014,1342230332,35067195,168552079,834495868,1635988565,1827269072,963501136,265039147,1260943798,1563958939,732524776,249606998,772064531,1719420949,1528783577,203859207,25122133,1083173094,32562319,209328802,560465150,20906323,1224392882,1422201376,1906918195,968693266,1691180679,1421646846,1175935880,190028376,622576901,306291897,534389268,387734060,1428631136,139986979,317937682,280252093,1848989846,1146730099,625131331,505055724,176946452,1242186888,155861931,223747397,257854622,1381095436,582199420,307796373,478927576,741487307,273605619,773856583,1987333949,553172715,898665716,1943562226,1198896036,843230161,1792102664,583365814,356688872,536761401,1917740407,927725015,1670304922,453614921,1293731322,1839036173,1463242884,601283270,1377410928,1931910400,963430370,1071088898,675330477,607980738,1528730035,741319150,1201328401,973628290,1826495061,780973516,1368792008,1001109795,591813763,299289474,232557706,1503331708,298909309,1967230105,291279736,1016488782,1064977163,994787785,534328574,1377876002,1195352089,349060173,1705563132,1526733562,1093106012,1367723488,804267905,2008751,1882442576,133599635,602169886,1235605722,1010013195,1711075239,412801247,462995021,127100549,1463188891,522037898,840490931,1982491498,1241609851,1876204279,1081917227,441155527,1344754150,210823505,1272453120,1643042789,896218401,381151748,1055430586,1012472292,1674104269,4478535,1858215872,215960452,1815820847,1525144335,1506764309,267145471,742325849,1321745889,1339432187,1996487509,1460408791,523866865,1078104213,813317295,1102595576,1282386936,1240818609,1696130208,907739803,377676644,40807407,1959168062,1928817971,448368943,1473661104,1751942290,538676010,1570003722,165721754,1128109778,1932922410,1990715664,741745461,66912490,958469271,1627079992,847870902,1483854410,1485241071,4932970,1624794139,1668206774,1197797708,1286391841,1392108565,792387182,167876755,1859638734,1383932461,1644041581,1831478462,849402624,381706280,231805707,1056019652,1685503113,1513589447,1201509211,767531363,1659012640,1311412589,1713782899,495662787,1016933031,1703433984,1269132500,1668757222,1762156486,33129394,1985603863,820272356,35978546,1812405113,775228534,1559228433,1963789509,534202219,273441324,1795699864,1544528233,1840807180,639033938,126618067,536792300,514597073,34545177,762153310,351560023,507421736,1127655296,1076617130,711355777,1222974779,99121017,607572802,873009130,1646615378,271746017,1122135312,1445384128,1625932765,874430713,1804622687,1829091919,451760225,1173497312,782853147,1606362765,28464399,335870095,1344696180,1888623913,1627603544,265927514,1558926837,693378313,621050027,1555336471,297968186,396980582,71562042,963483172,467556808,606883493,515382389,1924120590,86759044,1609244570,1479210791,382359120,949222776,1583398955,423233022,937921747,112070148,621737539,1068525750,893738803,1325232550,1178450232,1308281056,922525062,1280879913,2001322609,913571776,230497844,1697393571,969648619,938033073,1006335073,1201494368,1150486120,1332623569,1249256546,1551404420,622492480,411450014,165241259,504673793,656795959,108112469,1522182857,1844475482,998036651,90388842,724225058,1650420387,831874835,1229080174,1307668556,1203922579,757825053,1800578125,757588642,351417645,1747539222,185793733,670408215,587966369,868678374,1028666833,183124906,1518558886,1508349290,520526596,954962346,1181464337,1945707000,1869653355,736066403,1501188479,739610692,713274835,666859606,1180956861,299085330,1707402126,993177287,97752867,773806315,532184833,594112740,357087626,1759959883,507609027,556392344,1432839553,1882403446,1841141932,1402291340,1839024274,1868642746,1954039645,796231854,1858654727,511434338,1607192025,13116658,1206648774,8733365,1625625016,1933258155,1528224440,882126295,588630668,346654217,1899849397,1551506262,920108088,574246198,1372586266,1943339558,220325302,1852351622,465290763,591506128,272339305,1883178802,477489873,336306038,656779932,1922078616,148237673,1136642197,1109640717,1928257282,1649653833,1214993687,187712762,1833394176,466730,1499548393,1132937992,284884757,1375488778,1852206004,629920520,1782862237,1901410624,1739427476,912747072,49828192,1189776471,834345029,1194670097,26334514,67306093,42162135,929858494,1595526114,1279748826,969232413,67531367,1913093218,75008544,843884912,6894202,495377834,696179165,1718907495,448738371,1975365474,1081438235,1662621209,672508293,1819305790,225032076,1027230537,217980301,872598351,657022749,522802597,143222002,1546763077,1090810878,551479342,1261943916,1363996786,1256464574,104450349,1992955767,403074164,1393962811,1531969888,33143826,1979254806,1733975869,743099993,513755737,625712896,1867104157,875738303,314840113,14413148,1502794041,1830006401,1702689596,1786635098,1726666214,224164004,1839180688,1196796805,1095853830,794892345,1561305278,893990537,1196887782,1998412763,292363093,320391409,2005124505,1076371748,863274844,678017130,1898926511,777021251,1223180455,477829440,1550761568,1738200895,1990740501,1988071553,1423835559,423240534,1305256277,1900554856,1391313089,514625106,952421499,1723065690,240703987,501425681,917527087,1542406618,1566568997,644810178,379239759,379239759,379239759,467420349,428505829,1251892564,1989986239,1490587933,1967214971,812648914,381155239,597997912,963616209,207977305,1620739735,237319327,219849307,425220679,1790157478,1390418906,480942028,654404190,1326865504,1620779144,932582591,42235313,1095096701,440472739,229839180,1022741153,1531914594,213299252,908057539,723935831,55521865,459319448,350742678,1643068749,477396683,699282087,1027992835,469993575,551398177,660870237,945883120,1393713729,1672156020,872598351,1889794772,920938248,230060970,1288999586,1280789337,628818820,1663250927,142595175,587111666,408870521,294526723,1275765663,108377501,985434786,630944113,1262851717,1274715908,623778381,431579662,1586471931,1439871217,382599024,1855278957,557024142,912934479,593299117,125639968,694837903,245602545,541564693,1074482421,95734641,1324057228,676535597,1027845717,1173827051,211666855,1577025219,375605390,1945295807,739451854,22069459,1805684940,144641797,809130986,1468663158,200126512,1733523465,1694113437,1626779656,969831446,1389122702,175505436,1479173431,1620131595,1483547997,1358198875,1323281679,1570306739,472946521,1777742109,565719709,180138680,437807303,101958120,370716896,104532009,1994405960,5270203,59190358,500600493,1127947936,182529681,927913944,991122437,1128620634,1480311374,1833961802,1685448182,584571080,1916809812,569191323,235840768,263368176,879098227,1096919262,735064903,1527796856,598274876,1327528546,1475932713,1385259627,1907878753,1806719714,1670335907,1284039890,422467105,328342571,1103419745,280924321,848048215,1525653776,1786321058,1914888202,219139869,1803835640,827920935,1369628636,1803866414,836076042,181290935,895199802,1383728585,84093635,1625752786,891700210,1231380645,539900103,1223405001,396571456,742574207,1735407088,1322405875,600706211,595783408,833465297,807812528,1487610173,195569311,297286780,1270451425,868472866,1933624195,1895772867,1456414091,1054999299,609187210,14477368,1505752238,260276008,586656213,267412435,1564242378,1086741878,156904194,1609698998,1328588139,923346108,1476838924,986308159,1638376204,355316974,147277123,1435857958,266837405,277617318,614170013,1706884473,1035396288,1074070041,660843214,955229911,55077856,1995966417,900694324,288582313,464006154,1505401765,1053534360,375512699,1675236335,302905297,1435568920,1741071897,260164713,1619390158,543538291,889086410,1399988581,1748468227,1137968663,986203622,1583318677,1288986024,1699289850,1085157152,446933823,1584463574,809755047,1550706455,1232426370,1911759340,8923395,585695181,1210167045,1503004584,793033358,112720458,186882238,1459623422,1592851816,289856609,258868432,1542004481,1495461915,1273088493,1724569073,735993939,1539130007,847083957,309822064,1999647148,288177505,266787249,1844827780,226304743,518576114,89604353,266415411,1325228424,1426114853,1123564702,1562048157,900371040,979540952,340936599,1842271308,469921047,861166329,444564516,1011994350,372934864,1207347603,1375464281,1557659975,1630098726,741214271,1063659447,385955975,661520056,292538878,543500100,587654210,1373183963,722444155,1040626982,1452648916,1655529273,318637840,412839574,177672978,1202573599,1223565629,1134900355,499372055,1316194293,214457579,1929468951,1617048907,397282792,1182949699,1355424903,1423260742,507786297,1150758848,108293895,1845557910,1607585681,822669532,445538184,429876293,499574599,106158020,754785407,1617906929,1601040543,720536376,55254144,1129938586,1475707034,426067991,1589189963,1513687210,1241268232,474053246,365049900,847047610,1193466243,1851854073,1948503240,929039417,894683683,1054599533,1901018809,1786933846,1139699819,306814111,356991851,1023077787,428250232,1679555857,932341476,1040828177,815553391,1249234449,1378571916,417365676,1567469061,1203473552,1229213568,1781387186,807899019,700094869,997078324,1150807315,1369574476,1257002358,1012418646,1689776081,1282170682,1489120465,1289136745,874325561,1169427475,1488441896,1123885073,852542818,1135309243,81239866,1331086903,359391986,1081857610,1290494797,319327035,1625993522,1999333662,104520672,441920979,1794658042,585978622,707271920,1980632431,227011539,593654919,1232034224,207665100,385937869,692955496,131631800,1969667516,1577722430,1721344869,360833086,15973528,423534904,116778196,1565494886,1836331583,1055226974,350750929,1675582504,81231116,786743714,168686695,1723857528,1051115876,911806188,1234937816,27274917,341354694,1975092478,280467563,1490563755,1198476735,864971824,410955166,489324994,729564839,945461857,648084609,783835376,1566199090,103686425,189306575,1276234338,1632724487,463969772,168353160,1543926593,1952430619,1113689734,121030934,294866022,1792815091,1835663460,1843828255,988344553,1982508906,1525740708,1035558282,689822028,785812756,1264444948,1894770849,670935683,196434914,1512678320,507297168,89256633,1844351452,685773555,606913902,52533942,836353349,2012120494,1491671837,1942164909,1309512044,1014574502,1515497746,161464624,825647433,403508260,329427688,1824534685,1800435420,15745508,1719297248,618726645,1011038522,1822652592,1680156032,1108198041,714700265,48659713,1762680678,603677682,306397324,727429997,1016857536,1796685582,1538884494,418741880,865330138,1996193770,1052506111,1417644014,1528843242,214061084,1449388675,1550650022,291353735,443355987,908643002,407212184,1844211399,562968199,823605484,1066613872,194649644,1608308482,1055031504,1359523447,1291135761,1034528073,1651324377,1494523986,425692265,985116279,1881878405,690912272,517248046,890305459,1550295347,1897745090,402994686,408708422,96785353,1842475043,658315349,1152847244,28518519,999451310,276709840,1754530824,185392694,1544457484,876986387,903960709,375285836,571184148,723700084,1787977691,1185923002,1076105534,1809115198,1100338800,733752913,1554023627,1263034144,754956524,712707408,1731577094,859786023,673093614,1395282785,1218066130,855036262,1042009636,1910723762,1052524053,1031337665,1480541608,360530072,155724298,1057134199,660261936,576721676,416351978,1016598788,911520215,625482955,1418514444,1251303110,1754068504,239383690,176680959,1700451040,1333888868,391019339,309467627,1728458676,685164759,1232209617,1916452801,146703463,221819217,1021446186,809330753,1875080754,1187200919,1134453276,846080867,648948811,60026357,778538053,411497195,15546468,399442438,1192780086,413334451,941367426,1846099152,807367011,1156429194,706306852,984929400,1407903815,1613735668,1797686350,635443841,1187683619,588583444,524231542,1830968764,1037334226,811371284,234351835,1006336733,470525088,1543314,1476072971,1994167138,1094410869,1902264897,116489637,1078340171,364850090,1184025817,154991381,1157433203,1911967874,802712348,69162931,1083920444,1609851472,502434523,505201005,1996982534,451203968,1705918767,1985444108,1561094871,1971074806,357002404,551203147,162574210,865934107,795616554,18290373,54599934,1187442250,531796007,614184516,1764689364,1898800967,767534098,373379038,1760109768,33377962,1241919329,439726327,886495020,228716438,693552873,262976211,1145871125,220288712,410298295,219264103,1804345774,640565396,498796608,1103261873,674004685,1215978274,366085671,1578561377,1750044699,1965953709,483918329,152717183,401987030,359273710,271410387,179566772,590505775,39661809,846708111,454749091,657021090,794530138,329931456,1780676780,402551563,163228465,1506438087,495269959,17118941,1574497926,1008607592,1361862894,1259558840,289731892,394329494,1137107902,50138082,264608155,1358412407,529887266,497466084,1799797585,455669208,1317096058,759472556,1511860116,364697384,925122339,983601495,384078932,1911992708,1067424202,125151544,193804502,964448761,1522336284,1818425257,162912775,493285854,114629466,260409970,266190837,535678004,1082677701,278574449,1967952166,55389414,1209966109,837048613,1945877801,1599312521,1272755303,146373513,359107050,1524958153,1184265298,430753756,271668992,191925700,1647240452,1223035803,1155572443,134058793,842767111,1202451604,1341507910,858724308,656957907,529453677,521667295,1435733714,949992663,299555189,1618958290,399775646,1388128816,563367832,101987357,322578548,1939225245,1069358883,1617005711,1401720068,231457732,70264785,1354836864,538950617,1092139719,1418349558,1356757597,1202388757,78019603,129332489,477432561,928556509,1396746560,341394645,1427624131,6522440,1486764108,850651248,826740137,441055926,1773722194,335028809,207795153,1414028848,8896306,629268226,1324509489,460645341,681746020,646544872,1215458260,87358649,1459464139,1528684708,1986135649,1260382207,1067168400,307411697,1179248453,812523679,1956534344,1233281374,125818861,1446627323,1573814433,1186152507,1980240949,11080259,338584114,94994614,1874869163,1937847333,691463024,841700843,329434808,698054850,77204535,1518668326,990969002,52520959,442867214,409453053,1820055479,395240396,495283142,213708622,1434080038,1149399124,413772412,1609521894,206183144,1054216069,1715178396,60597648,1872444338,505312421,1304303653,584852327,1748497656,1931491188,184839563,1912837880,1382425035,1698082208,1770543366,548860418,1846250422,1583554698,830334605,1908620699,1991786351,1972877762,1371711421,1160636153,975619764,1035429963,635375787,705414470,600666110,1734538282,1268806638,701802494,1860944147,1217430746,1601261752,187283783,1443452652,1381318200,2001800499,1015718657,76609622,1387363029,1135948256,1383530454,131960378,695728352,1530316887,1626991412,211708973,189197488,379197502,318691734,373593408,1396231376,1429370448,26569670,1868776263,1038270835,834668363,1767180436,1731933275,1133419890,1671750967,1376200130,1251607134,935652234,874590665,1598532009,618809705,1428172167,588256644,1107451231,499199410,673438654,872073656,9473487,1755919675,986865868,1222841852,516677023,1553848672,1009312821,571970961,1613684312,836668439,1932367288,1818343818,964289004,1631031371,213334277,316635918,1259622724,25841084,1074524568,1743163829,1722969955,364879216,25916383,951477411,1464213889,501581435,382783827,1288690626,1648859961,1651555702,183318894,78288840,1841091700,1841091700,1841091700,997654763,567789293,221815333,178232651,834437094,494528565,765976908,1466688174,1493030625,251307178,81917018,625640236,671854924,1695911516,1878078009,554711116,696310028,1135229720,1599056184,217502554,231978879,298140671,1077667755,289498779,1019003025,367017998,31365525,1781572299,1301528300,298498196,271240936,455657096,1937375198,1386846519,1797538278,193989698,590670228,332154926,1023439310,38450157,251598618,764755935,1924286426,1102023107,76609622,229061422,1512620899,1603504726,1460675679,1215146773,1220413641,47210894,570285619,1301438134,1502066540,1436184763,1277194170,1488533363,1469121816,207445299,765832479,606374099,1596623174,799767062,1467543067,1703326459,872036633,566645891,384163799,1214908211,451724812,973225183,133906645,856798352,1072860766,1227264641,1582771547,270654431,1419408442,1367525147,1612176248,1095354699,1145476677,519289033,340467992,555274629,300931985,1178593814,1278763868,477321136,874795880,96257700,1541786120,124762749,1130063552,139233272,877966189,1843490790,1489980658,962735770,1257722625,1584735885,559906391,945474782,1621740743,798222410,1159268904,1841658945,676412525,150441760,1105423107,1067045100,1797527993,1894468410,952431283,349691187,285696937,1221470758,50951547,1717853272,1227553379,1515917340,1228638515,473504438,282432183,220991438,1495532783,255929068,1888898338,819227403,877103485,1121093385,1506275353,1484135493,896428390,625931708,1143462323,463046803,137833366,233905363,1555070444,1708092474,1562182790,1235024171,1041784391,1225624187,1491981446,352778322,1886536389,816965756,390591353,793083815,703124572,2002018934,901528741,529356172,1121951992,1680271743,466946440,1992792550,1091515207,1956954284,986572816,1801330969,293305274,1076800349,1538544503,134021507,1638895665,671553911,591582706,394116176,1739431971,145449173,1547381466,1107882131,1094072364,1912172159,499224417,1739813735,1766972456,1890153865,1180412709,1133681993,1752283310,1369314767,641949707,1236338726,1694001532,1396655382,323208594,682052587,909197206,1637248838,1618622709,1565486867,195623596,1100045162,492778331,430143926,237396177,1393939862,588889593,1553945343,1105481159,1771510152,1226244592,61348678,682202722,268514063,934212019,861215154,1509730198,1418976321,2002104887,731042894,258103695,1403588741,1509937791,1131008116,164690391,904035241,1332390512,547633090,1667165280,132793374,997406062,746901503,1059076951,901041589,965765677,1963528234,1031429095,100488958,213391378,1645633642,601458672,1492551303,959887372,1831257988,1332038831,2012834291,1659447218,2005619307,1522423924,170797870,1759299101,154006214,1604445488,250810832,884798438,701416435,1810496646,1433241780,1894827418,287475577,330075065,819127130,829571598,308408454,223516252,284305747,197582205,1488729558,97297791,1049605752,2005737389,1669423511,767884188,1185147944,1868434525,600802420,1830863748,1423178595,1970480683,670784934,1251753093,761447028,422724966,841937744,1024255848,1467860189,111049267,1612212274,1327338499,1341624369,290783442,1601857481,222373945,511787848,1284831904,1485813158,1086642661,106735711,1903946564,558682128,7092914,1117216235,1381848914,465328206,944962961,1857097664,391007298,633739069,618758925,1741062441,366281745,598715715,760366469,857413604,709461268,206954516,1433622584,234428628,973103573,259670407,1148828250,591724857,1107178370,909968303,1184059610,831385670,1299196624,282074359,1846582284,154178517,689760858,493744827,240431536,363836285,205343055,1489041772,888805334,1600062628,644182460,1268472682,1051936613,1848851821,1418017777,1096438215,83052795,1296175433,1294533007,99520077,388549537,379398933,1759250761,1376915074,299083337,285406442,708504665,398690761,1496447403,1097225787,1194243977,611559209,1823537480,165288479,1380620929,944123821,175340534,424173488,1494122949,913512494,1247267330,444540968,1690941397,1173787432,245722818,1123485562,962872169,963165067,1776435952,1146786715,328140926,1992731970,301472733,1480714007,992804692,467372750,868162288,972581004,1544090788,841116390,1056737022,270104073,1116234845,856250806,1660195263,32508768,41958358,806593035,901010255,1099044742,70711149,1328208536,566549992,805024406,1037244736,329993472,394966818,1706519219,667639959,1437644004,338264880,1261010823,640760013,211236337,792411800,1536451726,1471443420,1027403264,1425824875,1615308377,736032375,399374058,609200747,22827488,435660126,160001547,1081544325,1564469285,945847234,2010192561,365171853,1149856105,7665823,758015714,1615493749,77493971,1973107099,731206662,463206876,647324892,1659414256,1609462472,483332357,619352333,1668309949,504748199,135485032,378154704,608617446,1850050812,1730135303,1731988623,1467331600,138828607,1757659359,95728693,1996104393,1258830766,1882250510,881949333,644875969,1044043548,709485129,408520077,1700557942,407574204,1856457899,309049122,805180161,1419604364,756994083,1186655573,319494429,1679188864,687385594,67458330,187507086,951594424,523841990,1034692573,1090306997,1895906973,658964328,1844135014,892089164,545657428,1766841344,332319751,514220428,889744103,489836509,273738527,881904115,63797170,218672757,1981078976,1459888415,986661381,496127058,133231201,1861466093,246649795,981299400,1706482543,1493400462,1580109021,892385152,889228944,872155540,284786518,812778247,1141092025,829709683,73922063,817723332,913702844,1659082066,810272673,1296997753,1890809947,1170103720,55724387,673296061,983501693,243071667,1672621261,593154751,384518862,1724357869,575477234,904931975,157459167,1410708533,97207639,38807682,1950373443,175625359,938918112,810042595,1263849566,802972401,1908404524,513754428,760211544,743332438,621009717,1825036303,1647383354,1973331427,1695407159,1105368082,445226867,1501150352,1895260603,633247352,13604798,375724137,680792248,180610690,516235221,1979799656,668369642,1753319287,375910376,1544678422,673741391,740161677,1860370170,954572306,515834650,744615246,1238332245,1784808713,1200907405,1157742367,1953395793,1905363809,661124818,910646282,1907356652,1406156811,1935801993,650353289,595029108,1227394096,1293763184,449031818,903791039,2002830528,497183814,1137770355,1697761650,738976298,1123530271,1366482097,1874439792,159104916,1732406656,715212533,1149032031,1747689264,1536662938,998699468,475397548,779630668,2009680976,708353691,346547563,1021886712,1247544647,1613268777,1493679551,512958661,808456130,560265907,74657738,740520733,185374708,928021077,1039698416,1253235883,113244503,574505044,1074282178,324856675,1254238377,1332597386,1377346758,919939185,1343760177,1322400338,784568253,128063799,384864735,1540421349,1628273635,958238747,1109215815,1685623936,1390992434,177185389,1464602687,1738804154,187829770,1651686589,1712680349,849022578,1524253084,1492069938,967453567,98867808,2001423322,1125389636,173172480,1330126692,1707528132,1188456978,18792227,1447916639,946443388,362804993,637542270,1008947419,1300231368,824097265,725263620,1543845124,1908003573,570236929,286199764,1012754767,834947469,80078637,1557193722,165335351,390413244,1697545750,546078266,1082597154,1354182859,1875015491,782978849,588859240,775528855,819623734,86981532,372216118,1965746650,1098030084,1839593989,1630833522,961912562,1258544462,95855351,258653708,509008908,1141124304,1392737003,1692042901,210203553,1538698652,467325552,1216013097,1719146381,331856195,1048158664,1647640714,592193753,171991524,486331998,382358377,1346203459,1187764577,1123699633,1602011627,1885908136,563326908,1318357444,1530075625,1522784441,208330165,1486957659,355673505,1374815316,522625192,1309923153,261902992,803751726,731006317,1508047465,1403067954,677081682,1226021543,310510544,464952126,1270371663,455060404,1668078184,1468537420,637079420,772129546,673008740,1059842112,1603472102,230808602,485628249,1649000274,233508496,793315141,1276005788,184898030,1343745099,641780489,1508779151,1267237482,41673256,178947931,843548672,635335350,23405274,1390509786,1450222368,1355823466,456998301,425698768,1281404863,1485382573,1338078553,1625036110,1760889603,330788688,1936782995,293153659,1763997013,1191307835,1829608081,1109146905,385045236,669406941,552494391,1612362770,806740783,810772529,959729543,1204258839,1444259989,143743020,1728980088,365463401,921022451,689573939,1025328626,727485748,1636214736,534221723,1248929587,1496472563,1683704172,57855851,1955094403,1540640070,1598995239,1731568966,1463558526,1362858582,1627217723,882763755,340649799,448111399,1979816048,1135664061,245057592,1277221964,738773742,1179192874,1756778647,1110470241,1404682575,442020199,1292764173,502272744,389110066,1988244380,636159444,483036370,1567836222,1829994412,1803026892,1300688183,1904201421,1873292803,832896479,1867359757,1361617991,1853338378,784769165,168646292,786403645,960806962,1517241253,76314876,338195249,399989072,1077631060,1602273527,1867515885,349860318,1165293116,428523768,1581426532,591609942,657214194,1841461301,538871908,973426761,910956279,1138444327,1163616632,623067596,1760496091,1763016520,278451448,1430039844,1944997985,632313147,1091405932,467114647,73374839,1025657067,1695939398,1262915234,1631581130,116301161,1586230135,994951533,1386272071,556388776,1143291710,46861785,1892047093,109838876,980090962,704755869,1799768954,1605406803,428092636,496039120,1127715553,1576530245,1638940701,1501452947,1804920005,1446289344,1905539625,1915604742,1294238528,1571477756,639440667,911288497,774685215,1169571542,482117120,214984654,1546815058,1626863339,1940383164,678036519,2004646868,1298191773,435395185,1184104921,1568473464,816707493,1386406381,5182892,1251851034,1077409021,1033534684,1467402190,280141143,579054676,212845795,648050893,898477349,759041019,386384708,359698488,1225785879,1878282457,44856857,258683575,1882655895,179048573,1842151004,1752196235,1400729835,1121176180,1863554204,1782681611,1344485496,1134715619,508938616,1535388793,888412546,494050220,772501347,1848913131,1520495726,38768987,460554536,1739853517,978270104,978270104,978270104,730280867,31683332,1932545956,1104535864,996614744,1174453780,261404269,1950374193,841754025,683826477,557587943,1732104849,1885930652,1423872607,711323912,1153714987,1232853001,478091064,633406107,911970326,752646272,1553856617,722140356,1692270711,1859289269,1196135855,1373276694,1301961558,1063481513,1408614361,1047053971,928078997,194625266,87144337,532869069,1219059730,1423005395,1590350278,158019242,544633360,314193634,307483788,992343730,1593403773,1605406803,825948634,1558711929,1943701899,596100192,1769313839,1954912211,248917340,1454697761,786214613,275130384,907420784,1761561448,1500685423,652441159,776159315,907599837,456238905,255062353,316586395,37038132,755103845,657971199,937103644,12976244,1429243259,1736461789,1374967825,1229843061,1016476986,1751537301,56632288,692095379,1021672526,818028762,1993579068,1438121578,798359506,1923940265,10604842,1449453226,1886204909,791452678,1792742596,1085924105,1005485806,1999954285,1245018360,337137135,1978528081,1577023502,1139898311,305278851,1162016651,792985780,1878019685,1080438099,919611238,275462094,473167026,736869191,1822852651,1622919714,1471859973,165314916,1572970876,1185220618,1421840609,893502409,1572663156,1489821216,1079735421,1125908969,1469625726,1912033699,1633840740,828025176,50177131,257569207,1582661272,1338496628,1851090005,1878329039,1727415779,1973901944,679393327,1095404242,183190730,1091783944,735676047,443848257,1860324225,527318935,294086751,756248467,1715138080,300689195,1938301297,788878895,170424042,1191414231,1307667326,8674616,396719844,66255311,1297583914,179340463,1421043832,906427898,312822090,1678510643,1285371675,1813375549,22628506,769385443,904586281,1863295818,1573525960,1515723326,200502358,538406241,1848527255,1635645769,829548355,102202747,1727080350,784951886,220738046,1547074204,1287505728,660569839,876787435,1822402690,513326837,1600717528,845027641,11829908,180768310,868097028,1279574350,391535122,1216068214,1280538151,1462555979,1977920961,1149405991,293299216,121541753,173641820,525067538,1304642956,1339184380,1290452421,1111460973,376343441,617812031,1588761784,504626640,1163564251,753724283,1659188477,451830835,1915353764,1664649014,23183233,2001889542,1892554218,1752879818,475039679,1853031939,1568175793,1188365544,1717555392,60873316,6743612,334662763,1014221551,1019591589,130873054,795553545,315968134,559221128,1138147746,1727110617,628417167,814953167,1727755705,1282794138,335958034,653217059,1481257692,939193874,452208903,647070070,1616170085,1066132205,1500558619,1728836594,320022444,1223122741,1122689632,1678810465,1018101232,1505883171,433121666,1705568245,226671123,1098281177,1533160479,133924208,17888164,1264355806,1608604852,714925320,799581475,1661402297,838589584,1581515125,409699519,161988631,1947498234,1386586605,308580355,1495877242,406803641,55487793,1473216870,1167774341,174827622,537897840,1313834613,551999653,827759118,1841648173,676770839,1156616711,15618603,675966094,152410626,1599629038,744334320,1299404499,1365750150,1794291386,537063365,1954618841,1652180921,1425164115,1489826315,546871332,900876087,316850051,1830272022,871918015,992792974,1278641269,1994571556,1783002614,868718255,1388953485,713475844,610758279,422704394,906160849,1477589702,550681392,1591946085,1730704799,1623404069,1362180260,537264964,449564304,768958232,1330103916,163373393,802212518,1789773987,1684911326,270680410,431426012,248008968,1722334397,587495570,1689457963,1272112313,1552442713,438872074,832884568,603204273,189602792,455368719,293455983,48110791,1641795073,1560115110,1942666127,1262274805,1987580353,804064589,472247831,53675634,947998229,1020544294,175490270,1977212401,2000933944,1680155787,887767901,1004602716,544607104,1798235842,560529396,657422044,1218099405,741791649,328557201,900508969,1726278261,784649948,418045439,307502930,1269122244,573973395,239028807,1859756445,915047617,1594875922,1556754549,1182248433,1306049021,1787284785,1766979833,1069328815,437232276,1896272,363872480,874602098,1362977666,1145709428,335083058,1601550451,1152695504,1094543449,1743286971,1181444158,991218773,295600753,854247767,97990494,844075644,1802507517,271260631,263643838,578475454,2001508726,30237893,452646529,1098513562,936649271,1377560962,618087506,1922219332,1983459394,1450034517,1953842891,903574558,1132005066,1004312861,1887371247,1779439472,1489982278,784544570,1668363725,532090943,1602415339,1279744582,15516260,1766220530,586515732,1855559337,1660698935,1104677591,634324081,1874815161,1323530337,183729881,566907904,1797580527,60408067,1662170822,918761303,358432465,742577618,358809004,1745511232,650463238,522923526,1969667043,103863519,889487414,1250598317,1741267958,1149877100,609686755,467045687,1278587242,894817448,1996955798,852442358,132575386,2008449527,808509910,273384521,957519835,1223833563,1082911450,1788637557,757065681,854269764,914509011,1324209772,943215297,570894153,211272531,1825413605,559702788,1795699828,269818866,966328382,260320236,1751683388,587175084,909244075,554108780,1867776242,1395509104,742196172,1013376513,456564975,624388359,1176545107,1689792951,1730761892,1754576073,1624553490,584210785,1100154531,1156632461,30326677,15924299,476998543,270407026,505480901,677521809,1907114826,1658162432,1247210346,1774611144,1059685075,236558475,84263693,1131524679,662350669,963506248,1032406708,1606270039,392046947,756152451,186755120,925396822,427351687,743485147,1889087418,1082983619,381796304,391569721,1874614374,145444118,1272199191,1836331104,1203215545,1215050213,1077464898,1910503539,1416818045,1904534455,226134779,1780256811,337923542,1656747502,795277728,5487578,1363695539,1943289696,1716408001,1574474292,902402675,1075781777,759139633,1340751615,1054770805,1836006500,268243467,678103903,891317839,440977434,1128475418,68911783,612483429,904223637,1771448755,790483241,1497979920,658304323,1423031691,774851200,184083065,1476936232,113928655,1794286892,1391650094,1634232379,1429776950,1700199720,1448057445,1535904920,882838194,967729427,486371379,1109968370,1997360338,499831743,1874105716,1712251584,1870466380,1725829295,1736750166,869451415,1655523066,495956144,940517281,567856916,643492265,351280152,1037772104,1479506074,113519373,409455091,1639506588,217762364,412535035,316506889,1780997679,1528448988,680621143,1823050490,313504981,1142755520,1319737408,1881143586,430660893,941119829,61616254,1632432062,560265907,74657738,740520733,185374708,928021077,1039698416,1253235883,113244503,24285294,1939174671,1149058190,1842509205,484715308,1339367316,1348001124,896298756,979316859,658428804,105497571,78203929,1446675294,434116210,1886533277,920877777,1082028555,1308815167,1279538953,1049660,272267912,1681512693,334391684,1301064951,1352779423,96981964,999180521,527821101,407870628,397819496,181780553,230124048,211633033,415337557,932492831,1227441621,482892723,1770565286,1239347508,1579675883,1097274535,883240145,1492551958,883823011,1531471629,580289119,1905741950,917626251,1369018781,1207126477,1555745313,648617662,160268293,1230639065,1026502390,22952882,980326673,1761099355,452387463,1585060081,232327099,802614505,1366321183,105613571,1442077649,1112040158,1469593743,1291426845,742398448,1061294875,1773143462,1309377836,1260116000,390924618,757628447,257129844,560726741,1267414161,1363838687,101803835,1840814170,1213881899,310763091,167757222,1053265940,1040845436,140164770,638464636,605625989,938542271,1130473419,830899085,1514171703,1584527354,391789360,1932935736,642304025,1615787826,947524249,517909139,401801888,1413635563,1173269021,210874081,1521303088,167380406,1379985012,1281455953,2009686719,1582328005,69971477,287211514,647423841,855498797,1973674963,1734717286,4244147,1357274482,432885570,1013338417,672313256,1545452547,1640871741,1724566202,1470410905,1926798200,517707067,1560701031,709770394,574404545,1965919705,569023164,563624188,2009928841,1433848185,1275071577,786284348,1309857078,1593323541,306698201,1113357865,1114119935,1183566022,1689486507,497912946,365682516,1055009791,1445544845,993945510,1582997250,307162060,817164560,1738510169,365675856,669399932,809387806,334340962,1051054639,1203145269,1072537438,1565873944,875058328,340919633,361191846,1718302631,1189087511,1871549284,750563919,141840730,1372900418,1008474687,1348385411,731428779,1671471098,1790975937,1815226855,613099512,971168755,59098354,1244971829,540988307,598405226,222520056,805136399,242144531,1866267499,1595877005,482831006,598702815,1091821954,1043699908,579267357,213704814,1824428546,1183350001,604862093,572991825,4063033,235501354,1299558278,1860857204,1181056514,678506146,1537843137,1011183034,1130807358,1377173831,1111478203,12262499,1087411392,1727642976,627863982,892596225,1174111695,98278424,980837384,1496427477,566637383,1060803276,157127115,809307212,334201648,515921843,1997079877,927798425,1220669369,1101023430,887811293,1882511531,815082862,1787275183,222427280,618218634,1339033315,1016349478,481877391,867606606,751157436,648532974,1227038297,1501183778,1426081943,1264667669,900862991,1253595733,801712982,1682642755,692441058,636836864,1860703029,1050584360,317973821,1038941577,1302339035,1835229552,200182328,1970894231,1863934051,7871089,1524678073,1115653527,952149172,1034884763,1882185504,838439165,1095753003,316148780,633899743,1230224907,371315040,618355470,354001138,779967070,1148983166,193418303,1412353037,233257235,1636624304,635650368,951714942,1770885545,1817939007,115287177,320045070,729706116,161097329,611792261,1205466626,1927599295,1316856246,11782840,226120987,1100740435,24823715,672185808,288538250,983863585,1897976942,1786626294,318333969,209614279,1147712091,267423366,247184554,1614667228,1435063424,559662913,196899069,494210527,869042590,1720138604,889168278,559075909,927045112,442846639,384325595,1576426899,232220887,126779667,49228545,159961596,1946019941,1079932730,1163481892,1887043273,973449651,147900836,1438930971,1603473109,1965312174,1965312174,1965312174,1227783268,1264739354,1306176213,1620728449,1198375514,806339969,1974433433,1659459724,1025952860,209167798,254642300,200502512,1134420762,1772901190,103637126,1732841671,1528084255,1879612842,672689464,261995125,492142752,1575781318,637409517,37411998,16367559,1598324781,807126821,663447075,943761736,233692473,491462185,1478291175,69459412,201349323,292097587,1455125622,1529985512,814903366,1305137069,29773695,1008522412,433214769,892056007,1234838501,1034884763,1245529296,756736909,770346742,680056036,928698584,841779967,1634126654,1512652451,925874453,218419411,968777862,1877840370,1308844913,1360790310,1511647379,1819740265,1169181447,1675905260,92098326,720127177,1971215151,766305376,1709451095,83467101,649954523,1897961599,927724698,432059322,1165937470,581289697,579621743,173034876,9073329,1946751511,1114388462,985238027,851562231,342093010,483812475,1786788881,1478724639,920406309,1634241427,193846800,28419656,1621038381,143071626,1634798701,930885897,1430312952,1326197398,846890433,1308574740,532016739,1869419739,688102779,467153766,58438404,1344382455,82722283,521755883,368717141,407485668,1274074762,1204101125,969114700,132823441,177632528,1267592944,1246578155,205910159,993651670,1145473179,750902259,482134542,135037716,1509714005,1115584216,1860622358,367829008,484355448,1480413186,1515938810,312862256,23766964,869402499,985789913,1032841385,1676157590,1915237902,1644099602,177442861,40267322,1619908383,943546212,514506588,936992286,1709543038,691374810,293683699,1254482273,1983114810,1296223610,1638385261,1992866441,1020968227,271264256,738921443,658452558,1172922233,73325149,1028534065,421514586,1645676178,1531233244,1073003113,1789427176,467022647,1308788667,1016729719,645281253,1246526320,1766988179,1864984558,1825593712,8182567,431578726,725417690,1430791542,630080495,728132185,1739425006,1456375697,844078839,309800857,1698267660,606985144,9759549,1661286742,1602644511,1411974226,949167209,647158818,1229843983,1200742609,1610085242,900204563,853981008,496771664,1996137345,814856871,134257286,1319538535,1708466284,325412541,1811062038,1555865522,886795193,1026010608,1751845714,333469821,1501968697,599877548,811234694,955698263,334977620,1013363501,1650758459,839626434,1383370070,165576910,1510077613,631333319,1185515578,1641538846,424629286,129373664,893484539,1951177395,857251247,1054070263,1191766112,1187779146,814425884,1232518202,935447000,1435151684,1816907791,63510706,928400239,63113118,703784939,1030515666,1980656100,256225650,1313546846,1426042972,824238480,1665150540,1024771240,1495690477,1176220365,1941035420,871974788,1741493299,1338898743,1897680614,77246913,314873374,1413935708,290410695,995899380,369947412,709609758,242883046,1284245658,1178736231,1592724271,1590676025,1520570318,140438731,1820067070,916026048,426504595,1413273782,441340218,1328810487,110448110,1678902807,578289987,438504718,864963854,800992313,1024727878,1106200601,806159446,1663620876,666841212,1589829739,1375503250,1650821246,1150753433,1165711125,508589920,1766193403,548530312,410346106,137928144,1770593722,1054808993,873223414,1944169212,886426404,1895414819,1248651860,1868618762,319310960,858642074,1751655897,987051046,1274508960,973675754,445016339,1258530923,539476198,262120744,1572029225,1892409132,759638885,579285372,317127578,1496432869,1991799442,202252543,1193747032,1944781724,1407811339,577512908,694567304,277508083,1267363584,23094815,755458723,175546094,732303315,1324535318,503704765,449849607,217625027,1477845250,152370934,286679497,1510825157,837022531,1592457984,843825302,1813468588,963212737,1121982550,1605790757,1687578992,1170200867,1774634351,1038183934,1087439758,1837988612,680866228,376865235,1898706047,727337312,1883391972,1431754671,1407336958,1777941153,1814198972,790134447,141383927,69556074,1896832833,283364977,1813549504,792695909,1838851174,214136359,113968857,1633201264,1382089475,1609724108,1598311164,1113367050,1661060230,678912730,1611356353,1052956286,1590811218,364998473,1436705363,679171,1718643900,1015773661,1430059092,1552256613,32565673,1307063678,215654432,742998196,1879988349,1701075281,689034189,983893943,70008495,1851238839,1280445539,1045069848,292242517,1684779900,712722863,1877184632,1136191418,345697601,413178203,625952130,1737934274,1536692525,990016675,255223762,735353885,1666149262,732311462,1045767521,838326904,1584793082,2003236201,1820583553,319577329,556530251,164469646,1400622697,22535077,1964852937,1617985569,1040413462,879605091,1016175089,1452860220,550791672,124509760,1413077952,522411508,297385543,1567110337,852018583,1491432084,39666485,907699888,1224076038,318444960,670459700,1933081126,908492003,1998336866,410356792,77071149,1958301332,639827090,432891301,425636436,811098095,185093669,1706862302,1475526907,263549281,1092631212,1199029933,329083496,228096814,930379310,1798604042,334398745,1711692597,356351024,1784413037,162748736,1146730596,320859007,1342641235,1724409248,996618704,560938261,1645314832,1460086586,1582733675,281045061,139734791,1981667321,221040714,1329287616,1497276978,1124028175,220115679,561235457,1476272196,1627919513,1674048493,506827503,163387350,258168240,329282478,1605494083,1690308518,1050957840,1236949706,1106780450,380254776,1840016003,1931651569,921424462,841756646,346287782,324203609,1954157817,1100723315,1015191343,1422403464,1496656819,1824981368,1732197576,40374814,33410180,907895206,1028103416,20842482,1919685719,689702901,508509297,1993490797,851288131,1492293159,470156632,1070680512,2003593053,478222120,1207107297,1482843296,1059421332,1624552391,413777216,2004442556,150485478,284221665,767078629,167344058,1923327357,1793655044,1421873654,634139152,586550816,1059372551,1770079804,200782817,1542335994,1766476642,852531216,1708983879,1938659266,923458782,1093402076,410320691,1880441077,1605091359,1646250019,1743054132,1888800340,337139019,1935969741,1700903109,664865228,1092920879,356524897,515580496,155152818,194393503,971516526,1066119819,872339132,556134675,352319232,1025527102,1765670339,327126417,1115446667,1392435057,1439347885,1001518736,1946042770,1006571021,710424634,283183231,519587593,1053303419,48980431,1547501481,1685311108,620597471,583287502,283021364,1201110782,1216227704,765982840,582781427,83408469,1469566902,1196790182,544807654,1672005,1215863571,931283472,1653775051,806911827,1223297957,1627156986,753264731,716935204,1270362397,449154202,230615179,861571932,112757531,682791429,1665617116,2010207394,432432909,1475385945,160250040,27067228,1849543720,1202406830,1706974794,295502705,724765204,263273348,965616755,1857064425,428862757,165971736,28529808,754492970,1842236972,1090615231,508980466,1384226580,2003826674,767731403,1079976522,1878197589,500176207,1543314707,56194105,1192643186,1155947582,1380436300,1690828788,1745409366,187614004,1685237350,85220073,258674946,1645592590,1196604995,1039294490,534507401,560041200,1660202064,1509761262,787302355,26229205,1557777755,1931510656,1254642879,273291547,86034314,485598475,1077986526,1937406098,925702284,792813107,427187537,681658058,461075939,673601173,430971366,860488565,1321264730,1996768469,582557840,163167119,1168933870,1659720122,713712301,23948896,1762854036,1175570868,1381606429,58893289,461413221,871477190,708475547,1713940503,1842775991,1098694665,493468337,857585210,953480957,190600890,2001340694,1452144023,999886956,1784891202,1782273477,595537659,1291847249,1809097097,1195561887,475333210,1770740023,339892424,1424311282,177909737,665762804,121825428,655747566,1263167413,221169280,850876844,1752575875,1990890268,676710994,1368636865,1552684490,485610985,258519433,1442434214,1772110319,1766050897,1592117413,953628930,78393242,1040577329,1636251624,263383676,1524122797,82684517,1830991736,143314679,1703438176,1859860349,1359241138,664348679,1974464592,1384833045,1423400313,884763778,642718395,1259302494,1248968310,200215127,1206534657,1629889315,221654719,1146645119,1796458830,1977620513,1716005229,1881886432,344239829,1014674933,741989961,817195871,1315864569,566501134,933031180,550497055,434186827,39085548,1236101832,769467197,539654226,962120996,1716603866,1261232655,320914233,1859848356,1690485418,1633679172,254128373,734872561,912186430,1668651432,1748161982,1603807217,1129679255,151470672,1756842406,1075478262,440268770,133648685,1559675237,1814960791,591705512,612206433,320540847,1309467840,1378574471,268523780,48655561,31384309,1880644077,896153883,62200104,512608811,1388284380,1011740531,1455165123,1791454035,592902263,1247742163,1824282049,814745368,1775368753,275354212,1708891124,507297937,572663471,835482940,1323453965,1549574426,655527032,1513246677,297280923,1645576232,357942920,1795144552,364439814,1958873575,738854259,1863819306,1557305488,1689989707,354063693,1105415744,579366220,1747228764,222291148,1031027007,213351146,28039919,2002231225,428628351,977917725,1943634615,522224018,1862955396,329871860,234008243,750583488,114182445,624250666,1566284331,985637073,1599617197,528536605,364838405,1530697195,1394204789,1857418478,1086629915,541522221,225302895,5515156,1941117939,1018293006,274061717,1839844105,491934633,1820058429,1619421463,1553510676,328127364,1251011577,68713477,1188127615,18303052,1687685687,1023912958,731215377,1629147734,1186871140,1846356399,1004365849,1422415550,1881004043,1177784618,1309029180,668420984,1393166094,1155698792,738863619,1872493066,191381350,1083237536,668427341,530434906,1724048236,1486164917,797619302,1827659121,304294527,1057183027,781498328,1919797407,762069634,507862701,770555382,1293663833,1403533673,259302220,1612606741,472443803,2002907835,480001743,1603747251,1958606981,1146530331,629777344,1808679426,1686240934,155129489,1015314598,1073869997,670975175,1248318485,828456017,1243159339,1019124512,551603231,1776104796,1237477502,94468068,911236594,1505421168,370174249,560696760,689261848,1523375246,54845816,969311457,1450495578,50898831,1055461635,745892014,1732404059,1732404059,1732404059,1783269905,71783722,901452054,875651421,763011314,409122573,1748270157,835583346,826217425,1161845111,1253407072,1940566291,1294381881,186130292,1930477446,1390800347,795674540,1424265861,896563173,760890782,784440885,96193142,905790872,1580126822,993133454,802985833,976657114,696598302,399853949,1824454849,617411923,118211433,1990388780,1314840953,1318432533,304821024,243852218,1664471099,1534943988,1088708059,1232669516,271268815,1218506533,1332256038,1023912958,981823625,604756458,1534800494,1233063995,411974764,792569115,1919181299,486491770,892287879,488988245,1276823444,260706925,1276392843,1070589825,921521418,1265276000,1811310456,847910103,474051559,1004839588,194168422,215014677,1910334,1474062777,721428370,890298123,1846262568,1848394459,1058571661,576519355,67929277,1786661733,856113126,1116556441,1975751690,1655394027,735021810,1558209072,1229985392,353929368,1845669250,750601365,1769639937,1249053212,1144248944,127261456,140596387,585714321,602269813,165326722,771542411,1736094442,980039323,1619128889,160709495,88657453,1170793827,142613832,705530926,451134448,688341471,107591777,1641862039,1731591176,1826377137,1048063785,915285184,817726929,1317414215,1180371001,1304598422,1971887008,1750371409,176382673,730107963,1844101739,633431016,701576964,303936081,707300456,930920938,72006394,436108045,1914378019,60707720,237448142,1709393426,1417088379,1553230226,1804168838,1408818937,1414776735,873423362,1073193709,219431793,339417175,749779242,929227086,1166423202,690436320,388988344,872558667,1063689866,1989493280,1091210054,1123679611,13483935,794386230,1164096316,331357828,269277165,173635101,840125041,210672086,611297578,1829466718,636901453,630737288,452751604,1725411874,552343144,1040860251,286175405,1413958484,1431935164,572966475,1409014070,1354987577,1621281775,906728585,1596565732,1409065559,311849043,1710411705,1755426754,971610500,481369696,627987788,913210756,66225121,1573285273,591518950,1297073540,55152117,178026772,1895535468,548473826,753369755,1544024898,764942750,668546647,1769315027,940344862,358354682,734238949,1629813869,445936510,1675008096,369851537,1558238470,1610703816,111971317,464245005,1418339445,1819164618,1700365312,638155645,657638860,1799772857,1812844697,1704281003,780681893,977461189,159235927,267607846,1868940240,339202467,128775973,1822520411,1948776606,1754546571,506087035,651211802,1981740879,1289299821,593081704,1320238815,1810938437,1432907056,1198574183,1178861262,42060932,170253470,361901311,1719312588,1287532491,1452361408,941651960,1823615460,1467476039,1650984962,251611692,715563267,1861526046,544312895,663003596,1679397386,102768601,761659062,230216638,979791180,1123097368,790263603,1616383300,1400363284,195847862,35310888,1149562197,1546784079,615547039,1537294281,641866080,1328685231,1651821410,304841278,1915233513,1222639362,175446977,27932138,28585553,1172781778,1592493846,844236071,558140637,1599939125,367828212,161116500,335121349,1559562305,387321118,1419106508,585189647,589212032,1227774468,956730452,472304761,86434573,676543211,1356551484,785325882,488829638,1638967882,1332770546,42787665,524408648,1980493280,115321121,694253092,220653653,1667726780,206441050,885767304,1635643316,1002472700,1697850491,980988393,1443246660,1636635455,1438969096,1814077248,694396522,1661522679,669841484,1903675897,1910116938,1365475403,1441566708,1651797756,1504774258,1673309616,989897498,1794505148,444821526,1934941729,641326924,1542280854,1877919012,466096700,1181006856,378940407,157929543,496838840,599756825,211822440,1554431195,2003272564,714312110,425435391,1187064263,1029367814,1881219617,748414042,1456947511,614404569,518408885,561966560,553706513,1786414382,365788465,616118167,941537045,1143449926,72215885,1858917048,1085544353,1181344524,1321596226,1820318834,244411818,110725833,1582932226,1600222739,1234000550,428667138,665891861,1504892197,1154258339,1510990640,40690863,1180768256,1775740488,740288346,75415798,1951009502,1945178410,1223144335,1208755524,118580560,163671258,1382753543,1441385877,1151348674,1370993169,246315149,861813422,1160917338,1629645868,1355818648,1851902618,1268755918,918385257,275023572,1461193832,907920707,1870115572,1133520031,1266477505,1620303926,690694463,401086106,1975425825,1687983316,967718785,571660688,608380352,1393164218,856239314,185541498,1742170885,1603605714,514689330,1066348362,1758383386,1348650658,687918348,1201142411,734363140,287460872,1840964343,1046790702,1776321408,993497837,302086470,557324178,1681269794,1526747781,340783290,1218263781,1097868180,1023732554,731548464,138051975,1770625,1783684490,570096308,775494536,1650159290,716221272,1407759352,609071004,186249537,1833373590,1997982690,1068692651,658461944,1233273457,983114426,204310551,1059504948,1640787357,652542033,562395914,1607735074,1225857893,821412543,1915191594,1358550937,231127661,1378891474,671783305,1986498979,249174858,608449796,511398978,1397165893,1267115990,1143817274,575821183,761232075,1856928490,746792067,92159901,350305035,217653837,319073544,851901578,1265853713,1076717729,77211575,814284511,1486673976,803036708,1882661373,1869875895,251961884,233121945,1374662899,886900662,1661986075,433546173,1321971288,41563064,440732361,784121843,1850490580,1600133024,1008849596,86151410,70340145,631176603,246548385,206376237,1074215666,1382563913,399732546,834992499,120338793,1047284116,206981200,840055676,1287551513,688924583,1275813076,2008386438,532870415,1223542543,455371284,1057390704,1450485664,1064656624,262179050,285369793,1001071927,559862818,857134820,1910287423,1873171923,669282766,499416961,331637388,1963963727,1926254394,1364609358,1471502052,1908650109,607000441,1840161993,1554590527,208996051,1435741071,87100900,1672848840,1050870501,1525487097,1500101043,286175745,1865840468,794067318,1725671108,172107849,1056021204,1001386380,827621760,1347879610,546812281,732887976,1633615890,1743676397,1483151834,578875860,609997440,617274280,1246545123,1443205283,1727561867,422460863,219161980,1083416758,1967869829,926922260,15564377,1675734008,447864072,697338881,1260869699,859178635,975258374,1430432484,1678278334,495782479,416514192,1049371373,539311138,24007417,152048954,135948188,362609772,1600394848,229145581,1616726649,250652586,509783179,1780931313,764429223,812664450,854681744,1309383966,66711038,1036015188,482994672,1153113236,716966085,964247853,693811235,1992119715,993970465,60671726,941611001,1847331329,250155647,1722317694,1893412694,202582381,1877752089,627370021,799796975,1536535328,541455605,725062190,1788620220,288721520,76909526,1150805527,1469361202,552579399,255478917,1186325001,17313097,1607008194,504967458,1610866685,1786528844,1890727767,806711822,1981777014,1743520746,89975025,1636785899,784802202,1211050533,1302342436,1863205410,1023080858,1824600885,532679935,1833289858,7679427,706460158,1833928206,1502409669,839731258,915863904,1670439667,1477576926,590635989,1146890670,160444050,1177332212,2249065,12099203,1214786971,1689001793,881083458,1900119160,51194945,1174701505,1813479544,925534603,1016692009,427066857,63218615,126297556,151875797,1213581695,394052773,139289781,1378007676,1345325317,1868259541,716503857,370322962,929241636,1969599742,1028525459,222163259,1454975694,121845546,1756534254,69542102,1090977627,1063493866,386949940,30676270,345922401,1578336306,1379839197,1201534352,1362739388,1856381330,1970206374,952113439,537031363,471607696,1241130472,965712896,1886389116,1266472320,1835430883,1275779626,520891345,416306588,1518216918,250090049,1654922241,666757980,21732132,117196365,1297186946,811052859,1455913316,1643837428,1151269054,149404007,572273286,1749113235,1952018044,265141626,606101521,1211351177,666826163,624029139,694550757,715496899,679225829,962698607,856929542,1593683885,1392269079,505472393,1974111153,801311428,1953013455,266357530,981470495,1468490226,715802896,195209160,1286000522,651330441,1216194715,223028820,880711843,330891826,1506100174,1888025189,76756742,1320990022,1560703892,1971906965,1177187603,167968765,1434958958,293299807,286500092,701609309,1815615900,725615339,1694224615,1880563755,1821925671,1729718422,1205604386,1158243669,633843213,101154062,1093854826,1510523877,1881570078,1317834918,1615619020,1892593470,305673757,1612809279,1796533048,10564480,86054115,1664822937,1816275528,1958513141,399298258,972095121,44384228,16511986,1345798991,1088349221,1677691250,620305215,1902480384,1919374746,1248266375,744595525,233955122,249740722,1811700134,1630012237,276401209,1074551409,685150183,51836860,1335619069,150456068,1178954108,1798801482,80426047,418189614,1957978935,1778287856,520356810,743374194,151399182,1178656163,1447724609,857252362,1879304709,802255265,922905793,1136545726,1245149066,551692405,1654822772,1288601368,497584460,967643308,1709908734,1575672618,1296615159,1238065935,1546969312,1590756230,987435648,1841652255,1052415858,1482290633,603483956,1409537297,1365019342,1739846438,1523644693,823399343,794977498,1545227157,931191991,1103743918,1793124467,1389855585,664848180,561021427,1530834691,903899928,1204681132,325070810,724225645,573143326,927732159,337307643,1849244459,421349436,1907186926,835299474,207116056,806510807,1068903203,1618203317,256516566,1982949222,524299183,746168451,971428890,548150163,1612672626,1439208380,22423577,151911103,1399772185,1350474675,203644281,1710165516,1653610934,1300184514,556377250,125515250,1700418121,1933824056,615703793,424771208,2007142444,1337637287,1969088687,545064454,1020367660,1287681307,1957850837,1924602840,391965114,148563713,1475516136,35082831,826703225,584263563,759891489,1108173574,1411054172,554921196,1548264301,297676423,1551118944,1073727892,250152396,393046968,771179808,1212282613,1229547290,957508141,1533699816,177163632,1262434618,1102973479,1330459939,869394999,80481903,1974740120,1098353878,190993603,889433062,907827821,1513021085,68345332,1382169273,938230947,1032955446,1262268677,1262268677,1262268677,1654372775,1830333421,1171952821,354235130,1288914240,903962796,1887101863,1285188237,1652703403,1012649833,555960921,1726780283,1395334336,1527207696,198104221,1209212528,155361294,1117942263,404299991,106521833,557591066,1964096215,882221546,32507564,872533233,17850946,1573441721,1438534677,859316445,1529011912,167387810,119144299,970517616,1482272493,951000351,508031525,1934629499,423736189,203299441,373925503,1744456664,870226792,985071752,1133884936,256516566,372710203,1340060286,1890598099,1007980804,1322156901,1219900695,1473509721,683721971,82928481,1238534720,644967426,628200649,955666536,104719362,979674809,350885759,1593384875,1068500597,1263808186,1696384173,1973489109,395098065,1259466973,153985061,335860036,1499538055,1990274208,1091125527,155168832,803091175,883224427,684769165,1956578072,124635592,800770046,172240838,735876139,975935268,1536822438,675248221,1578364761,1384024157,1582035068,935570283,1295712108,464409983,1124383562,818567105,436728069,1559433398,583055708,14396566,817443190,653805653,1492445819,575631787,8641308,1480222934,1436915087,1595251180,213564950,1743056910,1637812755,680826064,1785823746,664441571,658445779,2004060525,879747361,1631335367,1829875599,451688595,1951530579,303651957,486616062,1194120071,1600004812,401772035,1187777265,1772808862,1182074248,1929901523,865507503,1569410783,951530541,1607703058,189826466,1056164996,1665140059,1696882701,1011213633,77656882,374329903,492589411,194084660,326987344,4637880,1999687309,1607297747,1409981162,1362153986,1568522910,1596186464,1183129791,1236918662,985999039,356610014,1204974599,719101258,742975476,1827629028,837939607,71584106,1192789525,1494608166,294818972,1375055846,782479640,1966487337,576262677,799948334,140818041,536041961,1505049830,343793658,1404521119,227104221,347526611,224967263,1304471811,1791541751,1585547864,2012494664,397829382,180962495,1810910274,1008926621,156088158,451440641,297856000,593174070,629055661,920506187,1371646183,438682231,1466979297,379901405,805402100,928177571,1465790581,1461496339,1743147812,1413787039,811239115,306760450,1065680409,511667800,397547131,1462817246,668286986,348299053,29985009,978598316,731292480,1705880899,1918501344,888911964,1094890835,1757244397,1455091377,37396283,169529524,13338181,1920192138,1668650075,1115245493,800999024,908123447,397321588,996680743,1644636741,106044785,362759237,1631241856,925343942,222361439,670892397,33013295,1134350221,1701263278,1243751774,1586357972,2012521614,1972710989,651027174,833158608,117527492,747564842,198246865,1453106068,531896502,1753875172,1219869284,497523625,1448520157,1424577104,418538081,1349744734,1955938460,1034409110,755262970,766164836,1594027760,1959997419,765995697,1364421864,859226555,1335478388,191744103,1629115501,746449540,1088012873,1657945015,1459707499,630891845,375579498,396756611,124049197,839830024,941513316,1140316958,163680595,686370736,106975264,977085867,1028559270,283619059,1386629477,376015818,1899494524,197842344,674308900,25590234,278133964,1715321549,1484895873,132674296,1148235914,1995972884,1263381304,1686111390,107971873,1243504384,1462372075,1632333863,1418580546,1541752889,193810675,1362537620,992753708,1126280527,1067001269,1784206210,1719856336,1427059135,125059530,865829644,1010862786,1729018277,1440914168,1088204064,552122413,1283191295,56115071,778916258,1794799166,55947800,939248026,491844807,1719746426,148242247,692004992,1796355891,1409315512,1928322315,1946525101,248383597,1774194940,91224186,1438801274,969824466,553328826,1358823360,871612532,443658606,1325928276,827687079,1056305687,1680436433,494985679,1184914215,30178099,1262620420,1513169575,154511254,266646674,1211219432,1667021620,507671391,461080090,1190876594,1185675080,569412026,579167181,1124612232,1112080415,1740492835,50180249,1227732984,383522638,884150104,1960188944,538674085,998451553,696557043,554976936,917282311,309240866,1007998095,1835465844,365568519,1608000713,1854442403,1385705943,1115541206,1912036598,1678701274,1008409087,59986209,471905581,1505345481,879642895,1933226482,1187932839,1420884582,1585636382,1900543468,1138107324,1636681876,1218540240,1214655135,815241461,891987635,1535765657,1095304764,1126399747,1365206519,1483054498,1871968241,1949192731,1344941864,1140232377,1120265817,591972543,1240577481,441407671,717301173,1830632250,1608730944,1874182886,1801496768,1771561228,1616095181,1280633490,988672540,1992626465,1215417424,330626713,512242699,18294098,1271880311,536267957,878913787,1068739770,891788717,494964497,1285702258,1602605668,1357507667,1706641288,1354546654,1873494097,939424874,1339922483,351270473,574015856,1001173395,1368842775,1225405295,1325151796,960129243,1636673088,1259001356,473415101,1493033751,1730157027,980179567,755045973,1611664098,958133266,1427467075,1484456545,373798796,132532244,610255036,806582609,767220132,301852550,273130819,1056170470,736278278,984496815,1883767625,1648404589,1765394267,572704275,1522584475,950413341,806037387,316254957,1362386873,1562364984,1092849648,749130215,1596938294,338165938,170809295,517131034,609329131,1142875422,1384206640,481109506,115184794,880335592,223128509,234873173,1787959,1408525482,1064508867,1694343013,192877619,1365372879,1317137037,1992476263,1247891199,1690922674,733739805,991054146,1555775227,1407620613,1760730788,747590496,1346189476,133195690,753843295,1120827546,1290669751,150523286,82909480,494966873,649964339,1744098230,1341888537,854487095,593113726,1299205005,655511207,208291054,1938005351,1761117303,563648360,725527498,1369545771,1606079810,343170466,1111795014,1175687892,965614115,1748945860,36323238,1263734850,1537651346,650075438,194666582,1933720446,677590570,1849762178,1651244461,1639347176,1932947790,1437000212,1652018434,965213319,887561921,1010959978,366153738,625261388,272947826,244471461,1435297483,540805301,2008004743,681280081,1439679771,1718868570,1752866980,42012975,1963772790,1147584371,1459988011,652302195,1456057241,258842429,863566745,578402543,637881768,865797686,19537244,1363655902,668038415,394850291,1704309520,851630797,408465556,844740051,252623106,1689821569,739450927,1690700580,305765509,795209017,1162037852,43098541,1611974226,851992547,1175780813,21772875,966377120,2008956632,1756962747,212182701,1156355329,877183007,1107128082,1256476675,1623624194,80332013,190482842,1148483073,630144741,1172309632,528158325,304968715,900191764,674891537,1138572650,745322348,1068537102,550854553,54550083,1226337244,922690531,1645988035,1638285692,1737619906,1883949124,1593894335,276037337,506198168,1343572994,1320496198,998165061,498991958,1558431249,1885341824,564934589,169933720,156466255,1873041616,1166594848,806670130,17344247,535733743,1236213392,12503065,1820146545,296843363,205429427,1012364697,871680958,1546011554,6256658,848875226,1657156499,1227688024,805721383,460512634,1044734947,941032581,1354657024,50330606,817348796,109844198,1785113365,1310969472,452018257,675522168,1048224889,1910518685,103497070,1552072151,482960194,394908985,495169264,1256091124,323359160,1368038164,465829931,794395276,886591472,1888677043,854546175,230659410,23277589,1308833078,498934227,545324096,1725096674,345562740,258924709,823731360,737281516,875372643,1097441463,641976004,1451154624,296446373,455174404,556633255,8878646,1326129633,72322532,338608507,1338693336,1755530794,1861924205,1539110122,908049239,617413854,1789870738,1580230140,382659987,439445461,1470394752,1134984571,1580471382,880032014,475193607,1914045299,1720959160,922825565,1589575158,756057966,1120424008,1313828424,997131729,1442279824,1467364978,147653589,984844294,247144423,1192867319,1597947307,614599747,274800927,1618207789,753315450,1927250831,1642870074,935276214,309816979,499780060,1393355221,1357754611,1361602208,907644692,1934366986,1135082165,1001705836,303953183,1643720007,1880610076,112763119,1294759675,8861339,1976829983,267668046,1641360759,462029618,1355254846,1364107243,1780312021,324098739,1921706365,1261726769,340241584,490860216,535575105,776068044,1725131077,1396803461,1906460669,745013636,10588,384579283,1513293917,1858961355,1748853200,1509119101,1116111302,113392936,1207428517,1079152007,1931170018,840095677,1968971303,100107466,30080596,1334668819,1400181801,82320595,1435949012,175299009,1719224626,1852324795,1646700736,165736231,303446471,1818156114,1933410911,1701975402,305115328,1577097603,1745219988,1805509054,548197965,1483914949,1897474541,1247477307,360022561,1016961369,1718473587,931360706,1235831179,769996086,1495945684,397691288,1516722363,842424325,429388054,1117865866,1431378469,1500987453,930420000,1753808212,1925425543,1037480059,1528640357,1125627358,1773294304,1908041437,1398810640,301351810,2394128,558948811,209632522,1137622209,1664152896,1612628858,1675441890,1309855481,1937796838,712088044,1117217691,1127534082,1208975080,1257470439,1568230233,1068502462,1227391349,1301024512,117066092,1874755703,1493776219,1301628701,1674228233,704323475,1811528828,1740861862,1560421474,526477431,362330329,721005638,550313521,1068261443,10365095,1137381677,1144599479,1089898119,1323957880,441771682,1746435863,1008942815,672089746,624264335,1854345224,720224273,63873223,170651743,868171422,1672351938,952178876,1648155826,971357626,600745331,1491617975,1069454521,1187548903,273820539,792674429,509400516,711635223,1600747290,364143796,419425851,1044810221,1531949640,231702176,1311431846,552475190,849506911,1950358227,428965840,256446366,1484880448,540010959,211706207,1956171251,758795751,69729995,493454934,24112686,1740418640,460469593,637514854,605449691,371838002,988845367,925408523,900558927,1958203369,258144798,58189254,869105343,1754479817,718389748,289383084,661925341,797896062,711220821,330311021,2000395313,1377997690,1095849411,121628173,1804801915,1125837327,742982785,1910975941,1376593838,252619131,214543422,1463059955,51653133,247663372,1170552913,210907184,1858322825,681892454,1376732877,1273700323,1273700323,1273700323,604948466,76717752,1812650551,1691985777,1567357185,1532176099,1354363959,67408880,436863684,357649965,1737353043,682132129,1703326015,1278172452,248907336,1280812813,830520713,825580782,1634444353,734113099,226583344,1812365470,816350178,1523322403,743932544,1701765644,69110160,1290004180,849210062,409407465,330970668,1716016613,637519780,1187760120,1043404988,1530970771,861720207,526875555,1175395779,86366440,273383342,646702852,949995979,1650782608,971357626,1903979602,1391794641,1645809825,1929178175,800462352,939214734,539951788,266394478,902353547,421600062,232252224,1237940546,284577159,1662780052,684967247,331539833,1944420612,1173979822,307611428,1515436631,1618014173,719160251,300058578,1068056326,472776412,441517387,1003131097,1271196524,640230917,1984157493,1573865704,960564501,1891588931,1636207290,1629825316,60286047,546517638,1755387754,55719714,643085034,1115657469,465070167,598632953,1455756474,743708997,724244649,1307737523,1112839102,157078678,1808368476,1368491616,1189346576,1784090554,562325358,1014803806,1209641078,1206587838,1555855509,929456073,1828298074,329008167,1175053951,1374397287,793148044,288360659,1033619281,917966355,182841658,1088388085,44997785,1091203253,1428074282,259993545,201488359,1148524363,1923751753,1477984331,922715873,266363803,1187820682,1664271327,1788479490,846529684,1646313153,1532044267,722998527,1197242397,916275682,701269042,1558234285,1202531959,1371010501,1790498139,1230198925,1509156460,1471270264,657278500,493458413,1842985108,109314668,1832050294,132463227,1148602557,1278999650,1332016318,1989047837,1469283339,602504149,1559351393,1212776382,158342229,1549364239,1650342740,124988452,1077719372,281935358,1871566377,1882978706,3866569,1650289295,1579749345,457071063,848737967,925502246,1407983912,628685415,1470063033,1416660111,1337261081,823588831,646478885,1689649599,1942886813,294857149,1569175005,87403067,1926313778,1167533961,1432729534,389479653,1347933577,1099641606,331569959,1269550712,550892625,226368151,1438635562,1513514832,550226702,894961109,1653462058,1413788196,31389885,476980351,627918721,1060938890,349346262,667027857,596284642,457902196,1756858844,312820163,284247444,964952265,952661825,1261469684,1002950027,1278140711,1771776862,1337810226,190500443,739883105,493004793,1764592967,1270056280,507306396,651864157,1356240297,138398958,58185054,154833370,222716917,1550113157,1807572551,725874383,1997619929,1849873395,502836367,317876206,173304158,1861479454,1798775817,76268396,887903412,1235221105,1150861111,538178320,1859635640,1257523237,442173321,1100439727,796405013,154949585,1798023275,704580089,571324040,216075320,927332706,1676633119,1971714081,578670280,1524885644,1781548512,725398028,1495098984,769818988,1004201220,1131661342,586850863,1415247604,1095774165,221536118,568654131,1319183708,339042978,1601987333,1380729339,189049339,1094468971,920526243,1258421493,878715338,551945551,1112948817,734410647,1225109349,1589754168,1970938914,324366369,401451730,1308902553,100735858,12503044,405694002,252649253,16653954,69742755,354832333,307987654,1371014791,1256816283,1097533263,1392244353,1648997525,645190150,459001846,1348888312,1266265629,1743240091,277423786,2007452060,1754463839,427766990,502695958,1609361242,1115920877,521786739,1745581745,992119431,801279885,651739603,1042658885,154082499,679313953,119244752,1743631575,1517262412,1495903708,497150488,191284359,514386538,1924922525,1392907888,513135197,295426524,1232396443,42667885,1616246121,1659753613,1953843067,1975485178,982396809,1040827322,112117587,806528589,184740463,709656867,1204254369,1915264955,1170447019,253247468,736957053,966403873,1668227411,1902698286,1638890192,410568166,1253347777,1991708064,1225752363,1057473639,662159288,1707305412,20393409,1931615180,1576069915,1882664167,1130152219,791525177,1619726436,202394864,1498110738,670293454,1571862605,738034431,1240413857,1084336985,1577650568,464164649,39743007,25133538,164310499,1476857078,1669686411,1098302936,576510496,465926642,125292146,77194339,1196584883,714985043,1518122069,1356781480,1082455368,755748598,942814485,1215091327,179744883,1598612463,1140801458,72196194,1033956445,237635033,258520312,1562888978,931209002,812599713,1849084839,152860807,320332935,1639849158,700306043,1689127583,702466136,1575898542,1674842552,1543463386,309241129,871566373,209528573,1071085471,1506501199,252611247,1382368858,1840349134,307272156,290098352,18204191,1550101808,822586109,1255392607,619741187,114992804,1230455245,242321638,1608243212,1151427118,345969343,1276688968,501394907,1934018275,705005824,493900124,1735890406,261617890,1746926692,280439299,1382187418,1047979393,1092124785,895162292,615986880,221220153,1715454768,109950275,83356036,1001045718,302697047,1674707880,1903622906,1144646960,1193215751,1521293705,455682541,421918261,1421071346,599925642,1947902286,1090807969,1515497746,161464624,825647433,403508260,329427688,1824534685,1800435420,15745508,1719297248,618726645,1011038522,1822652592,1680156032,1108198041,714700265,48659713,1762680678,603677682,306397324,727429997,1016857536,1796685582,1538884494,418741880,865330138,1996193770,1052506111,1417644014,1528843242,214061084,1449388675,1550650022,291353735,443355987,908643002,407212184,1844211399,562968199,823605484,1066613872,194649644,1608308482,1055031504,1359523447,1291135761,1034528073,1651324377,1494523986,1360459594,772031364,56788651,844325866,287702101,1313220984,1520994889,1023787964,709103926,620463342,876483134,188771745,1759394055,1094243831,305096666,941352652,889830395,442361903,75642235,764820812,1085204557,1421796223,1072836230,1716623343,783823612,75347468,830892478,1862452800,1676094452,491714658,61700029,1039251435,253098748,1074625007,603709326,62012478,1216734282,769663781,755878527,633576996,399395488,219944120,273118926,707026273,1626569531,474178279,601359223,969637552,1248480531,1081080940,732139226,742034418,36861217,1615634563,1019460988,1642526190,325637940,443128661,1979429440,688398934,1783680195,324188471,485512637,233913640,804155744,869165622,1113381140,286669847,1080874631,424767794,1578644662,1273019493,1402042168,1761031689,275022199,1769430623,1183369929,2012279552,139997636,300785808,432379420,875650871,1173823760,543762362,113198929,697221232,656733822,1526256921,706306852,984929400,1407903815,1613735668,1797686350,635443841,1187683619,588583444,524231542,1830968764,1037334226,811371284,234351835,1006336733,470525088,1543314,1267405584,1914668024,520062127,1098513748,436001983,1286805132,1518289798,899622280,1482137217,1795240456,1362107539,196058325,1083910744,906837772,336821518,1846852839,1342673831,1109187426,2012300786,759842891,1584222995,1433158770,1617744708,1677236265,24394819,899524114,1889617811,1583490588,1760010104,1100831807,1698982874,1599672467,1047056131,1411768021,672750289,841867146,83551974,106587663,1367788076,1661068845,1816787844,374800348,91689084,26473113,308492991,679106964,1131290599,1678519203,885803590,1689457036,899191602,161250255,1560822696,543859519,1920071145,319803730,1858777867,1996912072,1337856326,293315341,1824981528,459431055,303959567,118660099,1856160621,144640125,1938873046,1885216741,1274523271,1060319295,1265855505,1842955115,21101887,1333966596,1987136505,301695144,1931734177,1078217863,1824808129,42249541,1175357623,408298779,633948467,612065918,342298433,1456329233,541486171,1574030757,1079972447,1319596271,1234801201,1778430457,185820845,329063196,257997320,407594912,1419780561,1430423237,19356354,1084911455,270806637,877533837,1293164963,1215839926,1600657988,211983570,1810731393,1165270401,905265331,838435440,510103828,1311509579,1318792881,1961622047,191036570,796792084,1098146887,400198801,685427746,541307942,1300339760,863497431,1474051758,1900346562,193587265,1300485737,1429760153,567933812,1075521980,466426325,864013371,1143598657,1732499848,857145610,56467340,355071479,1117183452,23968224,503842048,495623537,573102279,1194444804,1490911659,258679123,1480332027,1705512421,1706474053,836111016,608796130,470145079,139279380,840240361,857687743,1974525628,1973425705,680029834,1848485389,2003226910,1669647771,1313294934,1564482381,778367750,1329189025,1080221106,760284185,617658099,150385992,1927060403,495252252,1438865991,414608195,1103310579,1129892187,2011398117,602791792,186297507,1830726540,774286887,711822104,1021608009,1901696189,660330709,1849263775,1509612155,1200424667,818765587,963019278,575220658,736679569,760615855,1818377625,150037907,1362178288,649531032,764216947,501873805,1973324179,1966315856,1207489008,1990668979,732914755,91991434,1409436459,1597770320,283551172,2011327743,857884029,862352696,1880219016,1127355634,1166362603,359290087,1167335605,1050628341,324932455,876726442,1260508578,1399687691,1292056542,1610179941,1191263979,46243524,858150866,1600753223,40566477,1829980157,1465015564,869094257,1000615713,999515024,1527216126,1156389536,721574763,595639179,472474216,1641957664,638845146,1117074199,806270407,1638713347,1022892591,508918868,1101841558,1667362444,800607560,398994128,1373495890,485454314,548376637,1594082228,792614879,10427535,177531076,1898889488,388729777,1836594278,737593841,1834421456,1140935043,122483340,1513249172,1108681913,1194890383,1411654641,1459709104,903086334,412284431,823349413,582074254,1322657952,1205850822,613540001,1617387284,510972237,1497950244,924117072,1319463970,696441214,915636441,4233876,1381746887,1354955905,1624809972,789078091,913575209,168168384,1423961267,24499550,772645106,671531940,1963707830,1588448623,968542339,876483642,524016055,1226927040,981741767,12206584,482973966,1409777382,888819575,1284064630,254848185,407603861,371775536,801107112,599799158,1874985976,1885396461,1277461967,1307275161,1178502495,1074973663,2385769,840909068,1859499255,782903939,64960073,1144555889,990455500,1184499375,577543406,383525207,1447079672,1567211923,473153670,1653076176,192736803,508935854,1092155301,1092155301,1092155301,1308825642,1962271981,4986259,1904245181,1105853193,848330039,1316721518,1566042623,1005774207,1244041048,1610310583,268240428,257442371,1487718500,831816685,81744566,1991057978,112732883,85443443,285502677,481787238,465147081,1566139807,920462593,1611997492,1091572123,630827102,1450068654,1715940543,636585235,249531269,536913005,872003477,1716076482,1064922733,754543052,817380013,1624549897,227256130,1745736752,311023768,581112443,535372918,758953812,1194890383,447190703,1634971956,1947539358,626250789,1547585648,497357939,1433233264,1246562430,2012541564,1644202370,1291894287,1502373853,1363077672,832205650,1800095051,1103378956,71776237,319511632,292711854,1180603599,1892288453,1824523002,1701200877,1657830151,1910288158,1902235558,1476214900,1187945248,1345071787,1194385246,1327453462,1981650120,1596085401,1897360868,1310911001,1070866861,1652814307,1338529323,1459289107,1880501964,1540059437,1643558581,527444684,761904826,49891184,143930262,962093907,1412993012,126826644,147271799,409131578,1730854342,1603526795,1683859517,809533442,1814599651,1515886061,963874907,1310996609,481800540,239578907,1344925592,1847083795,2002524145,588080137,1126585528,1699156439,1785485540,212552524,1339936562,450149649,725051522,996098591,634194920,1035274022,1772937375,597619946,444736889,1459608621,7907590,730384355,536551582,300446285,1789812513,557749394,1660851852,1838519508,11219460,1333299055,2005547728,1310979257,1188905809,1626435363,461798397,1319620072,555689803,1466021315,210553294,776857600,1321754678,443618806,395880757,547184502,963301264,1392021617,964478840,664596958,1153190903,877254003,1324423262,1664746018,1536050212,233142535,1077289574,1652316262,1250340363,1596387017,1211351142,348978971,846551511,721181123,580894183,168564651,1117745045,1654673762,272316531,781481872,1522954856,1646797693,157990214,1328191342,76477514,561389756,605064238,1017277047,1065385708,403903937,1897779475,607141129,1666006232,1195525529,1462766212,1951091748,1813422236,1701999040,473030117,1286615681,1658467949,1073948481,238775718,576783559,318425358,961698565,1506527242,874447933,779677651,525866821,614388171,6156081,1105729096,1453989611,1753930032,1385645506,1105976450,987720499,69425047,1317230168,456489878,540045358,629406422,26061099,1666402049,1033580951,1021470541,541784012,1168105719,5361589,1632855088,1274735339,1040068376,1219782252,262991773,720611139,674798042,1430901629,1496456139,1631022413,1938432858,972127652,758656447,981651585,1975604086,102546906,632795566,902653569,506593720,303275741,1383893136,1509921971,1382489162,1833674887,1378535564,543942888,72997462,993464892,1090447924,1954313604,608596051,1360682214,1735842345,1990712586,1437766655,1220800302,36797423,352761564,350280101,1938758572,353200660,694663089,1751584469,1359092339,1795538534,1111488605,710694054,450936343,825905422,1341570608,217080159,597165087,1387938843,843943301,1054041987,358417497,835341542,840350207,766235838,1479472436,1384703112,383566073,1585622617,951171975,1237305115,887128223,381384123,494209818,349496107,1305553224,1852491456,1070652569,670496101,1373599348,1608409304,432364197,768892151,79840926,503511893,1679473580,403402645,670950513,13586923,1927323425,499923038,2004158741,1789222173,122577095,461006969,891391118,1223154250,1484751923,459716444,1503045468,774157481,799409071,1957145714,1273649610,215750782,1820056800,1511274746,1264050609,1209363997,1895285362,1992246728,375621391,843934651,1727384882,914558708,1181835940,1946650998,490113378,1392865724,116367774,1457778589,774734076,1124223399,23224752,1164894317,1268571986,855811202,1061103906,1537209894,1368860834,587863830,508564808,1665025852,300504030,1254701939,1096643216,1093180597,655241300,328730950,1052272419,935402957,1906961935,398930009,187486757,561336353,447180700,1227669302,1023399738,1126925578,1345663509,1068519691,207063465,1221963989,1062501172,803260947,1442660650,883950149,476151083,1990855031,604229320,137842655,756256911,1202534945,110259149,797147808,915030205,1919992717,626949554,1212512856,1202966932,1173946696,1405388789,250684793,1165496078,1886830387,1500602745,829187819,175105965,1882144389,751486514,455211961,677400917,80783874,1088991860,995192681,1166491339,1370157559,117909405,785142613,1707426972,1944263775,899143905,361655303,392748440,1460748013,655185890,755602596,1491652702,766651585,778182235,296905695,1316154860,362003557,876321735,337395281,260063146,605116055,638054514,1655149886,1196323908,736723377,1402372756,460347510,325703698,627980620,1757808513,1997537975,1438485267,706995367,605018815,615575207,1984631054,297161584,1828745062,913941542,1769338343,1083447181,1550287482,932658756,1378771491,995442956,1436668122,1166573633,1534412373,578880886,1801323590,328711470,1028408485,724724046,718092802,216796236,828208410,840336916,1997330159,169201205,1552206647,153747745,1470533479,1496516161,1285601065,1200229431,1340344793,1711072444,1449511621,616286670,720174275,1425985303,617141107,2002338927,175945474,1114684361,224529295,683837003,1927687314,972660380,456064645,1417470032,533449054,127704001,1108997784,1363501987,112090175,274886531,1376259712,1353592118,1193033897,1984353989,2558620,664964968,1698379157,993610437,1586381352,1739884638,7465775,219681584,1050291693,156664266,82728301,427768777,273246997,1985243262,1247473051,900363504,565078286,727704352,893136890,151102393,926997895,661222227,1491406329,2002344827,100436130,1076956578,764610140,1441081884,1764562703,218547381,1024041936,1519411278,1798786524,1757135997,1831564758,1846480138,1805970721,1551670721,840013015,454567400,1029625826,1205983832,1271578010,791672784,1719056908,42702254,149011245,1244206707,578030602,957416930,1290751972,1590951410,1080248115,890687951,1600608313,1239553509,1217722868,684402745,90246861,380877804,1045164608,1084003562,1190318641,513566280,1123940172,1425712065,797626781,1266988464,1058142394,1844846745,1326351746,388034326,223686179,1824163570,1323098585,314592843,1409434189,1968487959,986224288,482407967,1037746345,540810874,546795282,985525393,487262651,1497001343,691555407,1054556045,189425661,1761591485,1759054882,959100370,1711992669,1324729863,1112860531,36879647,162849138,1678727630,334624296,767754579,40716699,601369641,593457867,901317928,1884124097,1636927446,656137672,1371803386,391564731,1299664644,254755614,1332324811,1687392637,247704798,560083321,884563103,1484009302,1726574951,1853051747,576448148,1832313107,1047795141,613478960,1292849170,826605419,1648990420,490122730,1111926991,1983649429,627322645,646407176,808966271,1571132225,827267548,1353411779,1228804072,1313738833,717803358,617535182,1166757471,913466718,163794648,1765209891,890228704,1232400661,274882072,745786763,1688460751,948297539,608647322,1388456941,221957819,739826148,1348630849,645308686,750995614,17099579,673970309,381642515,1395528021,1080608133,1269557716,1584323442,1981771222,1830266291,1423394591,291527117,1777686688,892807053,425841003,1857749041,1454757678,900140896,452541679,1457826754,498883953,1090201509,362814179,972164245,613562086,1719901179,1691630714,482786312,2006975715,302739866,842014599,1425345354,1886999656,182634345,1673200207,1926512508,1244404851,1339629331,972292365,1225630599,1119797967,1424234246,1402232095,125954295,1830287669,203292670,856735305,329804980,446527642,1950315883,790896625,1327764118,1673213782,769112195,251327078,1529965397,633094532,168425866,620747394,1178038121,721510113,684033875,158329248,943671572,1546580929,49686425,543088791,146385888,786887828,247785968,501780032,716315411,561587560,1483612386,865139510,1340318663,1801895133,975329700,1032292887,1864102795,1211011564,775604991,1081000029,253411038,162942493,1233038410,1911976624,1683119,1434802429,1908526070,1513811862,687550694,1288800209,1557935523,227000840,988173316,2009453897,885377029,901140443,1485584832,1645002093,1129535890,1735488855,1242626059,527237758,1983018383,277217655,1248778550,1653542922,935843534,989150631,1510901328,841132780,1192171536,238664978,521234342,342223904,1729482477,5913686,1134424684,742520894,767299554,422303934,149503994,1180413957,1255514159,714042101,1456143778,1108295029,662667129,818017528,1974792373,748307030,482016049,454894490,820732135,1461218632,1831889466,746259358,977309270,10839878,511658523,91335327,708093864,1297902690,1780988761,1641886961,1026244574,350845366,387290703,446747109,1560756003,1540677366,1133861107,205235793,85016958,22805756,1033779476,855405431,205526773,1939353653,1012617455,1461196813,868985722,304724206,848300479,1380950023,1293815204,499454394,1649238741,1261436853,1988967749,584358582,1877236374,416403168,1877336497,254979358,1324277003,1687754474,1257217253,96527656,1093659137,1057599523,1224580140,800449249,390496648,338893990,113501482,1063083847,1828450816,565360536,1565173402,131968922,1495381231,1188137302,1755092449,1702324362,892310503,1488820216,623361117,1554342929,1948427245,264583760,1950392145,673315598,1124563580,192421551,268399618,1267955005,492570436,1266305686,1583512072,677019331,733960917,203771273,68864409,173652018,618803943,1369467201,122665452,105021096,189701704,1840835363,1422430202,1329890737,1168248055,342015928,1342086137,853637900,1801892889,1153118126,529317682,47681003,1025207014,1581681314,1182096799,1454713482,76217027,1939657822,1608554937,1332695282,239528754,231770956,733596001,1589085872,1783847790,35227887,405500296,1439709137,587898407,747323123,1171001675,1297981346,553593774,1058291685,1824382242,1329453023,1955594505,1252431088,522277372,1618967310,622767380,1144568375,202328758,661330233,319166417,851474119,515544115,844036400,678832669,219480804,1008928020,1639806820,501943065,468378723,1788784182,297025055,982234690,955386630,732100960,577334364,1199907279,121261917,173817636,1429019044,830260224,939841707,1815588995,1509284379,994380671,390871900,1385553651,827614237,861213197,230300358,1255101499,1409271295,274653148,274653148,274653148,817421954,353768649,241787271,48885064,602608640,1724276834,1116943537,610818032,12121213,1976656697,1950697567,172179847,179819625,671000574,1681086673,197127968,953006280,361829462,122987008,829176544,1354698404,347829411,708335504,142407232,1805028168,959624778,1883527977,1825106352,1472232569,287076789,1779745295,67246527,1921619963,530677893,1482203371,1898312936,1819695013,444781840,307320590,1026811141,1494380794,1803219773,408776576,1688406649,1153118126,675102058,993994761,1860537586,1038723944,1495385115,584667397,755767527,886338428,1170692580,407499723,431163963,937100316,1818090420,1973843454,321248174,263970337,1266892454,330536364,330543234,1439388014,242142090,47664530,1559363286,1820835088,1201074655,155601312,1505118,1499587590,1045363969,488629233,703936141,1420824053,743893138,606594765,1637282642,457210069,375518878,1904263232,602944683,1665465451,123830415,770166647,892364521,897453026,104056067,312570974,865617078,1028363406,1431324239,553703862,1963143515,1561767147,1011679155,438622864,1144840642,991258687,1333414324,1424047054,759513018,1263275276,645595167,53481693,555988825,169428823,16347360,47065688,68443548,1482069904,1661330446,1803333656,1844829314,1196480803,659088581,825254215,1418705305,341878515,1658380289,410575479,340826214,804462057,1241192014,321744688,275185523,1602340135,1750861425,1845946756,820029489,216039145,1351730451,1250824558,94333991,2011360911,1519326038,269008805,697577698,1671731403,1843026807,955323114,808983229,1412192536,619784808,1129123167,1641665677,1561673445,452771330,964436961,949743198,815761619,1924485414,842339504,497618502,672147916,1525908034,968709468,1347246975,1675356604,1204037519,659170681,1796783826,236557894,1565482839,929298381,1923920927,411012300,219812187,354593357,478716750,607577847,1371348031,1477261466,1583259406,455841965,1117187930,1339092899,1498903690,1547132213,1300233681,931834866,1873673732,1400665471,202324445,685635155,1471919025,492770328,467089260,442099532,1797588144,1191353780,972873489,848954553,231696622,1455860528,57939296,522549945,1291044123,287543652,78405653,526717005,816226995,1019853074,2006062506,1450973565,1922838241,1212338813,1150067819,26851645,1725339713,553267490,1876001003,741830966,848470136,1294334044,1357905604,946613607,231217456,259015619,987254720,485196234,509937410,552830212,1578814647,1333239955,1981672613,1966099664,917661965,719633788,1523979395,1594845908,732807719,1117619726,633937405,41049800,1347185840,954732341,474026667,789859910,44583501,1317648341,153004014,1586607271,440726805,1659299969,258837328,726380137,1019402166,876404774,576510419,728677169,495957098,25829040,669355078,385140976,1171990674,1192436112,1267252563,1455085439,71199321,871629484,728507628,1957924867,1735226551,1162803756,1799373823,819030196,1044191817,389636914,831417707,779623222,2006135956,28930216,1884810778,1202349852,1912919990,461105222,499617381,955818130,1353197507,704084803,832526007,391594962,1110883380,154166284,658195161,1599054639,1011826588,1495073257,811359370,376419331,508277033,135440621,1995323963,1605813547,1073196650,671611511,1502120792,1847881325,592724090,1378040594,508557434,97602774,1090745743,769538146,1549096930,504980576,1101884850,1765421738,1499147684,113977139,1197279583,446420430,430902380,1471913343,197538961,196400437,1858201151,1626069702,77636968,1582302031,635691569,1822907121,937208659,64649798,920618611,1498185548,459426199,1391540953,1174785084,1469632543,288719241,1203135619,348648702,506134888,122215690,1732292458,1404625339,1983484841,1029158315,103928726,1844466480,1552272254,1856448458,632047086,603434013,40434335,745470096,1222756791,1989163065,1028581943,178691174,1812678163,915217267,1545233833,1646117821,1831926956,1739464774,711702292,161104110,286727614,276079845,1732590566,127846072,1232964425,273401542,837442963,1359814225,915520357,1998051368,886071499,864094879,1005944885,160004608,1365830480,786389660,688950278,1535136736,1945392159,1103559873,1094050237,1540265644,761642953,554119144,3414073,153572600,559089493,1131658656,1778366347,1393549928,1185699681,247029826,868612857,535091739,554589356,1588167125,1261905817,318809982,1565563072,231384449,595193613,949282529,46734395,797149103,1413875712,159758140,1197591772,1690542523,846845194,1840839355,1916872397,423125878,1137369782,434233142,259467826,1222087578,395835869,1012722033,1638827044,1410784127,1714014680,866611003,467457301,453771022,1867414524,1911249471,1882207512,1479116605,1074580189,905269760,1864641713,1344653061,398387407,1811088460,1811955449,1200361151,1440678001,963251682,49069908,295973714,1772555616,854649394,1294455457,1585436142,163048597,1468119204,1603988684,961292813,1635414400,701004839,771249761,483426463,216151189,95044874,1795439998,1284244430,227890225,666131855,932204409,1618589303,639764504,974904606,1187003346,760572488,1936574960,757705784,592628710,969248905,733171465,1651590034,1619963612,84513208,1055663536,1348191770,1247957386,1728205211,715322863,42448503,811170302,120530347,718484871,829438985,745823506,1479789375,1515915051,1417218909,1747352363,1684881307,865814113,1914355929,231646835,1161198682,759986721,1729255107,1987749586,1218967513,427931030,1560204198,346427986,240560873,403284610,1969477161,162454272,1598147710,1488988184,892823449,1611087265,1376626876,817115867,1377520340,609441730,404417258,1231304102,1210972590,1497098450,1180434139,1206933740,1571374038,76210066,1133819976,342305547,1692256353,284811417,359191246,1760884097,1544849822,161422922,1461518718,971221197,930115261,1855341600,1843383895,646184890,1529851446,1648590971,1409294018,1543298447,441524568,975968541,781696726,734926522,1655131577,910617854,1929148498,1874179870,1393031850,276750616,1835107589,396947668,102592784,1242819460,281650487,1920245043,1398313488,1623275069,283587488,11819528,380840001,1592054825,895378038,609667156,1500476856,1183677545,138449656,610568571,1729337354,774920003,1719416872,1788761906,1619773076,1916384176,520461635,659425781,93914470,352157718,1142418430,1701985340,1119050738,1053319524,1617789219,1785200977,1303834256,1255096530,441504910,837945975,237783151,1616415122,267348616,1559188946,793308884,572117107,1360692747,1485124617,641865681,1215217341,896200608,1481475719,1345962910,538538692,1720625206,1737846749,1953747955,1300889336,1069767246,470591744,765181410,1931732414,506168117,1596828665,1237668084,1596416632,1680533136,1299538219,291357270,211216446,317375870,372128189,1562280650,1776351478,1951573809,1358762916,655617429,1568370596,1204354556,1120019709,1541115829,289211829,422299535,943195087,911679177,1039894,1600137967,648482295,1347282189,1844734129,681479235,5445968,1612884767,321609197,1502238802,59426003,1087193327,1586413909,238110562,1895819139,648772197,9371705,1027031273,1635927550,554182349,220016062,1792830655,1326415962,610612533,1550306142,1052799349,1262697022,472824828,240270458,81126657,606010564,758281853,1573943656,1010087365,476656308,1396379263,1352002690,1623698646,1954596300,249423046,1845050324,435978187,1680640023,1008252752,982837115,1658307553,552924504,506630206,1655265228,889704908,15668374,47203489,188747614,1089413893,1358594360,1498528273,1618036342,1118350423,1260616314,1233646575,1995891294,344982837,49456948,886947463,703164386,141566796,976645001,419984973,1486912744,2012086336,1170413749,1974675695,1188717446,729245076,658425109,347293355,396980582,71562042,963483172,467556808,606883493,515382389,1924120590,86759044,1609244570,1479210791,382359120,949222776,1583398955,423233022,937921747,112070148,621737539,1068525750,893738803,1325232550,1178450232,1308281056,922525062,1280879913,2001322609,913571776,230497844,1697393571,969648619,938033073,1006335073,1201494368,1150486120,1332623569,1249256546,1551404420,622492480,411450014,165241259,504673793,656795959,108112469,1522182857,1844475482,998036651,90388842,724225058,1650420387,965146382,1689279936,1234904750,611479078,1171774241,1141526473,525346233,1662478056,673444315,10291697,1327411400,1774136646,115194538,949188287,1623365144,274689685,1995223248,1367327391,1043080958,813351384,631213487,1166158292,449359106,1317740224,713371174,437916581,25157794,1680943229,1703567163,106870687,1943718637,1207603925,1892338157,1746909964,1400449123,1272360549,1018007096,1824087662,726754623,1690090604,771692154,1962864494,10515229,1357617143,755099164,890549824,754894427,660142143,446763512,1400589482,432609600,1269492520,247710254,1990771124,1626599969,520495588,321524486,515657787,1296144664,556228491,558357967,1350612834,1513572543,323180145,274726982,1278288628,1493371885,1726201491,439081737,1930558787,1622452798,875447748,336306038,656779932,1922078616,148237673,1136642197,1109640717,1928257282,1649653833,1214993687,187712762,1833394176,466730,1499548393,1132937992,284884757,1375488778,1852206004,629920520,1782862237,1901410624,1739427476,912747072,49828192,1189776471,834345029,1194670097,26334514,67306093,42162135,929858494,1595526114,1279748826,969232413,67531367,1913093218,75008544,843884912,6894202,495377834,696179165,1718907495,448738371,1975365474,1081438235,1662621209,672508293,1819305790,225032076,1171009719,413187818,1937901253,1270639868,1375160972,1930992184,815582395,1132242522,1804844950,71294418,745923948,133474090,1175743175,470928469,1386254597,985984043,1099261851,972801146,1827908454,1003976505,507934667,70797363,363171685,1055813871,1358524073,1711315360,669976474,1441496085,1141366603,1892573939,1309044940,197402614,1964342850,996434925,240410392,1312731891,1940354560,404476968,704781255,1559075000,881586732,320962246,1726040014,416590006,227557269,551586979,1433355232,305971532,1467950843,351392194,1204210628,1813645794,1404582360,574484387,97822873,2010230785,1423574354,23599241,1412945627,795286615,612797379,1349323252,775231990,929088202,260950177,1188352794,1774631814,1919415666,1982683135,920511150,920511150,920511150,803373480,1847522585,1575562365,1348861791,1385564373,1589991767,599109995,834027985,1203094539,120749986,1266849409,562065451,159326316,805594085,458442374,84744629,603380407,24440414,101286139,343643188,1172523714,961062430,795346653,72018862,1441863048,1975626820,1618536264,438284679,282079896,1919487244,378545704,409343438,658838857,2000417012,1697229588,485877216,496872369,1102239666,1140306871,1603026184,1457191981,700691887,883217812,680531661,1937901253,1775030361,1362331456,1081897717,767322886,1048965883,474394956,1797906611,265977419,1546969455,1827685022,981569804,495051207,1285126885,412599207,807634746,608743305,471481903,892818271,1664241113,1795789518,423960892,1246124568,730418138,1031447354,1478403747,292870878,1584212998,1985232810,368663054,685937819,1162094778,825019781,693985834,1200167695,575965517,1143708786,1059946203,764169891,450438135,1347458354,836017096,983101969,336512518,1499042714,1082480096,1882112225,176771607,1221029820,801500276,1044751955,1657439630,589695293,1502033948,929950838,1539800229,99856788,593519502,352052020,154298068,1497069495,1602347939,690092860,331099143,862413240,508189960,116215996,635758233,1558496550,470795512,256191472,1704507520,1704126787,1929227499,1818360872,1883519700,1108718632,22756460,614500297,74820687,343109923,491076428,1319220596,1901353446,1156236507,1417496555,1574999399,1794641626,617921202,1140955082,107047263,1723344323,1235766114,1434224422,1953371599,303545606,1074181348,897184251,448125257,1149797144,1296385652,1486480524,1333943286,1492873951,366952238,1507327587,1634492087,998157639,205511147,728692749,2002188212,1194449367,154454375,1616207538,1680408951,202207728,1867325607,1298518290,330769131,485638469,1158087428,91861061,1603231557,905001444,1358489468,1362549546,713124681,516378503,76499082,224113222,61649516,574288588,280191880,1335966983,687714395,359224054,1556586587,1693034264,39499317,625306223,1643887196,368272087,829337510,1895348604,1013576817,796960285,663415540,1597359794,1418293983,800391083,900767183,1365731539,709050375,643988864,1271343375,439934248,649480427,997110909,9163533,1010501968,721361645,748416468,485751738,432347604,1995966417,900694324,288582313,464006154,1505401765,1053534360,375512699,1675236335,302905297,1435568920,1741071897,260164713,1619390158,543538291,889086410,1399988581,1748468227,1137968663,986203622,1583318677,1288986024,1699289850,1085157152,446933823,1584463574,809755047,1550706455,1232426370,1911759340,8923395,585695181,1210167045,1503004584,793033358,112720458,186882238,1459623422,1592851816,289856609,258868432,1542004481,1495461915,1273088493,1724569073,735993939,1539130007,847083957,309822064,1889557107,1049368194,2010928100,1596788596,1141475478,875602792,814549107,78616877,1623554226,546861068,828319932,1491293010,1458854707,1719691593,1958949821,1516354523,587365881,562704573,199707832,185840240,1890257411,995746391,550376798,1379194285,683774272,366916137,1916082299,1476865958,1066055256,1235784522,154186239,182128722,451411786,1648782406,613727994,1173983311,1996050557,1855937018,1238878977,1848502004,269088535,1883813773,987418421,1271957268,1637075036,254695628,1282392506,1141897009,1094997447,892028513,1326901113,1285332712,1431799313,559401033,618811158,1985280026,1295376111,36837391,1409644281,1896697812,1267859913,1567159677,826392587,1837350631,568629772,1328222119,1579806884,817599551,1395775914,651393474,387843106,331289741,1241268232,474053246,365049900,847047610,1193466243,1851854073,1948503240,929039417,894683683,1054599533,1901018809,1786933846,1139699819,306814111,356991851,1023077787,428250232,1679555857,932341476,1040828177,815553391,1249234449,1378571916,417365676,1567469061,1203473552,1229213568,1781387186,807899019,700094869,997078324,1150807315,1369574476,1257002358,1012418646,1689776081,1282170682,1489120465,1289136745,874325561,1169427475,1488441896,1123885073,852542818,1135309243,81239866,1331086903,359391986,742396854,1483372628,1189922501,1520488965,405916850,282636326,1465922162,1572020612,1682669856,955070759,1067090041,1000938680,995102689,1905504950,207083051,637880685,1189548736,497657275,1053476481,654569248,72311172,472538582,1417392001,627205416,605731757,1866074968,1073386668,321344090,1776086953,721839234,963535379,1796752955,1872417380,305995550,1755935110,122147995,1350335291,1584409422,156736129,497620063,1387784816,1258491797,1691370688,124241394,1148171763,433463207,298220911,775511367,671573968,1429816356,468420187,707658633,797537720,1943740609,1771134532,1504289617,7163555,1678667743,28969559,513214064,1886949867,251379286,1582844087,787589286,1209102529,1721265987,293162095,1351586636,1481516775,1553678446,938476092,926003144,358386027,1351751285,1692367,167325455,1693814644,1224510446,1117036863,1453823514,50607621,155314240,921793327,1012866518,549804895,229722262,909289554,824154629,983935954,1619554880,55371839,151731109,1670832796,897731329,1562214214,813970995,1004201662,918113392,798160296,1676399550,494316676,259736187,62197914,1529623794,473385322,1305466675,1380557334,1289852875,1334746469,1773599074,318607896,393556162,226676396,1551807352,849692051,1986117436,150761344,1463072650,1283364671,134623411,291353735,443355987,908643002,407212184,1844211399,562968199,823605484,1066613872,194649644,1608308482,1055031504,1359523447,1291135761,1034528073,1651324377,1494523986,1419491561,1410208937,425031740,145664794,923595746,360759729,386550437,1328642232,1126995084,1338993659,1948913928,1938242937,1083158491,30093154,521542769,1504729034,688740936,1699250640,851477278,1170314104,1237628693,752644561,1657789322,956993704,1114862229,294281383,123440981,981858427,510512343,620460399,442013932,1282210820,1751863548,1458704242,853742531,1410670639,150748799,1451216358,417719573,1127244239,66926913,846209071,1285440211,1664032095,1848175870,273708640,354023258,423794904,79961408,2001571143,1420590920,1313791896,956812222,321164943,376608809,135710924,203296203,1209890638,1614083644,1917757167,1537678976,989659969,1479788200,1322363220,969988446,1918708829,377410436,1409380750,29288710,1631257600,1562383318,1436442351,1838943024,1435455746,1678151704,1381180446,1581026554,1071714227,1195885067,1563212069,80941942,1053929856,434172441,1339325101,401465105,1807772674,1305870260,723853685,407010607,435191081,880567539,1238568901,946578969,27309170,14307619,1688696449,1649091876,106805887,162237238,82879745,761960185,155514355,1753357198,1230070413],"index":0,"hashfn":"poseidon2","verifier_parameters":[4286227026,547939629,3414703726,2080951181,3907883793,2303242223,2395372305,2599570544],"claim":{"pre":{"Value":{"pc":2101712,"merkle_root":[1036135929,2095185905,4171320686,1544875344,2012419605,1482962434,2736171348,4010272148]}},"post":{"Value":{"pc":0,"merkle_root":[0,0,0,0,0,0,0,0]}},"exit_code":{"Halted":0},"input":{"Pruned":[0,0,0,0,0,0,0,0]},"output":{"Value":{"journal":{"Value":[35,0,0,0,0,0,0,0]},"assumptions":{"Value":[]}}}}}],"assumption_receipts":[],"verifier_parameters":[3820320486,165627487,1290175019,3652833559,214384995,3062687235,2392248555,2478909781]}},"journal":{"bytes":[35,0,0,0,0,0,0,0]},"metadata":{"verifier_parameters":[3820320486,165627487,1290175019,3652833559,214384995,3062687235,2392248555,2478909781]}} \ No newline at end of file diff --git a/circuits/snarkjs_groth16/build.sh b/circuits/snarkjs_groth16/build.sh new file mode 100755 index 0000000..2b654e1 --- /dev/null +++ b/circuits/snarkjs_groth16/build.sh @@ -0,0 +1,59 @@ +#!/bin/bash + +# Constants +INPUT_VALUE=3 +CIRCUIT_NAME="circuit" +POWER_LEVEL=12 +CURVE="bn128" + +# Directory structure +CIRCUIT_JS_DIR="circuit_js" +CIRCUIT_CPP_DIR="circuit_cpp" +CIRCUIT_DATA_DIR="circuit_data" + +setup_directories() { + mkdir -p "$CIRCUIT_JS_DIR" + mkdir -p "$CIRCUIT_DATA_DIR" + printf "{\"x\": \"$INPUT_VALUE\"}\n" > input.json +} + +compile_circuit() { + circom "$CIRCUIT_NAME.circom" --r1cs --wasm --sym + cd "$CIRCUIT_CPP_DIR" && make && cd .. +} + +setup_powers_of_tau() { + local POT_0="pot12_0000.ptau" + local POT_1="pot12_0001.ptau" + local POT_FINAL="pot12_final.ptau" + + snarkjs powersoftau new "$CURVE" "$POWER_LEVEL" "$POT_0" + snarkjs powersoftau contribute "$POT_0" "$POT_1" --name="First contribution" -e="random text" + snarkjs powersoftau prepare phase2 "$POT_1" "$POT_FINAL" +} + +generate_proving_key() { + local ZKEY_0="circuit_0000.zkey" + local ZKEY_FINAL="circuit_final.zkey" + + snarkjs groth16 setup "$CIRCUIT_NAME.r1cs" pot12_final.ptau "$ZKEY_0" + snarkjs zkey contribute "$ZKEY_0" "$ZKEY_FINAL" --name="1st Contributor" -e="random text" + snarkjs zkey export verificationkey "$ZKEY_FINAL" "$CIRCUIT_DATA_DIR/verification_key.json" +} + +generate_proof() { + node "$CIRCUIT_JS_DIR/generate_witness.js" "$CIRCUIT_JS_DIR/$CIRCUIT_NAME.wasm" input.json witness.wtns + snarkjs groth16 prove circuit_final.zkey witness.wtns "$CIRCUIT_DATA_DIR/proof.json" "$CIRCUIT_DATA_DIR/public.json" + rm input.json +} + +main() { + setup_directories + compile_circuit + setup_powers_of_tau + generate_proving_key + generate_proof +} + +# Executes main function +main \ No newline at end of file diff --git a/circuits/snarkjs_groth16/circuit.r1cs b/circuits/snarkjs_groth16/circuit.r1cs deleted file mode 100644 index 2fcab76..0000000 Binary files a/circuits/snarkjs_groth16/circuit.r1cs and /dev/null differ diff --git a/circuits/snarkjs_groth16/circuit.sym b/circuits/snarkjs_groth16/circuit.sym deleted file mode 100644 index 4c066a0..0000000 --- a/circuits/snarkjs_groth16/circuit.sym +++ /dev/null @@ -1,4 +0,0 @@ -1,1,0,main.y -2,2,0,main.x -3,3,0,main.x_square -4,-1,0,main.x_cube diff --git a/circuits/snarkjs_groth16/circuit_0000.zkey b/circuits/snarkjs_groth16/circuit_0000.zkey deleted file mode 100644 index bc102bd..0000000 Binary files a/circuits/snarkjs_groth16/circuit_0000.zkey and /dev/null differ diff --git a/circuits/snarkjs_groth16/circuit_0001.zkey b/circuits/snarkjs_groth16/circuit_0001.zkey deleted file mode 100644 index 0c69647..0000000 Binary files a/circuits/snarkjs_groth16/circuit_0001.zkey and /dev/null differ diff --git a/circuits/snarkjs_groth16/circuit_cpp/calcwit.cpp b/circuits/snarkjs_groth16/circuit_cpp/calcwit.cpp deleted file mode 100644 index 949fea4..0000000 --- a/circuits/snarkjs_groth16/circuit_cpp/calcwit.cpp +++ /dev/null @@ -1,126 +0,0 @@ -#include -#include -#include -#include "calcwit.hpp" - -extern void run(Circom_CalcWit* ctx); - -std::string int_to_hex( u64 i ) -{ - std::stringstream stream; - stream << "0x" - << std::setfill ('0') << std::setw(16) - << std::hex << i; - return stream.str(); -} - -u64 fnv1a(std::string s) { - u64 hash = 0xCBF29CE484222325LL; - for(char& c : s) { - hash ^= u64(c); - hash *= 0x100000001B3LL; - } - return hash; -} - -Circom_CalcWit::Circom_CalcWit (Circom_Circuit *aCircuit, uint maxTh) { - circuit = aCircuit; - inputSignalAssignedCounter = get_main_input_signal_no(); - inputSignalAssigned = new bool[inputSignalAssignedCounter]; - for (int i = 0; i< inputSignalAssignedCounter; i++) { - inputSignalAssigned[i] = false; - } - signalValues = new FrElement[get_total_signal_no()]; - Fr_str2element(&signalValues[0], "1", 10); - componentMemory = new Circom_Component[get_number_of_components()]; - circuitConstants = circuit ->circuitConstants; - templateInsId2IOSignalInfo = circuit -> templateInsId2IOSignalInfo; - - maxThread = maxTh; - - // parallelism - numThread = 0; - -} - -Circom_CalcWit::~Circom_CalcWit() { - // ... -} - -uint Circom_CalcWit::getInputSignalHashPosition(u64 h) { - uint n = get_size_of_input_hashmap(); - uint pos = (uint)(h % (u64)n); - if (circuit->InputHashMap[pos].hash!=h){ - uint inipos = pos; - pos++; - while (pos != inipos) { - if (circuit->InputHashMap[pos].hash==h) return pos; - if (circuit->InputHashMap[pos].hash==0) { - fprintf(stderr, "Signal not found\n"); - assert(false); - } - pos = (pos+1)%n; - } - fprintf(stderr, "Signals not found\n"); - assert(false); - } - return pos; -} - -void Circom_CalcWit::tryRunCircuit(){ - if (inputSignalAssignedCounter == 0) { - run(this); - } -} - -void Circom_CalcWit::setInputSignal(u64 h, uint i, FrElement & val){ - if (inputSignalAssignedCounter == 0) { - fprintf(stderr, "No more signals to be assigned\n"); - assert(false); - } - uint pos = getInputSignalHashPosition(h); - if (i >= circuit->InputHashMap[pos].signalsize) { - fprintf(stderr, "Input signal array access exceeds the size\n"); - assert(false); - } - - uint si = circuit->InputHashMap[pos].signalid+i; - if (inputSignalAssigned[si-get_main_input_signal_start()]) { - fprintf(stderr, "Signal assigned twice: %d\n", si); - assert(false); - } - signalValues[si] = val; - inputSignalAssigned[si-get_main_input_signal_start()] = true; - inputSignalAssignedCounter--; - tryRunCircuit(); -} - -u64 Circom_CalcWit::getInputSignalSize(u64 h) { - uint pos = getInputSignalHashPosition(h); - return circuit->InputHashMap[pos].signalsize; -} - -std::string Circom_CalcWit::getTrace(u64 id_cmp){ - if (id_cmp == 0) return componentMemory[id_cmp].componentName; - else{ - u64 id_father = componentMemory[id_cmp].idFather; - std::string my_name = componentMemory[id_cmp].componentName; - - return Circom_CalcWit::getTrace(id_father) + "." + my_name; - } - - -} - -std::string Circom_CalcWit::generate_position_array(uint* dimensions, uint size_dimensions, uint index){ - std::string positions = ""; - - for (uint i = 0 ; i < size_dimensions; i++){ - uint last_pos = index % dimensions[size_dimensions -1 - i]; - index = index / dimensions[size_dimensions -1 - i]; - std::string new_pos = "[" + std::to_string(last_pos) + "]"; - positions = new_pos + positions; - } - return positions; -} - diff --git a/circuits/snarkjs_groth16/circuit_cpp/calcwit.hpp b/circuits/snarkjs_groth16/circuit_cpp/calcwit.hpp deleted file mode 100644 index 363de21..0000000 --- a/circuits/snarkjs_groth16/circuit_cpp/calcwit.hpp +++ /dev/null @@ -1,69 +0,0 @@ -#ifndef CIRCOM_CALCWIT_H -#define CIRCOM_CALCWIT_H - -#include -#include -#include -#include -#include - -#include "circom.hpp" -#include "fr.hpp" - -#define NMUTEXES 32 //512 - -u64 fnv1a(std::string s); - -class Circom_CalcWit { - - bool *inputSignalAssigned; - uint inputSignalAssignedCounter; - - Circom_Circuit *circuit; - -public: - - FrElement *signalValues; - Circom_Component* componentMemory; - FrElement* circuitConstants; - std::map templateInsId2IOSignalInfo; - std::string* listOfTemplateMessages; - - // parallelism - std::mutex numThreadMutex; - std::condition_variable ntcvs; - int numThread; - - int maxThread; - - // Functions called by the circuit - Circom_CalcWit(Circom_Circuit *aCircuit, uint numTh = NMUTEXES); - ~Circom_CalcWit(); - - // Public functions - void setInputSignal(u64 h, uint i, FrElement &val); - void tryRunCircuit(); - - u64 getInputSignalSize(u64 h); - - inline uint getRemaingInputsToBeSet() { - return inputSignalAssignedCounter; - } - - inline void getWitness(uint idx, PFrElement val) { - Fr_copy(val, &signalValues[circuit->witness2SignalList[idx]]); - } - - std::string getTrace(u64 id_cmp); - - std::string generate_position_array(uint* dimensions, uint size_dimensions, uint index); - -private: - - uint getInputSignalHashPosition(u64 h); - -}; - -typedef void (*Circom_TemplateFunction)(uint __cIdx, Circom_CalcWit* __ctx); - -#endif // CIRCOM_CALCWIT_H diff --git a/circuits/snarkjs_groth16/circuit_cpp/circom.hpp b/circuits/snarkjs_groth16/circuit_cpp/circom.hpp deleted file mode 100644 index eabc686..0000000 --- a/circuits/snarkjs_groth16/circuit_cpp/circom.hpp +++ /dev/null @@ -1,85 +0,0 @@ -#ifndef __CIRCOM_H -#define __CIRCOM_H - -#include -#include -#include -#include -#include - -#include "fr.hpp" - -typedef unsigned long long u64; -typedef uint32_t u32; -typedef uint8_t u8; - -//only for the main inputs -struct __attribute__((__packed__)) HashSignalInfo { - u64 hash; - u64 signalid; - u64 signalsize; -}; - -struct IODef { - u32 offset; - u32 len; - u32 *lengths; -}; - -struct IODefPair { - u32 len; - IODef* defs; -}; - -struct Circom_Circuit { - // const char *P; - HashSignalInfo* InputHashMap; - u64* witness2SignalList; - FrElement* circuitConstants; - std::map templateInsId2IOSignalInfo; -}; - - -struct Circom_Component { - u32 templateId; - u64 signalStart; - u32 inputCounter; - std::string templateName; - std::string componentName; - u64 idFather; - u32* subcomponents = NULL; - bool* subcomponentsParallel = NULL; - bool *outputIsSet = NULL; //one for each output - std::mutex *mutexes = NULL; //one for each output - std::condition_variable *cvs = NULL; - std::thread *sbct = NULL;//subcomponent threads -}; - -/* -For every template instantiation create two functions: -- name_create -- name_run - -//PFrElement: pointer to FrElement - -Every name_run or circom_function has: -===================================== - -//array of PFrElements for auxiliars in expression computation (known size); -PFrElements expaux[]; - -//array of PFrElements for local vars (known size) -PFrElements lvar[]; - -*/ - -uint get_main_input_signal_start(); -uint get_main_input_signal_no(); -uint get_total_signal_no(); -uint get_number_of_components(); -uint get_size_of_input_hashmap(); -uint get_size_of_witness(); -uint get_size_of_constants(); -uint get_size_of_io_map(); - -#endif // __CIRCOM_H diff --git a/circuits/snarkjs_groth16/circuit_cpp/circuit.cpp b/circuits/snarkjs_groth16/circuit_cpp/circuit.cpp deleted file mode 100644 index 66056aa..0000000 --- a/circuits/snarkjs_groth16/circuit_cpp/circuit.cpp +++ /dev/null @@ -1,115 +0,0 @@ -#include -#include -#include -#include "circom.hpp" -#include "calcwit.hpp" -void Circuit_0_create(uint soffset,uint coffset,Circom_CalcWit* ctx,std::string componentName,uint componentFather); -void Circuit_0_run(uint ctx_index,Circom_CalcWit* ctx); -Circom_TemplateFunction _functionTable[1] = { -Circuit_0_run }; -Circom_TemplateFunction _functionTableParallel[1] = { -NULL }; -uint get_main_input_signal_start() {return 2;} - -uint get_main_input_signal_no() {return 1;} - -uint get_total_signal_no() {return 5;} - -uint get_number_of_components() {return 1;} - -uint get_size_of_input_hashmap() {return 256;} - -uint get_size_of_witness() {return 4;} - -uint get_size_of_constants() {return 1;} - -uint get_size_of_io_map() {return 0;} - -void release_memory_component(Circom_CalcWit* ctx, uint pos) {{ - -if (pos != 0){{ - -if(ctx->componentMemory[pos].subcomponents) -delete []ctx->componentMemory[pos].subcomponents; - -if(ctx->componentMemory[pos].subcomponentsParallel) -delete []ctx->componentMemory[pos].subcomponentsParallel; - -if(ctx->componentMemory[pos].outputIsSet) -delete []ctx->componentMemory[pos].outputIsSet; - -if(ctx->componentMemory[pos].mutexes) -delete []ctx->componentMemory[pos].mutexes; - -if(ctx->componentMemory[pos].cvs) -delete []ctx->componentMemory[pos].cvs; - -if(ctx->componentMemory[pos].sbct) -delete []ctx->componentMemory[pos].sbct; - -}} - - -}} - - -// function declarations -// template declarations -void Circuit_0_create(uint soffset,uint coffset,Circom_CalcWit* ctx,std::string componentName,uint componentFather){ -ctx->componentMemory[coffset].templateId = 0; -ctx->componentMemory[coffset].templateName = "Circuit"; -ctx->componentMemory[coffset].signalStart = soffset; -ctx->componentMemory[coffset].inputCounter = 1; -ctx->componentMemory[coffset].componentName = componentName; -ctx->componentMemory[coffset].idFather = componentFather; -ctx->componentMemory[coffset].subcomponents = new uint[0]; -} - -void Circuit_0_run(uint ctx_index,Circom_CalcWit* ctx){ -FrElement* signalValues = ctx->signalValues; -u64 mySignalStart = ctx->componentMemory[ctx_index].signalStart; -std::string myTemplateName = ctx->componentMemory[ctx_index].templateName; -std::string myComponentName = ctx->componentMemory[ctx_index].componentName; -u64 myFather = ctx->componentMemory[ctx_index].idFather; -u64 myId = ctx_index; -u32* mySubcomponents = ctx->componentMemory[ctx_index].subcomponents; -bool* mySubcomponentsParallel = ctx->componentMemory[ctx_index].subcomponentsParallel; -FrElement* circuitConstants = ctx->circuitConstants; -std::string* listOfTemplateMessages = ctx->listOfTemplateMessages; -FrElement expaux[4]; -FrElement lvar[0]; -uint sub_component_aux; -uint index_multiple_eq; -{ -PFrElement aux_dest = &signalValues[mySignalStart + 2]; -// load src -Fr_mul(&expaux[0],&signalValues[mySignalStart + 1],&signalValues[mySignalStart + 1]); // line circom 8 -// end load src -Fr_copy(aux_dest,&expaux[0]); -} -{ -PFrElement aux_dest = &signalValues[mySignalStart + 3]; -// load src -Fr_mul(&expaux[0],&signalValues[mySignalStart + 2],&signalValues[mySignalStart + 1]); // line circom 9 -// end load src -Fr_copy(aux_dest,&expaux[0]); -} -{ -PFrElement aux_dest = &signalValues[mySignalStart + 0]; -// load src -Fr_add(&expaux[1],&signalValues[mySignalStart + 3],&signalValues[mySignalStart + 1]); // line circom 10 -Fr_add(&expaux[0],&expaux[1],&circuitConstants[0]); // line circom 10 -// end load src -Fr_copy(aux_dest,&expaux[0]); -} -for (uint i = 0; i < 0; i++){ -uint index_subc = ctx->componentMemory[ctx_index].subcomponents[i]; -if (index_subc != 0)release_memory_component(ctx,index_subc); -} -} - -void run(Circom_CalcWit* ctx){ -Circuit_0_create(1,0,ctx,"main",0); -Circuit_0_run(0,ctx); -} - diff --git a/circuits/snarkjs_groth16/circuit_cpp/circuit.dat b/circuits/snarkjs_groth16/circuit_cpp/circuit.dat deleted file mode 100644 index af837a4..0000000 Binary files a/circuits/snarkjs_groth16/circuit_cpp/circuit.dat and /dev/null differ diff --git a/circuits/snarkjs_groth16/circuit_cpp/fr.asm b/circuits/snarkjs_groth16/circuit_cpp/fr.asm deleted file mode 100644 index 611e89c..0000000 --- a/circuits/snarkjs_groth16/circuit_cpp/fr.asm +++ /dev/null @@ -1,8794 +0,0 @@ - - - global Fr_copy - global Fr_copyn - global Fr_add - global Fr_sub - global Fr_neg - global Fr_mul - global Fr_square - global Fr_band - global Fr_bor - global Fr_bxor - global Fr_bnot - global Fr_shl - global Fr_shr - global Fr_eq - global Fr_neq - global Fr_lt - global Fr_gt - global Fr_leq - global Fr_geq - global Fr_land - global Fr_lor - global Fr_lnot - global Fr_toNormal - global Fr_toLongNormal - global Fr_toMontgomery - global Fr_toInt - global Fr_isTrue - global Fr_q - global Fr_R3 - - global Fr_rawCopy - global Fr_rawZero - global Fr_rawSwap - global Fr_rawAdd - global Fr_rawSub - global Fr_rawNeg - global Fr_rawMMul - global Fr_rawMSquare - global Fr_rawToMontgomery - global Fr_rawFromMontgomery - global Fr_rawIsEq - global Fr_rawIsZero - global Fr_rawq - global Fr_rawR3 - - extern Fr_fail - DEFAULT REL - - section .text - - - - - - - - - - - - - - - - - - - - -;;;;;;;;;;;;;;;;;;;;;; -; copy -;;;;;;;;;;;;;;;;;;;;;; -; Copies -; Params: -; rsi <= the src -; rdi <= the dest -; -; Nidified registers: -; rax -;;;;;;;;;;;;;;;;;;;;;;; -Fr_copy: - - mov rax, [rsi + 0] - mov [rdi + 0], rax - - mov rax, [rsi + 8] - mov [rdi + 8], rax - - mov rax, [rsi + 16] - mov [rdi + 16], rax - - mov rax, [rsi + 24] - mov [rdi + 24], rax - - mov rax, [rsi + 32] - mov [rdi + 32], rax - - ret - - -;;;;;;;;;;;;;;;;;;;;;; -; rawCopy -;;;;;;;;;;;;;;;;;;;;;; -; Copies -; Params: -; rsi <= the src -; rdi <= the dest -; -; Nidified registers: -; rax -;;;;;;;;;;;;;;;;;;;;;;; -Fr_rawCopy: - - mov rax, [rsi + 0] - mov [rdi + 0], rax - - mov rax, [rsi + 8] - mov [rdi + 8], rax - - mov rax, [rsi + 16] - mov [rdi + 16], rax - - mov rax, [rsi + 24] - mov [rdi + 24], rax - - ret - - -;;;;;;;;;;;;;;;;;;;;;; -; rawZero -;;;;;;;;;;;;;;;;;;;;;; -; Copies -; Params: -; rsi <= the src -; -; Nidified registers: -; rax -;;;;;;;;;;;;;;;;;;;;;;; -Fr_rawZero: - xor rax, rax - - mov [rdi + 0], rax - - mov [rdi + 8], rax - - mov [rdi + 16], rax - - mov [rdi + 24], rax - - ret - -;;;;;;;;;;;;;;;;;;;;;; -; rawSwap -;;;;;;;;;;;;;;;;;;;;;; -; Copies -; Params: -; rdi <= a -; rsi <= p -; -; Nidified registers: -; rax -;;;;;;;;;;;;;;;;;;;;;;; -Fr_rawSwap: - - mov rax, [rsi + 0] - mov rcx, [rdi + 0] - mov [rdi + 0], rax - mov [rsi + 0], rbx - - mov rax, [rsi + 8] - mov rcx, [rdi + 8] - mov [rdi + 8], rax - mov [rsi + 8], rbx - - mov rax, [rsi + 16] - mov rcx, [rdi + 16] - mov [rdi + 16], rax - mov [rsi + 16], rbx - - mov rax, [rsi + 24] - mov rcx, [rdi + 24] - mov [rdi + 24], rax - mov [rsi + 24], rbx - - ret - - -;;;;;;;;;;;;;;;;;;;;;; -; copy an array of integers -;;;;;;;;;;;;;;;;;;;;;; -; Copies -; Params: -; rsi <= the src -; rdi <= the dest -; rdx <= number of integers to copy -; -; Nidified registers: -; rax -;;;;;;;;;;;;;;;;;;;;;;; -Fr_copyn: -Fr_copyn_loop: - mov r8, rsi - mov r9, rdi - mov rax, 5 - mul rdx - mov rcx, rax - cld - rep movsq - mov rsi, r8 - mov rdi, r9 - ret - -;;;;;;;;;;;;;;;;;;;;;; -; rawCopyS2L -;;;;;;;;;;;;;;;;;;;;;; -; Convert a 64 bit integer to a long format field element -; Params: -; rsi <= the integer -; rdi <= Pointer to the overwritted element -; -; Nidified registers: -; rax -;;;;;;;;;;;;;;;;;;;;;;; - -rawCopyS2L: - mov al, 0x80 - shl rax, 56 - mov [rdi], rax ; set the result to LONG normal - - cmp rsi, 0 - js u64toLong_adjust_neg - - mov [rdi + 8], rsi - xor rax, rax - - mov [rdi + 16], rax - - mov [rdi + 24], rax - - mov [rdi + 32], rax - - ret - -u64toLong_adjust_neg: - add rsi, [q] ; Set the first digit - mov [rdi + 8], rsi ; - - mov rsi, -1 ; all ones - - mov rax, rsi ; Add to q - adc rax, [q + 8 ] - mov [rdi + 16], rax - - mov rax, rsi ; Add to q - adc rax, [q + 16 ] - mov [rdi + 24], rax - - mov rax, rsi ; Add to q - adc rax, [q + 24 ] - mov [rdi + 32], rax - - ret - -;;;;;;;;;;;;;;;;;;;;;; -; toInt -;;;;;;;;;;;;;;;;;;;;;; -; Convert a 64 bit integer to a long format field element -; Params: -; rsi <= Pointer to the element -; Returs: -; rax <= The value -;;;;;;;;;;;;;;;;;;;;;;; -Fr_toInt: - mov rax, [rdi] - bt rax, 63 - jc Fr_long - movsx rax, eax - ret - -Fr_long: - push rbp - push rsi - push rdx - mov rbp, rsp - bt rax, 62 - jnc Fr_longNormal -Fr_longMontgomery: - - sub rsp, 40 - push rsi - mov rsi, rdi - mov rdi, rsp - call Fr_toNormal - pop rsi - - -Fr_longNormal: - mov rax, [rdi + 8] - mov rcx, rax - shr rcx, 31 - jnz Fr_longNeg - - mov rcx, [rdi + 16] - test rcx, rcx - jnz Fr_longNeg - - mov rcx, [rdi + 24] - test rcx, rcx - jnz Fr_longNeg - - mov rcx, [rdi + 32] - test rcx, rcx - jnz Fr_longNeg - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - -Fr_longNeg: - mov rax, [rdi + 8] - sub rax, [q] - jnc Fr_longErr - - mov rcx, [rdi + 16] - sbb rcx, [q + 8] - jnc Fr_longErr - - mov rcx, [rdi + 24] - sbb rcx, [q + 16] - jnc Fr_longErr - - mov rcx, [rdi + 32] - sbb rcx, [q + 24] - jnc Fr_longErr - - mov rcx, rax - sar rcx, 31 - add rcx, 1 - jnz Fr_longErr - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - -Fr_longErr: - push rdi - mov rdi, 0 - call Fr_fail - pop rdi - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - - - -Fr_rawMMul: - push r15 - push r14 - push r13 - push r12 - mov rcx,rdx - mov r9,[ np ] - xor r10,r10 - -; FirstLoop - mov rdx,[rsi + 0] - mulx rax,r11,[rcx] - mulx r8,r12,[rcx +8] - adcx r12,rax - mulx rax,r13,[rcx +16] - adcx r13,r8 - mulx r8,r14,[rcx +24] - adcx r14,rax - mov r15,r10 - adcx r15,r8 -; SecondLoop - mov rdx,r9 - mulx rax,rdx,r11 - mulx r8,rax,[q] - adcx rax,r11 - mulx rax,r11,[q +8] - adcx r11,r8 - adox r11,r12 - mulx r8,r12,[q +16] - adcx r12,rax - adox r12,r13 - mulx rax,r13,[q +24] - adcx r13,r8 - adox r13,r14 - mov r14,r10 - adcx r14,rax - adox r14,r15 - -; FirstLoop - mov rdx,[rsi + 8] - mov r15,r10 - mulx r8,rax,[rcx +0] - adcx r11,rax - adox r12,r8 - mulx r8,rax,[rcx +8] - adcx r12,rax - adox r13,r8 - mulx r8,rax,[rcx +16] - adcx r13,rax - adox r14,r8 - mulx r8,rax,[rcx +24] - adcx r14,rax - adox r15,r8 - adcx r15,r10 -; SecondLoop - mov rdx,r9 - mulx rax,rdx,r11 - mulx r8,rax,[q] - adcx rax,r11 - mulx rax,r11,[q +8] - adcx r11,r8 - adox r11,r12 - mulx r8,r12,[q +16] - adcx r12,rax - adox r12,r13 - mulx rax,r13,[q +24] - adcx r13,r8 - adox r13,r14 - mov r14,r10 - adcx r14,rax - adox r14,r15 - -; FirstLoop - mov rdx,[rsi + 16] - mov r15,r10 - mulx r8,rax,[rcx +0] - adcx r11,rax - adox r12,r8 - mulx r8,rax,[rcx +8] - adcx r12,rax - adox r13,r8 - mulx r8,rax,[rcx +16] - adcx r13,rax - adox r14,r8 - mulx r8,rax,[rcx +24] - adcx r14,rax - adox r15,r8 - adcx r15,r10 -; SecondLoop - mov rdx,r9 - mulx rax,rdx,r11 - mulx r8,rax,[q] - adcx rax,r11 - mulx rax,r11,[q +8] - adcx r11,r8 - adox r11,r12 - mulx r8,r12,[q +16] - adcx r12,rax - adox r12,r13 - mulx rax,r13,[q +24] - adcx r13,r8 - adox r13,r14 - mov r14,r10 - adcx r14,rax - adox r14,r15 - -; FirstLoop - mov rdx,[rsi + 24] - mov r15,r10 - mulx r8,rax,[rcx +0] - adcx r11,rax - adox r12,r8 - mulx r8,rax,[rcx +8] - adcx r12,rax - adox r13,r8 - mulx r8,rax,[rcx +16] - adcx r13,rax - adox r14,r8 - mulx r8,rax,[rcx +24] - adcx r14,rax - adox r15,r8 - adcx r15,r10 -; SecondLoop - mov rdx,r9 - mulx rax,rdx,r11 - mulx r8,rax,[q] - adcx rax,r11 - mulx rax,r11,[q +8] - adcx r11,r8 - adox r11,r12 - mulx r8,r12,[q +16] - adcx r12,rax - adox r12,r13 - mulx rax,r13,[q +24] - adcx r13,r8 - adox r13,r14 - mov r14,r10 - adcx r14,rax - adox r14,r15 - -;comparison - cmp r14,[q + 24] - jc Fr_rawMMul_done - jnz Fr_rawMMul_sq - cmp r13,[q + 16] - jc Fr_rawMMul_done - jnz Fr_rawMMul_sq - cmp r12,[q + 8] - jc Fr_rawMMul_done - jnz Fr_rawMMul_sq - cmp r11,[q + 0] - jc Fr_rawMMul_done - jnz Fr_rawMMul_sq -Fr_rawMMul_sq: - sub r11,[q +0] - sbb r12,[q +8] - sbb r13,[q +16] - sbb r14,[q +24] -Fr_rawMMul_done: - mov [rdi + 0],r11 - mov [rdi + 8],r12 - mov [rdi + 16],r13 - mov [rdi + 24],r14 - pop r12 - pop r13 - pop r14 - pop r15 - ret -Fr_rawMSquare: - push r15 - push r14 - push r13 - push r12 - mov rcx,rdx - mov r9,[ np ] - xor r10,r10 - -; FirstLoop - mov rdx,[rsi + 0] - mulx rax,r11,rdx - mulx r8,r12,[rsi +8] - adcx r12,rax - mulx rax,r13,[rsi +16] - adcx r13,r8 - mulx r8,r14,[rsi +24] - adcx r14,rax - mov r15,r10 - adcx r15,r8 -; SecondLoop - mov rdx,r9 - mulx rax,rdx,r11 - mulx r8,rax,[q] - adcx rax,r11 - mulx rax,r11,[q +8] - adcx r11,r8 - adox r11,r12 - mulx r8,r12,[q +16] - adcx r12,rax - adox r12,r13 - mulx rax,r13,[q +24] - adcx r13,r8 - adox r13,r14 - mov r14,r10 - adcx r14,rax - adox r14,r15 - -; FirstLoop - mov rdx,[rsi + 8] - mov r15,r10 - mulx r8,rax,[rsi +0] - adcx r11,rax - adox r12,r8 - mulx r8,rax,[rsi +8] - adcx r12,rax - adox r13,r8 - mulx r8,rax,[rsi +16] - adcx r13,rax - adox r14,r8 - mulx r8,rax,[rsi +24] - adcx r14,rax - adox r15,r8 - adcx r15,r10 -; SecondLoop - mov rdx,r9 - mulx rax,rdx,r11 - mulx r8,rax,[q] - adcx rax,r11 - mulx rax,r11,[q +8] - adcx r11,r8 - adox r11,r12 - mulx r8,r12,[q +16] - adcx r12,rax - adox r12,r13 - mulx rax,r13,[q +24] - adcx r13,r8 - adox r13,r14 - mov r14,r10 - adcx r14,rax - adox r14,r15 - -; FirstLoop - mov rdx,[rsi + 16] - mov r15,r10 - mulx r8,rax,[rsi +0] - adcx r11,rax - adox r12,r8 - mulx r8,rax,[rsi +8] - adcx r12,rax - adox r13,r8 - mulx r8,rax,[rsi +16] - adcx r13,rax - adox r14,r8 - mulx r8,rax,[rsi +24] - adcx r14,rax - adox r15,r8 - adcx r15,r10 -; SecondLoop - mov rdx,r9 - mulx rax,rdx,r11 - mulx r8,rax,[q] - adcx rax,r11 - mulx rax,r11,[q +8] - adcx r11,r8 - adox r11,r12 - mulx r8,r12,[q +16] - adcx r12,rax - adox r12,r13 - mulx rax,r13,[q +24] - adcx r13,r8 - adox r13,r14 - mov r14,r10 - adcx r14,rax - adox r14,r15 - -; FirstLoop - mov rdx,[rsi + 24] - mov r15,r10 - mulx r8,rax,[rsi +0] - adcx r11,rax - adox r12,r8 - mulx r8,rax,[rsi +8] - adcx r12,rax - adox r13,r8 - mulx r8,rax,[rsi +16] - adcx r13,rax - adox r14,r8 - mulx r8,rax,[rsi +24] - adcx r14,rax - adox r15,r8 - adcx r15,r10 -; SecondLoop - mov rdx,r9 - mulx rax,rdx,r11 - mulx r8,rax,[q] - adcx rax,r11 - mulx rax,r11,[q +8] - adcx r11,r8 - adox r11,r12 - mulx r8,r12,[q +16] - adcx r12,rax - adox r12,r13 - mulx rax,r13,[q +24] - adcx r13,r8 - adox r13,r14 - mov r14,r10 - adcx r14,rax - adox r14,r15 - -;comparison - cmp r14,[q + 24] - jc Fr_rawMSquare_done - jnz Fr_rawMSquare_sq - cmp r13,[q + 16] - jc Fr_rawMSquare_done - jnz Fr_rawMSquare_sq - cmp r12,[q + 8] - jc Fr_rawMSquare_done - jnz Fr_rawMSquare_sq - cmp r11,[q + 0] - jc Fr_rawMSquare_done - jnz Fr_rawMSquare_sq -Fr_rawMSquare_sq: - sub r11,[q +0] - sbb r12,[q +8] - sbb r13,[q +16] - sbb r14,[q +24] -Fr_rawMSquare_done: - mov [rdi + 0],r11 - mov [rdi + 8],r12 - mov [rdi + 16],r13 - mov [rdi + 24],r14 - pop r12 - pop r13 - pop r14 - pop r15 - ret -Fr_rawMMul1: - push r15 - push r14 - push r13 - push r12 - mov rcx,rdx - mov r9,[ np ] - xor r10,r10 - -; FirstLoop - mov rdx,rcx - mulx rax,r11,[rsi] - mulx r8,r12,[rsi +8] - adcx r12,rax - mulx rax,r13,[rsi +16] - adcx r13,r8 - mulx r8,r14,[rsi +24] - adcx r14,rax - mov r15,r10 - adcx r15,r8 -; SecondLoop - mov rdx,r9 - mulx rax,rdx,r11 - mulx r8,rax,[q] - adcx rax,r11 - mulx rax,r11,[q +8] - adcx r11,r8 - adox r11,r12 - mulx r8,r12,[q +16] - adcx r12,rax - adox r12,r13 - mulx rax,r13,[q +24] - adcx r13,r8 - adox r13,r14 - mov r14,r10 - adcx r14,rax - adox r14,r15 - - mov r15,r10 -; SecondLoop - mov rdx,r9 - mulx rax,rdx,r11 - mulx r8,rax,[q] - adcx rax,r11 - mulx rax,r11,[q +8] - adcx r11,r8 - adox r11,r12 - mulx r8,r12,[q +16] - adcx r12,rax - adox r12,r13 - mulx rax,r13,[q +24] - adcx r13,r8 - adox r13,r14 - mov r14,r10 - adcx r14,rax - adox r14,r15 - - mov r15,r10 -; SecondLoop - mov rdx,r9 - mulx rax,rdx,r11 - mulx r8,rax,[q] - adcx rax,r11 - mulx rax,r11,[q +8] - adcx r11,r8 - adox r11,r12 - mulx r8,r12,[q +16] - adcx r12,rax - adox r12,r13 - mulx rax,r13,[q +24] - adcx r13,r8 - adox r13,r14 - mov r14,r10 - adcx r14,rax - adox r14,r15 - - mov r15,r10 -; SecondLoop - mov rdx,r9 - mulx rax,rdx,r11 - mulx r8,rax,[q] - adcx rax,r11 - mulx rax,r11,[q +8] - adcx r11,r8 - adox r11,r12 - mulx r8,r12,[q +16] - adcx r12,rax - adox r12,r13 - mulx rax,r13,[q +24] - adcx r13,r8 - adox r13,r14 - mov r14,r10 - adcx r14,rax - adox r14,r15 - -;comparison - cmp r14,[q + 24] - jc Fr_rawMMul1_done - jnz Fr_rawMMul1_sq - cmp r13,[q + 16] - jc Fr_rawMMul1_done - jnz Fr_rawMMul1_sq - cmp r12,[q + 8] - jc Fr_rawMMul1_done - jnz Fr_rawMMul1_sq - cmp r11,[q + 0] - jc Fr_rawMMul1_done - jnz Fr_rawMMul1_sq -Fr_rawMMul1_sq: - sub r11,[q +0] - sbb r12,[q +8] - sbb r13,[q +16] - sbb r14,[q +24] -Fr_rawMMul1_done: - mov [rdi + 0],r11 - mov [rdi + 8],r12 - mov [rdi + 16],r13 - mov [rdi + 24],r14 - pop r12 - pop r13 - pop r14 - pop r15 - ret -Fr_rawFromMontgomery: - push r15 - push r14 - push r13 - push r12 - mov rcx,rdx - mov r9,[ np ] - xor r10,r10 - -; FirstLoop - mov r11,[rsi +0] - mov r12,[rsi +8] - mov r13,[rsi +16] - mov r14,[rsi +24] - mov r15,r10 -; SecondLoop - mov rdx,r9 - mulx rax,rdx,r11 - mulx r8,rax,[q] - adcx rax,r11 - mulx rax,r11,[q +8] - adcx r11,r8 - adox r11,r12 - mulx r8,r12,[q +16] - adcx r12,rax - adox r12,r13 - mulx rax,r13,[q +24] - adcx r13,r8 - adox r13,r14 - mov r14,r10 - adcx r14,rax - adox r14,r15 - - mov r15,r10 -; SecondLoop - mov rdx,r9 - mulx rax,rdx,r11 - mulx r8,rax,[q] - adcx rax,r11 - mulx rax,r11,[q +8] - adcx r11,r8 - adox r11,r12 - mulx r8,r12,[q +16] - adcx r12,rax - adox r12,r13 - mulx rax,r13,[q +24] - adcx r13,r8 - adox r13,r14 - mov r14,r10 - adcx r14,rax - adox r14,r15 - - mov r15,r10 -; SecondLoop - mov rdx,r9 - mulx rax,rdx,r11 - mulx r8,rax,[q] - adcx rax,r11 - mulx rax,r11,[q +8] - adcx r11,r8 - adox r11,r12 - mulx r8,r12,[q +16] - adcx r12,rax - adox r12,r13 - mulx rax,r13,[q +24] - adcx r13,r8 - adox r13,r14 - mov r14,r10 - adcx r14,rax - adox r14,r15 - - mov r15,r10 -; SecondLoop - mov rdx,r9 - mulx rax,rdx,r11 - mulx r8,rax,[q] - adcx rax,r11 - mulx rax,r11,[q +8] - adcx r11,r8 - adox r11,r12 - mulx r8,r12,[q +16] - adcx r12,rax - adox r12,r13 - mulx rax,r13,[q +24] - adcx r13,r8 - adox r13,r14 - mov r14,r10 - adcx r14,rax - adox r14,r15 - -;comparison - cmp r14,[q + 24] - jc Fr_rawFromMontgomery_done - jnz Fr_rawFromMontgomery_sq - cmp r13,[q + 16] - jc Fr_rawFromMontgomery_done - jnz Fr_rawFromMontgomery_sq - cmp r12,[q + 8] - jc Fr_rawFromMontgomery_done - jnz Fr_rawFromMontgomery_sq - cmp r11,[q + 0] - jc Fr_rawFromMontgomery_done - jnz Fr_rawFromMontgomery_sq -Fr_rawFromMontgomery_sq: - sub r11,[q +0] - sbb r12,[q +8] - sbb r13,[q +16] - sbb r14,[q +24] -Fr_rawFromMontgomery_done: - mov [rdi + 0],r11 - mov [rdi + 8],r12 - mov [rdi + 16],r13 - mov [rdi + 24],r14 - pop r12 - pop r13 - pop r14 - pop r15 - ret - -;;;;;;;;;;;;;;;;;;;;;; -; rawToMontgomery -;;;;;;;;;;;;;;;;;;;;;; -; Convert a number to Montgomery -; rdi <= Pointer destination element -; rsi <= Pointer to src element -;;;;;;;;;;;;;;;;;;;; -Fr_rawToMontgomery: - push rdx - lea rdx, [R2] - call Fr_rawMMul - pop rdx - ret - -;;;;;;;;;;;;;;;;;;;;;; -; toMontgomery -;;;;;;;;;;;;;;;;;;;;;; -; Convert a number to Montgomery -; rdi <= Destination -; rdi <= Pointer element to convert -; Modified registers: -; r8, r9, 10, r11, rax, rcx -;;;;;;;;;;;;;;;;;;;; -Fr_toMontgomery: - mov rax, [rsi] - bt rax, 62 ; check if montgomery - jc toMontgomery_doNothing - bt rax, 63 - jc toMontgomeryLong - -toMontgomeryShort: - movsx rdx, eax - mov [rdi], rdx - add rdi, 8 - lea rsi, [R2] - cmp rdx, 0 - js negMontgomeryShort -posMontgomeryShort: - call Fr_rawMMul1 - sub rdi, 8 - mov r11b, 0x40 - shl r11d, 24 - mov [rdi+4], r11d - ret - -negMontgomeryShort: - neg rdx ; Do the multiplication positive and then negate the result. - call Fr_rawMMul1 - mov rsi, rdi - call rawNegL - sub rdi, 8 - mov r11b, 0x40 - shl r11d, 24 - mov [rdi+4], r11d - ret - - -toMontgomeryLong: - mov [rdi], rax - add rdi, 8 - add rsi, 8 - lea rdx, [R2] - call Fr_rawMMul - sub rsi, 8 - sub rdi, 8 - mov r11b, 0xC0 - shl r11d, 24 - mov [rdi+4], r11d - ret - - -toMontgomery_doNothing: - call Fr_copy - ret - -;;;;;;;;;;;;;;;;;;;;;; -; toNormal -;;;;;;;;;;;;;;;;;;;;;; -; Convert a number from Montgomery -; rdi <= Destination -; rsi <= Pointer element to convert -; Modified registers: -; r8, r9, 10, r11, rax, rcx -;;;;;;;;;;;;;;;;;;;; -Fr_toNormal: - mov rax, [rsi] - bt rax, 62 ; check if montgomery - jnc toNormal_doNothing - bt rax, 63 ; if short, it means it's converted - jnc toNormal_doNothing - -toNormalLong: - add rdi, 8 - add rsi, 8 - call Fr_rawFromMontgomery - sub rsi, 8 - sub rdi, 8 - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - ret - -toNormal_doNothing: - call Fr_copy - ret - -;;;;;;;;;;;;;;;;;;;;;; -; toLongNormal -;;;;;;;;;;;;;;;;;;;;;; -; Convert a number to long normal -; rdi <= Destination -; rsi <= Pointer element to convert -; Modified registers: -; r8, r9, 10, r11, rax, rcx -;;;;;;;;;;;;;;;;;;;; -Fr_toLongNormal: - mov rax, [rsi] - bt rax, 63 ; check if long - jnc toLongNormal_fromShort - bt rax, 62 ; check if montgomery - jc toLongNormal_fromMontgomery - call Fr_copy ; It is already long - ret - -toLongNormal_fromMontgomery: - add rdi, 8 - add rsi, 8 - call Fr_rawFromMontgomery - sub rsi, 8 - sub rdi, 8 - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - ret - -toLongNormal_fromShort: - mov r8, rsi ; save rsi - movsx rsi, eax - call rawCopyS2L - mov rsi, r8 ; recover rsi - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - ret - - - - - - - - - - - - -;;;;;;;;;;;;;;;;;;;;;; -; add -;;;;;;;;;;;;;;;;;;;;;; -; Adds two elements of any kind -; Params: -; rsi <= Pointer to element 1 -; rdx <= Pointer to element 2 -; rdi <= Pointer to result -; Modified Registers: -; r8, r9, 10, r11, rax, rcx -;;;;;;;;;;;;;;;;;;;;;; -Fr_add: - push rbp - push rsi - push rdx - mov rbp, rsp - mov rax, [rsi] - mov rcx, [rdx] - bt rax, 63 ; Check if is short first operand - jc add_l1 - bt rcx, 63 ; Check if is short second operand - jc add_s1l2 - -add_s1s2: ; Both operands are short - - xor rdx, rdx - mov edx, eax - add edx, ecx - jo add_manageOverflow ; rsi already is the 64bits result - - mov [rdi], rdx ; not necessary to adjust so just save and return - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - -add_manageOverflow: ; Do the operation in 64 bits - push rsi - movsx rsi, eax - movsx rdx, ecx - add rsi, rdx - call rawCopyS2L - pop rsi - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - -add_l1: - bt rcx, 63 ; Check if is short second operand - jc add_l1l2 - -;;;;;;;; -add_l1s2: - bt rax, 62 ; check if montgomery first - jc add_l1ms2 -add_l1ns2: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - add rsi, 8 - movsx rdx, ecx - add rdi, 8 - cmp rdx, 0 - - jns tmp_1 - neg rdx - call rawSubLS - sub rdi, 8 - sub rsi, 8 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret -tmp_1: - call rawAddLS - sub rdi, 8 - sub rsi, 8 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - -add_l1ms2: - bt rcx, 62 ; check if montgomery second - jc add_l1ms2m -add_l1ms2n: - mov r11b, 0xC0 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toMontgomery - mov rdx, rdi - pop rdi - pop rsi - - - add rdi, 8 - add rsi, 8 - add rdx, 8 - call rawAddLL - sub rdi, 8 - sub rsi, 8 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -add_l1ms2m: - mov r11b, 0xC0 - shl r11d, 24 - mov [rdi+4], r11d - - add rdi, 8 - add rsi, 8 - add rdx, 8 - call rawAddLL - sub rdi, 8 - sub rsi, 8 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - -;;;;;;;; -add_s1l2: - bt rcx, 62 ; check if montgomery second - jc add_s1l2m -add_s1l2n: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - lea rsi, [rdx + 8] - movsx rdx, eax - add rdi, 8 - cmp rdx, 0 - - jns tmp_2 - neg rdx - call rawSubLS - sub rdi, 8 - sub rsi, 8 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret -tmp_2: - call rawAddLS - sub rdi, 8 - sub rsi, 8 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -add_s1l2m: - bt rax, 62 ; check if montgomery first - jc add_s1ml2m -add_s1nl2m: - mov r11b, 0xC0 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toMontgomery - mov rsi, rdi - pop rdi - pop rdx - - - add rdi, 8 - add rsi, 8 - add rdx, 8 - call rawAddLL - sub rdi, 8 - sub rsi, 8 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -add_s1ml2m: - mov r11b, 0xC0 - shl r11d, 24 - mov [rdi+4], r11d - - add rdi, 8 - add rsi, 8 - add rdx, 8 - call rawAddLL - sub rdi, 8 - sub rsi, 8 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -;;;; -add_l1l2: - bt rax, 62 ; check if montgomery first - jc add_l1ml2 -add_l1nl2: - bt rcx, 62 ; check if montgomery second - jc add_l1nl2m -add_l1nl2n: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - add rdi, 8 - add rsi, 8 - add rdx, 8 - call rawAddLL - sub rdi, 8 - sub rsi, 8 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -add_l1nl2m: - mov r11b, 0xC0 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toMontgomery - mov rsi, rdi - pop rdi - pop rdx - - - add rdi, 8 - add rsi, 8 - add rdx, 8 - call rawAddLL - sub rdi, 8 - sub rsi, 8 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -add_l1ml2: - bt rcx, 62 ; check if montgomery seconf - jc add_l1ml2m -add_l1ml2n: - mov r11b, 0xC0 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toMontgomery - mov rdx, rdi - pop rdi - pop rsi - - - add rdi, 8 - add rsi, 8 - add rdx, 8 - call rawAddLL - sub rdi, 8 - sub rsi, 8 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -add_l1ml2m: - mov r11b, 0xC0 - shl r11d, 24 - mov [rdi+4], r11d - - add rdi, 8 - add rsi, 8 - add rdx, 8 - call rawAddLL - sub rdi, 8 - sub rsi, 8 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - - -;;;;;;;;;;;;;;;;;;;;;; -; rawAddLL -;;;;;;;;;;;;;;;;;;;;;; -; Adds two elements of type long -; Params: -; rsi <= Pointer to the long data of element 1 -; rdx <= Pointer to the long data of element 2 -; rdi <= Pointer to the long data of result -; Modified Registers: -; rax -;;;;;;;;;;;;;;;;;;;;;; -rawAddLL: -Fr_rawAdd: - ; Add component by component with carry - - mov rax, [rsi + 0] - add rax, [rdx + 0] - mov [rdi + 0], rax - - mov rax, [rsi + 8] - adc rax, [rdx + 8] - mov [rdi + 8], rax - - mov rax, [rsi + 16] - adc rax, [rdx + 16] - mov [rdi + 16], rax - - mov rax, [rsi + 24] - adc rax, [rdx + 24] - mov [rdi + 24], rax - - jc rawAddLL_sq ; if overflow, substract q - - ; Compare with q - - - cmp rax, [q + 24] - jc rawAddLL_done ; q is bigget so done. - jnz rawAddLL_sq ; q is lower - - - mov rax, [rdi + 16] - - cmp rax, [q + 16] - jc rawAddLL_done ; q is bigget so done. - jnz rawAddLL_sq ; q is lower - - - mov rax, [rdi + 8] - - cmp rax, [q + 8] - jc rawAddLL_done ; q is bigget so done. - jnz rawAddLL_sq ; q is lower - - - mov rax, [rdi + 0] - - cmp rax, [q + 0] - jc rawAddLL_done ; q is bigget so done. - jnz rawAddLL_sq ; q is lower - - ; If equal substract q -rawAddLL_sq: - - mov rax, [q + 0] - sub [rdi + 0], rax - - mov rax, [q + 8] - sbb [rdi + 8], rax - - mov rax, [q + 16] - sbb [rdi + 16], rax - - mov rax, [q + 24] - sbb [rdi + 24], rax - -rawAddLL_done: - ret - - -;;;;;;;;;;;;;;;;;;;;;; -; rawAddLS -;;;;;;;;;;;;;;;;;;;;;; -; Adds two elements of type long -; Params: -; rdi <= Pointer to the long data of result -; rsi <= Pointer to the long data of element 1 -; rdx <= Value to be added -;;;;;;;;;;;;;;;;;;;;;; -rawAddLS: - ; Add component by component with carry - - add rdx, [rsi] - mov [rdi] ,rdx - - mov rdx, 0 - adc rdx, [rsi + 8] - mov [rdi + 8], rdx - - mov rdx, 0 - adc rdx, [rsi + 16] - mov [rdi + 16], rdx - - mov rdx, 0 - adc rdx, [rsi + 24] - mov [rdi + 24], rdx - - jc rawAddLS_sq ; if overflow, substract q - - ; Compare with q - - mov rax, [rdi + 24] - cmp rax, [q + 24] - jc rawAddLS_done ; q is bigget so done. - jnz rawAddLS_sq ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 16] - jc rawAddLS_done ; q is bigget so done. - jnz rawAddLS_sq ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 8] - jc rawAddLS_done ; q is bigget so done. - jnz rawAddLS_sq ; q is lower - - mov rax, [rdi + 0] - cmp rax, [q + 0] - jc rawAddLS_done ; q is bigget so done. - jnz rawAddLS_sq ; q is lower - - ; If equal substract q -rawAddLS_sq: - - mov rax, [q + 0] - sub [rdi + 0], rax - - mov rax, [q + 8] - sbb [rdi + 8], rax - - mov rax, [q + 16] - sbb [rdi + 16], rax - - mov rax, [q + 24] - sbb [rdi + 24], rax - -rawAddLS_done: - ret - - - - - - - - - - - - - - - -;;;;;;;;;;;;;;;;;;;;;; -; sub -;;;;;;;;;;;;;;;;;;;;;; -; Substracts two elements of any kind -; Params: -; rsi <= Pointer to element 1 -; rdx <= Pointer to element 2 -; rdi <= Pointer to result -; Modified Registers: -; r8, r9, 10, r11, rax, rcx -;;;;;;;;;;;;;;;;;;;;;; -Fr_sub: - push rbp - push rsi - push rdx - mov rbp, rsp - mov rax, [rsi] - mov rcx, [rdx] - bt rax, 63 ; Check if is long first operand - jc sub_l1 - bt rcx, 63 ; Check if is long second operand - jc sub_s1l2 - -sub_s1s2: ; Both operands are short - - xor rdx, rdx - mov edx, eax - sub edx, ecx - jo sub_manageOverflow ; rsi already is the 64bits result - - mov [rdi], rdx ; not necessary to adjust so just save and return - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - -sub_manageOverflow: ; Do the operation in 64 bits - push rsi - movsx rsi, eax - movsx rdx, ecx - sub rsi, rdx - call rawCopyS2L - pop rsi - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - -sub_l1: - bt rcx, 63 ; Check if is short second operand - jc sub_l1l2 - -;;;;;;;; -sub_l1s2: - bt rax, 62 ; check if montgomery first - jc sub_l1ms2 -sub_l1ns2: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - add rsi, 8 - movsx rdx, ecx - add rdi, 8 - cmp rdx, 0 - - jns tmp_3 - neg rdx - call rawAddLS - sub rdi, 8 - sub rsi, 8 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret -tmp_3: - call rawSubLS - sub rdi, 8 - sub rsi, 8 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -sub_l1ms2: - bt rcx, 62 ; check if montgomery second - jc sub_l1ms2m -sub_l1ms2n: - mov r11b, 0xC0 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toMontgomery - mov rdx, rdi - pop rdi - pop rsi - - - add rdi, 8 - add rsi, 8 - add rdx, 8 - call rawSubLL - sub rdi, 8 - sub rsi, 8 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -sub_l1ms2m: - mov r11b, 0xC0 - shl r11d, 24 - mov [rdi+4], r11d - - add rdi, 8 - add rsi, 8 - add rdx, 8 - call rawSubLL - sub rdi, 8 - sub rsi, 8 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - -;;;;;;;; -sub_s1l2: - bt rcx, 62 ; check if montgomery first - jc sub_s1l2m -sub_s1l2n: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - cmp eax, 0 - - js tmp_4 - - ; First Operand is positive - push rsi - add rdi, 8 - movsx rsi, eax - add rdx, 8 - call rawSubSL - sub rdi, 8 - pop rsi - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - -tmp_4: ; First operand is negative - push rsi - lea rsi, [rdx + 8] - movsx rdx, eax - add rdi, 8 - neg rdx - call rawNegLS - sub rdi, 8 - pop rsi - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -sub_s1l2m: - bt rax, 62 ; check if montgomery second - jc sub_s1ml2m -sub_s1nl2m: - mov r11b, 0xC0 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toMontgomery - mov rsi, rdi - pop rdi - pop rdx - - - add rdi, 8 - add rsi, 8 - add rdx, 8 - call rawSubLL - sub rdi, 8 - sub rsi, 8 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -sub_s1ml2m: - mov r11b, 0xC0 - shl r11d, 24 - mov [rdi+4], r11d - - add rdi, 8 - add rsi, 8 - add rdx, 8 - call rawSubLL - sub rdi, 8 - sub rsi, 8 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -;;;; -sub_l1l2: - bt rax, 62 ; check if montgomery first - jc sub_l1ml2 -sub_l1nl2: - bt rcx, 62 ; check if montgomery second - jc sub_l1nl2m -sub_l1nl2n: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - add rdi, 8 - add rsi, 8 - add rdx, 8 - call rawSubLL - sub rdi, 8 - sub rsi, 8 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -sub_l1nl2m: - mov r11b, 0xC0 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toMontgomery - mov rsi, rdi - pop rdi - pop rdx - - - add rdi, 8 - add rsi, 8 - add rdx, 8 - call rawSubLL - sub rdi, 8 - sub rsi, 8 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -sub_l1ml2: - bt rcx, 62 ; check if montgomery seconf - jc sub_l1ml2m -sub_l1ml2n: - mov r11b, 0xC0 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toMontgomery - mov rdx, rdi - pop rdi - pop rsi - - - add rdi, 8 - add rsi, 8 - add rdx, 8 - call rawSubLL - sub rdi, 8 - sub rsi, 8 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -sub_l1ml2m: - mov r11b, 0xC0 - shl r11d, 24 - mov [rdi+4], r11d - - add rdi, 8 - add rsi, 8 - add rdx, 8 - call rawSubLL - sub rdi, 8 - sub rsi, 8 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - -;;;;;;;;;;;;;;;;;;;;;; -; rawSubLS -;;;;;;;;;;;;;;;;;;;;;; -; Substracts a short element from the long element -; Params: -; rdi <= Pointer to the long data of result -; rsi <= Pointer to the long data of element 1 where will be substracted -; rdx <= Value to be substracted -; [rdi] = [rsi] - rdx -; Modified Registers: -; rax -;;;;;;;;;;;;;;;;;;;;;; -rawSubLS: - ; Substract first digit - - mov rax, [rsi] - sub rax, rdx - mov [rdi] ,rax - mov rdx, 0 - - mov rax, [rsi + 8] - sbb rax, rdx - mov [rdi + 8], rax - - mov rax, [rsi + 16] - sbb rax, rdx - mov [rdi + 16], rax - - mov rax, [rsi + 24] - sbb rax, rdx - mov [rdi + 24], rax - - jnc rawSubLS_done ; if overflow, add q - - ; Add q -rawSubLS_aq: - - mov rax, [q + 0] - add [rdi + 0], rax - - mov rax, [q + 8] - adc [rdi + 8], rax - - mov rax, [q + 16] - adc [rdi + 16], rax - - mov rax, [q + 24] - adc [rdi + 24], rax - -rawSubLS_done: - ret - - -;;;;;;;;;;;;;;;;;;;;;; -; rawSubSL -;;;;;;;;;;;;;;;;;;;;;; -; Substracts a long element from a short element -; Params: -; rdi <= Pointer to the long data of result -; rsi <= Value from where will bo substracted -; rdx <= Pointer to long of the value to be substracted -; -; [rdi] = rsi - [rdx] -; Modified Registers: -; rax -;;;;;;;;;;;;;;;;;;;;;; -rawSubSL: - ; Substract first digit - sub rsi, [rdx] - mov [rdi] ,rsi - - - mov rax, 0 - sbb rax, [rdx + 8] - mov [rdi + 8], rax - - mov rax, 0 - sbb rax, [rdx + 16] - mov [rdi + 16], rax - - mov rax, 0 - sbb rax, [rdx + 24] - mov [rdi + 24], rax - - jnc rawSubSL_done ; if overflow, add q - - ; Add q -rawSubSL_aq: - - mov rax, [q + 0] - add [rdi + 0], rax - - mov rax, [q + 8] - adc [rdi + 8], rax - - mov rax, [q + 16] - adc [rdi + 16], rax - - mov rax, [q + 24] - adc [rdi + 24], rax - -rawSubSL_done: - ret - -;;;;;;;;;;;;;;;;;;;;;; -; rawSubLL -;;;;;;;;;;;;;;;;;;;;;; -; Substracts a long element from a short element -; Params: -; rdi <= Pointer to the long data of result -; rsi <= Pointer to long from where substracted -; rdx <= Pointer to long of the value to be substracted -; -; [rdi] = [rsi] - [rdx] -; Modified Registers: -; rax -;;;;;;;;;;;;;;;;;;;;;; -rawSubLL: -Fr_rawSub: - ; Substract first digit - - mov rax, [rsi + 0] - sub rax, [rdx + 0] - mov [rdi + 0], rax - - mov rax, [rsi + 8] - sbb rax, [rdx + 8] - mov [rdi + 8], rax - - mov rax, [rsi + 16] - sbb rax, [rdx + 16] - mov [rdi + 16], rax - - mov rax, [rsi + 24] - sbb rax, [rdx + 24] - mov [rdi + 24], rax - - jnc rawSubLL_done ; if overflow, add q - - ; Add q -rawSubLL_aq: - - mov rax, [q + 0] - add [rdi + 0], rax - - mov rax, [q + 8] - adc [rdi + 8], rax - - mov rax, [q + 16] - adc [rdi + 16], rax - - mov rax, [q + 24] - adc [rdi + 24], rax - -rawSubLL_done: - ret - -;;;;;;;;;;;;;;;;;;;;;; -; rawNegLS -;;;;;;;;;;;;;;;;;;;;;; -; Substracts a long element and a short element form 0 -; Params: -; rdi <= Pointer to the long data of result -; rsi <= Pointer to long from where substracted -; rdx <= short value to be substracted too -; -; [rdi] = -[rsi] - rdx -; Modified Registers: -; rax -;;;;;;;;;;;;;;;;;;;;;; -rawNegLS: - mov rax, [q] - sub rax, rdx - mov [rdi], rax - - mov rax, [q + 8 ] - sbb rax, 0 - mov [rdi + 8], rax - - mov rax, [q + 16 ] - sbb rax, 0 - mov [rdi + 16], rax - - mov rax, [q + 24 ] - sbb rax, 0 - mov [rdi + 24], rax - - setc dl - - - mov rax, [rdi + 0 ] - sub rax, [rsi + 0] - mov [rdi + 0], rax - - mov rax, [rdi + 8 ] - sbb rax, [rsi + 8] - mov [rdi + 8], rax - - mov rax, [rdi + 16 ] - sbb rax, [rsi + 16] - mov [rdi + 16], rax - - mov rax, [rdi + 24 ] - sbb rax, [rsi + 24] - mov [rdi + 24], rax - - - setc dh - or dl, dh - jz rawNegSL_done - - ; it is a negative value, so add q - - mov rax, [q + 0] - add [rdi + 0], rax - - mov rax, [q + 8] - adc [rdi + 8], rax - - mov rax, [q + 16] - adc [rdi + 16], rax - - mov rax, [q + 24] - adc [rdi + 24], rax - - -rawNegSL_done: - ret - - - - - - - -;;;;;;;;;;;;;;;;;;;;;; -; neg -;;;;;;;;;;;;;;;;;;;;;; -; Adds two elements of any kind -; Params: -; rsi <= Pointer to element to be negated -; rdi <= Pointer to result -; [rdi] = -[rsi] -;;;;;;;;;;;;;;;;;;;;;; -Fr_neg: - mov rax, [rsi] - bt rax, 63 ; Check if is short first operand - jc neg_l - -neg_s: ; Operand is short - - neg eax - jo neg_manageOverflow ; Check if overflow. (0x80000000 is the only case) - - mov [rdi], rax ; not necessary to adjust so just save and return - ret - -neg_manageOverflow: ; Do the operation in 64 bits - push rsi - movsx rsi, eax - neg rsi - call rawCopyS2L - pop rsi - ret - - - -neg_l: - mov [rdi], rax ; Copy the type - - add rdi, 8 - add rsi, 8 - call rawNegL - sub rdi, 8 - sub rsi, 8 - ret - - - -;;;;;;;;;;;;;;;;;;;;;; -; rawNeg -;;;;;;;;;;;;;;;;;;;;;; -; Negates a value -; Params: -; rdi <= Pointer to the long data of result -; rsi <= Pointer to the long data of element 1 -; -; [rdi] = - [rsi] -;;;;;;;;;;;;;;;;;;;;;; -rawNegL: -Fr_rawNeg: - ; Compare is zero - - xor rax, rax - - cmp [rsi + 0], rax - jnz doNegate - - cmp [rsi + 8], rax - jnz doNegate - - cmp [rsi + 16], rax - jnz doNegate - - cmp [rsi + 24], rax - jnz doNegate - - ; it's zero so just set to zero - - mov [rdi + 0], rax - - mov [rdi + 8], rax - - mov [rdi + 16], rax - - mov [rdi + 24], rax - - ret -doNegate: - - mov rax, [q + 0] - sub rax, [rsi + 0] - mov [rdi + 0], rax - - mov rax, [q + 8] - sbb rax, [rsi + 8] - mov [rdi + 8], rax - - mov rax, [q + 16] - sbb rax, [rsi + 16] - mov [rdi + 16], rax - - mov rax, [q + 24] - sbb rax, [rsi + 24] - mov [rdi + 24], rax - - ret - - - - - - - - - - - - - - - - - - - -;;;;;;;;;;;;;;;;;;;;;; -; square -;;;;;;;;;;;;;;;;;;;;;; -; Squares a field element -; Params: -; rsi <= Pointer to element 1 -; rdi <= Pointer to result -; [rdi] = [rsi] * [rsi] -; Modified Registers: -; r8, r9, 10, r11, rax, rcx -;;;;;;;;;;;;;;;;;;;;;; -Fr_square: - mov r8, [rsi] - bt r8, 63 ; Check if is short first operand - jc square_l1 - -square_s1: ; Both operands are short - - xor rax, rax - mov eax, r8d - imul eax - jo square_manageOverflow ; rsi already is the 64bits result - - mov [rdi], rax ; not necessary to adjust so just save and return - -square_manageOverflow: ; Do the operation in 64 bits - push rsi - movsx rax, r8d - imul rax - mov rsi, rax - call rawCopyS2L - pop rsi - - ret - -square_l1: - bt r8, 62 ; check if montgomery first - jc square_l1m -square_l1n: - mov r11b, 0xC0 - shl r11d, 24 - mov [rdi+4], r11d - - add rdi, 8 - add rsi, 8 - call Fr_rawMSquare - sub rdi, 8 - sub rsi, 8 - - - push rsi - add rdi, 8 - mov rsi, rdi - lea rdx, [R3] - call Fr_rawMMul - sub rdi, 8 - pop rsi - - ret - -square_l1m: - mov r11b, 0xC0 - shl r11d, 24 - mov [rdi+4], r11d - - add rdi, 8 - add rsi, 8 - call Fr_rawMSquare - sub rdi, 8 - sub rsi, 8 - - ret - - - -;;;;;;;;;;;;;;;;;;;;;; -; mul -;;;;;;;;;;;;;;;;;;;;;; -; Multiplies two elements of any kind -; Params: -; rsi <= Pointer to element 1 -; rdx <= Pointer to element 2 -; rdi <= Pointer to result -; [rdi] = [rsi] * [rdi] -; Modified Registers: -; r8, r9, 10, r11, rax, rcx -;;;;;;;;;;;;;;;;;;;;;; -Fr_mul: - mov r8, [rsi] - mov r9, [rdx] - bt r8, 63 ; Check if is short first operand - jc mul_l1 - bt r9, 63 ; Check if is short second operand - jc mul_s1l2 - -mul_s1s2: ; Both operands are short - - xor rax, rax - mov eax, r8d - imul r9d - jo mul_manageOverflow ; rsi already is the 64bits result - - mov [rdi], rax ; not necessary to adjust so just save and return - -mul_manageOverflow: ; Do the operation in 64 bits - push rsi - movsx rax, r8d - movsx rcx, r9d - imul rcx - mov rsi, rax - call rawCopyS2L - pop rsi - - ret - -mul_l1: - bt r9, 63 ; Check if is short second operand - jc mul_l1l2 - -;;;;;;;; -mul_l1s2: - bt r8, 62 ; check if montgomery first - jc mul_l1ms2 -mul_l1ns2: - bt r9, 62 ; check if montgomery first - jc mul_l1ns2m -mul_l1ns2n: - mov r11b, 0xC0 - shl r11d, 24 - mov [rdi+4], r11d - - push rsi - add rsi, 8 - movsx rdx, r9d - add rdi, 8 - cmp rdx, 0 - - jns tmp_5 - neg rdx - call Fr_rawMMul1 - mov rsi, rdi - call rawNegL - sub rdi, 8 - pop rsi - - jmp tmp_6 -tmp_5: - call Fr_rawMMul1 - sub rdi, 8 - pop rsi -tmp_6: - - - - push rsi - add rdi, 8 - mov rsi, rdi - lea rdx, [R3] - call Fr_rawMMul - sub rdi, 8 - pop rsi - - ret - - -mul_l1ns2m: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - add rdi, 8 - add rsi, 8 - add rdx, 8 - call Fr_rawMMul - sub rdi, 8 - sub rsi, 8 - - ret - - -mul_l1ms2: - bt r9, 62 ; check if montgomery second - jc mul_l1ms2m -mul_l1ms2n: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - push rsi - add rsi, 8 - movsx rdx, r9d - add rdi, 8 - cmp rdx, 0 - - jns tmp_7 - neg rdx - call Fr_rawMMul1 - mov rsi, rdi - call rawNegL - sub rdi, 8 - pop rsi - - jmp tmp_8 -tmp_7: - call Fr_rawMMul1 - sub rdi, 8 - pop rsi -tmp_8: - - - ret - -mul_l1ms2m: - mov r11b, 0xC0 - shl r11d, 24 - mov [rdi+4], r11d - - add rdi, 8 - add rsi, 8 - add rdx, 8 - call Fr_rawMMul - sub rdi, 8 - sub rsi, 8 - - ret - - -;;;;;;;; -mul_s1l2: - bt r8, 62 ; check if montgomery first - jc mul_s1ml2 -mul_s1nl2: - bt r9, 62 ; check if montgomery first - jc mul_s1nl2m -mul_s1nl2n: - mov r11b, 0xC0 - shl r11d, 24 - mov [rdi+4], r11d - - push rsi - lea rsi, [rdx + 8] - movsx rdx, r8d - add rdi, 8 - cmp rdx, 0 - - jns tmp_9 - neg rdx - call Fr_rawMMul1 - mov rsi, rdi - call rawNegL - sub rdi, 8 - pop rsi - - jmp tmp_10 -tmp_9: - call Fr_rawMMul1 - sub rdi, 8 - pop rsi -tmp_10: - - - - push rsi - add rdi, 8 - mov rsi, rdi - lea rdx, [R3] - call Fr_rawMMul - sub rdi, 8 - pop rsi - - ret - -mul_s1nl2m: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - push rsi - lea rsi, [rdx + 8] - movsx rdx, r8d - add rdi, 8 - cmp rdx, 0 - - jns tmp_11 - neg rdx - call Fr_rawMMul1 - mov rsi, rdi - call rawNegL - sub rdi, 8 - pop rsi - - jmp tmp_12 -tmp_11: - call Fr_rawMMul1 - sub rdi, 8 - pop rsi -tmp_12: - - - ret - -mul_s1ml2: - bt r9, 62 ; check if montgomery first - jc mul_s1ml2m -mul_s1ml2n: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - add rdi, 8 - add rsi, 8 - add rdx, 8 - call Fr_rawMMul - sub rdi, 8 - sub rsi, 8 - - ret - -mul_s1ml2m: - mov r11b, 0xC0 - shl r11d, 24 - mov [rdi+4], r11d - - add rdi, 8 - add rsi, 8 - add rdx, 8 - call Fr_rawMMul - sub rdi, 8 - sub rsi, 8 - - ret - -;;;; -mul_l1l2: - bt r8, 62 ; check if montgomery first - jc mul_l1ml2 -mul_l1nl2: - bt r9, 62 ; check if montgomery second - jc mul_l1nl2m -mul_l1nl2n: - mov r11b, 0xC0 - shl r11d, 24 - mov [rdi+4], r11d - - add rdi, 8 - add rsi, 8 - add rdx, 8 - call Fr_rawMMul - sub rdi, 8 - sub rsi, 8 - - - push rsi - add rdi, 8 - mov rsi, rdi - lea rdx, [R3] - call Fr_rawMMul - sub rdi, 8 - pop rsi - - ret - -mul_l1nl2m: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - add rdi, 8 - add rsi, 8 - add rdx, 8 - call Fr_rawMMul - sub rdi, 8 - sub rsi, 8 - - ret - -mul_l1ml2: - bt r9, 62 ; check if montgomery seconf - jc mul_l1ml2m -mul_l1ml2n: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - add rdi, 8 - add rsi, 8 - add rdx, 8 - call Fr_rawMMul - sub rdi, 8 - sub rsi, 8 - - ret - -mul_l1ml2m: - mov r11b, 0xC0 - shl r11d, 24 - mov [rdi+4], r11d - - add rdi, 8 - add rsi, 8 - add rdx, 8 - call Fr_rawMMul - sub rdi, 8 - sub rsi, 8 - - ret - - - - - - - - - - - - - - - - - - - -;;;;;;;;;;;;;;;;;;;;;; -; band -;;;;;;;;;;;;;;;;;;;;;; -; Adds two elements of any kind -; Params: -; rsi <= Pointer to element 1 -; rdx <= Pointer to element 2 -; rdi <= Pointer to result -; Modified Registers: -; r8, r9, 10, r11, rax, rcx -;;;;;;;;;;;;;;;;;;;;;; -Fr_band: - push rbp - push rsi - push rdx - mov rbp, rsp - mov rax, [rsi] - mov rcx, [rdx] - bt rax, 63 ; Check if is short first operand - jc and_l1 - bt rcx, 63 ; Check if is short second operand - jc and_s1l2 - -and_s1s2: - - cmp eax, 0 - - js tmp_13 - - cmp ecx, 0 - js tmp_13 - xor rdx, rdx ; both ops are positive so do the op and return - mov edx, eax - and edx, ecx - mov [rdi], rdx ; not necessary to adjust so just save and return - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - -tmp_13: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toLongNormal - mov rdx, rdi - pop rdi - pop rsi - - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toLongNormal - mov rsi, rdi - pop rdi - pop rdx - - - - mov rax, [rsi + 8] - and rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - and rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - and rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - and rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_15 ; q is bigget so done. - jnz tmp_14 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_15 ; q is bigget so done. - jnz tmp_14 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_15 ; q is bigget so done. - jnz tmp_14 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_15 ; q is bigget so done. - jnz tmp_14 ; q is lower - - ; If equal substract q -tmp_14: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_15: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - - - - -and_l1: - bt rcx, 63 ; Check if is short second operand - jc and_l1l2 - - -and_l1s2: - bt rax, 62 ; check if montgomery first - jc and_l1ms2 -and_l1ns2: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov rcx, [rdx] - cmp ecx, 0 - - js tmp_16 - movsx rax, ecx - and rax, [rsi +8] - mov [rdi+8], rax - - xor rax, rax - and rax, [rsi + 16]; - - mov [rdi + 16 ], rax; - - xor rax, rax - and rax, [rsi + 24]; - - mov [rdi + 24 ], rax; - - xor rax, rax - and rax, [rsi + 32]; - - and rax, [lboMask] ; - - mov [rdi + 32 ], rax; - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_18 ; q is bigget so done. - jnz tmp_17 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_18 ; q is bigget so done. - jnz tmp_17 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_18 ; q is bigget so done. - jnz tmp_17 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_18 ; q is bigget so done. - jnz tmp_17 ; q is lower - - ; If equal substract q -tmp_17: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_18: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - -tmp_16: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toLongNormal - mov rdx, rdi - pop rdi - pop rsi - - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - - mov rax, [rsi + 8] - and rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - and rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - and rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - and rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_20 ; q is bigget so done. - jnz tmp_19 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_20 ; q is bigget so done. - jnz tmp_19 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_20 ; q is bigget so done. - jnz tmp_19 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_20 ; q is bigget so done. - jnz tmp_19 ; q is lower - - ; If equal substract q -tmp_19: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_20: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - - -and_l1ms2: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toNormal - mov rsi, rdi - pop rdi - pop rdx - - - mov rcx, [rdx] - cmp ecx, 0 - - js tmp_21 - movsx rax, ecx - and rax, [rsi +8] - mov [rdi+8], rax - - xor rax, rax - and rax, [rsi + 16]; - - mov [rdi + 16 ], rax; - - xor rax, rax - and rax, [rsi + 24]; - - mov [rdi + 24 ], rax; - - xor rax, rax - and rax, [rsi + 32]; - - and rax, [lboMask] ; - - mov [rdi + 32 ], rax; - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_23 ; q is bigget so done. - jnz tmp_22 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_23 ; q is bigget so done. - jnz tmp_22 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_23 ; q is bigget so done. - jnz tmp_22 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_23 ; q is bigget so done. - jnz tmp_22 ; q is lower - - ; If equal substract q -tmp_22: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_23: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - -tmp_21: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toLongNormal - mov rdx, rdi - pop rdi - pop rsi - - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - - mov rax, [rsi + 8] - and rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - and rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - and rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - and rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_25 ; q is bigget so done. - jnz tmp_24 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_25 ; q is bigget so done. - jnz tmp_24 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_25 ; q is bigget so done. - jnz tmp_24 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_25 ; q is bigget so done. - jnz tmp_24 ; q is lower - - ; If equal substract q -tmp_24: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_25: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - - - -and_s1l2: - bt rcx, 62 ; check if montgomery first - jc and_s1l2m -and_s1l2n: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov eax, [rsi] - cmp eax, 0 - - js tmp_26 - and rax, [rdx +8] - mov [rdi+8], rax - - xor rax, rax - and rax, [rdx + 16] - - mov [rdi + 16 ], rax - - xor rax, rax - and rax, [rdx + 24] - - mov [rdi + 24 ], rax - - xor rax, rax - and rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_28 ; q is bigget so done. - jnz tmp_27 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_28 ; q is bigget so done. - jnz tmp_27 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_28 ; q is bigget so done. - jnz tmp_27 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_28 ; q is bigget so done. - jnz tmp_27 ; q is lower - - ; If equal substract q -tmp_27: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_28: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - -tmp_26: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toLongNormal - mov rsi, rdi - pop rdi - pop rdx - - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - - mov rax, [rsi + 8] - and rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - and rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - and rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - and rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_30 ; q is bigget so done. - jnz tmp_29 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_30 ; q is bigget so done. - jnz tmp_29 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_30 ; q is bigget so done. - jnz tmp_29 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_30 ; q is bigget so done. - jnz tmp_29 ; q is lower - - ; If equal substract q -tmp_29: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_30: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - - -and_s1l2m: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toNormal - mov rdx, rdi - pop rdi - pop rsi - - - mov eax, [rsi] - cmp eax, 0 - - js tmp_31 - and rax, [rdx +8] - mov [rdi+8], rax - - xor rax, rax - and rax, [rdx + 16] - - mov [rdi + 16 ], rax - - xor rax, rax - and rax, [rdx + 24] - - mov [rdi + 24 ], rax - - xor rax, rax - and rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_33 ; q is bigget so done. - jnz tmp_32 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_33 ; q is bigget so done. - jnz tmp_32 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_33 ; q is bigget so done. - jnz tmp_32 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_33 ; q is bigget so done. - jnz tmp_32 ; q is lower - - ; If equal substract q -tmp_32: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_33: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - -tmp_31: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toLongNormal - mov rsi, rdi - pop rdi - pop rdx - - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - - mov rax, [rsi + 8] - and rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - and rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - and rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - and rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_35 ; q is bigget so done. - jnz tmp_34 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_35 ; q is bigget so done. - jnz tmp_34 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_35 ; q is bigget so done. - jnz tmp_34 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_35 ; q is bigget so done. - jnz tmp_34 ; q is lower - - ; If equal substract q -tmp_34: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_35: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - - - -and_l1l2: - bt rax, 62 ; check if montgomery first - jc and_l1ml2 - bt rcx, 62 ; check if montgomery first - jc and_l1nl2m -and_l1nl2n: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - - mov rax, [rsi + 8] - and rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - and rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - and rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - and rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_37 ; q is bigget so done. - jnz tmp_36 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_37 ; q is bigget so done. - jnz tmp_36 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_37 ; q is bigget so done. - jnz tmp_36 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_37 ; q is bigget so done. - jnz tmp_36 ; q is lower - - ; If equal substract q -tmp_36: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_37: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -and_l1nl2m: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toNormal - mov rdx, rdi - pop rdi - pop rsi - - - - mov rax, [rsi + 8] - and rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - and rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - and rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - and rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_39 ; q is bigget so done. - jnz tmp_38 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_39 ; q is bigget so done. - jnz tmp_38 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_39 ; q is bigget so done. - jnz tmp_38 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_39 ; q is bigget so done. - jnz tmp_38 ; q is lower - - ; If equal substract q -tmp_38: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_39: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -and_l1ml2: - bt rcx, 62 ; check if montgomery first - jc and_l1ml2m -and_l1ml2n: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toNormal - mov rsi, rdi - pop rdi - pop rdx - - - - mov rax, [rsi + 8] - and rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - and rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - and rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - and rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_41 ; q is bigget so done. - jnz tmp_40 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_41 ; q is bigget so done. - jnz tmp_40 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_41 ; q is bigget so done. - jnz tmp_40 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_41 ; q is bigget so done. - jnz tmp_40 ; q is lower - - ; If equal substract q -tmp_40: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_41: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -and_l1ml2m: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toNormal - mov rsi, rdi - pop rdi - pop rdx - - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toNormal - mov rdx, rdi - pop rdi - pop rsi - - - - mov rax, [rsi + 8] - and rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - and rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - and rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - and rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_43 ; q is bigget so done. - jnz tmp_42 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_43 ; q is bigget so done. - jnz tmp_42 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_43 ; q is bigget so done. - jnz tmp_42 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_43 ; q is bigget so done. - jnz tmp_42 ; q is lower - - ; If equal substract q -tmp_42: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_43: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - -;;;;;;;;;;;;;;;;;;;;;; -; bor -;;;;;;;;;;;;;;;;;;;;;; -; Adds two elements of any kind -; Params: -; rsi <= Pointer to element 1 -; rdx <= Pointer to element 2 -; rdi <= Pointer to result -; Modified Registers: -; r8, r9, 10, r11, rax, rcx -;;;;;;;;;;;;;;;;;;;;;; -Fr_bor: - push rbp - push rsi - push rdx - mov rbp, rsp - mov rax, [rsi] - mov rcx, [rdx] - bt rax, 63 ; Check if is short first operand - jc or_l1 - bt rcx, 63 ; Check if is short second operand - jc or_s1l2 - -or_s1s2: - - cmp eax, 0 - - js tmp_44 - - cmp ecx, 0 - js tmp_44 - xor rdx, rdx ; both ops are positive so do the op and return - mov edx, eax - or edx, ecx - mov [rdi], rdx ; not necessary to adjust so just save and return - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - -tmp_44: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toLongNormal - mov rdx, rdi - pop rdi - pop rsi - - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toLongNormal - mov rsi, rdi - pop rdi - pop rdx - - - - mov rax, [rsi + 8] - or rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - or rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - or rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - or rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_46 ; q is bigget so done. - jnz tmp_45 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_46 ; q is bigget so done. - jnz tmp_45 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_46 ; q is bigget so done. - jnz tmp_45 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_46 ; q is bigget so done. - jnz tmp_45 ; q is lower - - ; If equal substract q -tmp_45: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_46: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - - - - -or_l1: - bt rcx, 63 ; Check if is short second operand - jc or_l1l2 - - -or_l1s2: - bt rax, 62 ; check if montgomery first - jc or_l1ms2 -or_l1ns2: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov rcx, [rdx] - cmp ecx, 0 - - js tmp_47 - movsx rax, ecx - or rax, [rsi +8] - mov [rdi+8], rax - - xor rax, rax - or rax, [rsi + 16]; - - mov [rdi + 16 ], rax; - - xor rax, rax - or rax, [rsi + 24]; - - mov [rdi + 24 ], rax; - - xor rax, rax - or rax, [rsi + 32]; - - and rax, [lboMask] ; - - mov [rdi + 32 ], rax; - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_49 ; q is bigget so done. - jnz tmp_48 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_49 ; q is bigget so done. - jnz tmp_48 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_49 ; q is bigget so done. - jnz tmp_48 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_49 ; q is bigget so done. - jnz tmp_48 ; q is lower - - ; If equal substract q -tmp_48: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_49: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - -tmp_47: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toLongNormal - mov rdx, rdi - pop rdi - pop rsi - - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - - mov rax, [rsi + 8] - or rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - or rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - or rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - or rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_51 ; q is bigget so done. - jnz tmp_50 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_51 ; q is bigget so done. - jnz tmp_50 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_51 ; q is bigget so done. - jnz tmp_50 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_51 ; q is bigget so done. - jnz tmp_50 ; q is lower - - ; If equal substract q -tmp_50: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_51: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - - -or_l1ms2: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toNormal - mov rsi, rdi - pop rdi - pop rdx - - - mov rcx, [rdx] - cmp ecx, 0 - - js tmp_52 - movsx rax, ecx - or rax, [rsi +8] - mov [rdi+8], rax - - xor rax, rax - or rax, [rsi + 16]; - - mov [rdi + 16 ], rax; - - xor rax, rax - or rax, [rsi + 24]; - - mov [rdi + 24 ], rax; - - xor rax, rax - or rax, [rsi + 32]; - - and rax, [lboMask] ; - - mov [rdi + 32 ], rax; - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_54 ; q is bigget so done. - jnz tmp_53 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_54 ; q is bigget so done. - jnz tmp_53 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_54 ; q is bigget so done. - jnz tmp_53 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_54 ; q is bigget so done. - jnz tmp_53 ; q is lower - - ; If equal substract q -tmp_53: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_54: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - -tmp_52: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toLongNormal - mov rdx, rdi - pop rdi - pop rsi - - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - - mov rax, [rsi + 8] - or rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - or rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - or rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - or rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_56 ; q is bigget so done. - jnz tmp_55 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_56 ; q is bigget so done. - jnz tmp_55 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_56 ; q is bigget so done. - jnz tmp_55 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_56 ; q is bigget so done. - jnz tmp_55 ; q is lower - - ; If equal substract q -tmp_55: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_56: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - - - -or_s1l2: - bt rcx, 62 ; check if montgomery first - jc or_s1l2m -or_s1l2n: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov eax, [rsi] - cmp eax, 0 - - js tmp_57 - or rax, [rdx +8] - mov [rdi+8], rax - - xor rax, rax - or rax, [rdx + 16] - - mov [rdi + 16 ], rax - - xor rax, rax - or rax, [rdx + 24] - - mov [rdi + 24 ], rax - - xor rax, rax - or rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_59 ; q is bigget so done. - jnz tmp_58 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_59 ; q is bigget so done. - jnz tmp_58 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_59 ; q is bigget so done. - jnz tmp_58 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_59 ; q is bigget so done. - jnz tmp_58 ; q is lower - - ; If equal substract q -tmp_58: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_59: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - -tmp_57: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toLongNormal - mov rsi, rdi - pop rdi - pop rdx - - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - - mov rax, [rsi + 8] - or rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - or rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - or rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - or rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_61 ; q is bigget so done. - jnz tmp_60 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_61 ; q is bigget so done. - jnz tmp_60 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_61 ; q is bigget so done. - jnz tmp_60 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_61 ; q is bigget so done. - jnz tmp_60 ; q is lower - - ; If equal substract q -tmp_60: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_61: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - - -or_s1l2m: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toNormal - mov rdx, rdi - pop rdi - pop rsi - - - mov eax, [rsi] - cmp eax, 0 - - js tmp_62 - or rax, [rdx +8] - mov [rdi+8], rax - - xor rax, rax - or rax, [rdx + 16] - - mov [rdi + 16 ], rax - - xor rax, rax - or rax, [rdx + 24] - - mov [rdi + 24 ], rax - - xor rax, rax - or rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_64 ; q is bigget so done. - jnz tmp_63 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_64 ; q is bigget so done. - jnz tmp_63 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_64 ; q is bigget so done. - jnz tmp_63 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_64 ; q is bigget so done. - jnz tmp_63 ; q is lower - - ; If equal substract q -tmp_63: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_64: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - -tmp_62: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toLongNormal - mov rsi, rdi - pop rdi - pop rdx - - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - - mov rax, [rsi + 8] - or rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - or rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - or rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - or rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_66 ; q is bigget so done. - jnz tmp_65 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_66 ; q is bigget so done. - jnz tmp_65 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_66 ; q is bigget so done. - jnz tmp_65 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_66 ; q is bigget so done. - jnz tmp_65 ; q is lower - - ; If equal substract q -tmp_65: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_66: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - - - -or_l1l2: - bt rax, 62 ; check if montgomery first - jc or_l1ml2 - bt rcx, 62 ; check if montgomery first - jc or_l1nl2m -or_l1nl2n: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - - mov rax, [rsi + 8] - or rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - or rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - or rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - or rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_68 ; q is bigget so done. - jnz tmp_67 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_68 ; q is bigget so done. - jnz tmp_67 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_68 ; q is bigget so done. - jnz tmp_67 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_68 ; q is bigget so done. - jnz tmp_67 ; q is lower - - ; If equal substract q -tmp_67: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_68: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -or_l1nl2m: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toNormal - mov rdx, rdi - pop rdi - pop rsi - - - - mov rax, [rsi + 8] - or rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - or rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - or rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - or rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_70 ; q is bigget so done. - jnz tmp_69 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_70 ; q is bigget so done. - jnz tmp_69 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_70 ; q is bigget so done. - jnz tmp_69 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_70 ; q is bigget so done. - jnz tmp_69 ; q is lower - - ; If equal substract q -tmp_69: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_70: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -or_l1ml2: - bt rcx, 62 ; check if montgomery first - jc or_l1ml2m -or_l1ml2n: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toNormal - mov rsi, rdi - pop rdi - pop rdx - - - - mov rax, [rsi + 8] - or rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - or rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - or rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - or rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_72 ; q is bigget so done. - jnz tmp_71 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_72 ; q is bigget so done. - jnz tmp_71 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_72 ; q is bigget so done. - jnz tmp_71 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_72 ; q is bigget so done. - jnz tmp_71 ; q is lower - - ; If equal substract q -tmp_71: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_72: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -or_l1ml2m: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toNormal - mov rsi, rdi - pop rdi - pop rdx - - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toNormal - mov rdx, rdi - pop rdi - pop rsi - - - - mov rax, [rsi + 8] - or rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - or rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - or rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - or rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_74 ; q is bigget so done. - jnz tmp_73 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_74 ; q is bigget so done. - jnz tmp_73 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_74 ; q is bigget so done. - jnz tmp_73 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_74 ; q is bigget so done. - jnz tmp_73 ; q is lower - - ; If equal substract q -tmp_73: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_74: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - -;;;;;;;;;;;;;;;;;;;;;; -; bxor -;;;;;;;;;;;;;;;;;;;;;; -; Adds two elements of any kind -; Params: -; rsi <= Pointer to element 1 -; rdx <= Pointer to element 2 -; rdi <= Pointer to result -; Modified Registers: -; r8, r9, 10, r11, rax, rcx -;;;;;;;;;;;;;;;;;;;;;; -Fr_bxor: - push rbp - push rsi - push rdx - mov rbp, rsp - mov rax, [rsi] - mov rcx, [rdx] - bt rax, 63 ; Check if is short first operand - jc xor_l1 - bt rcx, 63 ; Check if is short second operand - jc xor_s1l2 - -xor_s1s2: - - cmp eax, 0 - - js tmp_75 - - cmp ecx, 0 - js tmp_75 - xor rdx, rdx ; both ops are positive so do the op and return - mov edx, eax - xor edx, ecx - mov [rdi], rdx ; not necessary to adjust so just save and return - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - -tmp_75: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toLongNormal - mov rdx, rdi - pop rdi - pop rsi - - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toLongNormal - mov rsi, rdi - pop rdi - pop rdx - - - - mov rax, [rsi + 8] - xor rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - xor rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - xor rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - xor rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_77 ; q is bigget so done. - jnz tmp_76 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_77 ; q is bigget so done. - jnz tmp_76 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_77 ; q is bigget so done. - jnz tmp_76 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_77 ; q is bigget so done. - jnz tmp_76 ; q is lower - - ; If equal substract q -tmp_76: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_77: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - - - - -xor_l1: - bt rcx, 63 ; Check if is short second operand - jc xor_l1l2 - - -xor_l1s2: - bt rax, 62 ; check if montgomery first - jc xor_l1ms2 -xor_l1ns2: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov rcx, [rdx] - cmp ecx, 0 - - js tmp_78 - movsx rax, ecx - xor rax, [rsi +8] - mov [rdi+8], rax - - xor rax, rax - xor rax, [rsi + 16]; - - mov [rdi + 16 ], rax; - - xor rax, rax - xor rax, [rsi + 24]; - - mov [rdi + 24 ], rax; - - xor rax, rax - xor rax, [rsi + 32]; - - and rax, [lboMask] ; - - mov [rdi + 32 ], rax; - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_80 ; q is bigget so done. - jnz tmp_79 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_80 ; q is bigget so done. - jnz tmp_79 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_80 ; q is bigget so done. - jnz tmp_79 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_80 ; q is bigget so done. - jnz tmp_79 ; q is lower - - ; If equal substract q -tmp_79: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_80: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - -tmp_78: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toLongNormal - mov rdx, rdi - pop rdi - pop rsi - - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - - mov rax, [rsi + 8] - xor rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - xor rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - xor rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - xor rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_82 ; q is bigget so done. - jnz tmp_81 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_82 ; q is bigget so done. - jnz tmp_81 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_82 ; q is bigget so done. - jnz tmp_81 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_82 ; q is bigget so done. - jnz tmp_81 ; q is lower - - ; If equal substract q -tmp_81: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_82: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - - -xor_l1ms2: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toNormal - mov rsi, rdi - pop rdi - pop rdx - - - mov rcx, [rdx] - cmp ecx, 0 - - js tmp_83 - movsx rax, ecx - xor rax, [rsi +8] - mov [rdi+8], rax - - xor rax, rax - xor rax, [rsi + 16]; - - mov [rdi + 16 ], rax; - - xor rax, rax - xor rax, [rsi + 24]; - - mov [rdi + 24 ], rax; - - xor rax, rax - xor rax, [rsi + 32]; - - and rax, [lboMask] ; - - mov [rdi + 32 ], rax; - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_85 ; q is bigget so done. - jnz tmp_84 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_85 ; q is bigget so done. - jnz tmp_84 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_85 ; q is bigget so done. - jnz tmp_84 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_85 ; q is bigget so done. - jnz tmp_84 ; q is lower - - ; If equal substract q -tmp_84: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_85: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - -tmp_83: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toLongNormal - mov rdx, rdi - pop rdi - pop rsi - - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - - mov rax, [rsi + 8] - xor rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - xor rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - xor rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - xor rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_87 ; q is bigget so done. - jnz tmp_86 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_87 ; q is bigget so done. - jnz tmp_86 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_87 ; q is bigget so done. - jnz tmp_86 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_87 ; q is bigget so done. - jnz tmp_86 ; q is lower - - ; If equal substract q -tmp_86: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_87: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - - - -xor_s1l2: - bt rcx, 62 ; check if montgomery first - jc xor_s1l2m -xor_s1l2n: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov eax, [rsi] - cmp eax, 0 - - js tmp_88 - xor rax, [rdx +8] - mov [rdi+8], rax - - xor rax, rax - xor rax, [rdx + 16] - - mov [rdi + 16 ], rax - - xor rax, rax - xor rax, [rdx + 24] - - mov [rdi + 24 ], rax - - xor rax, rax - xor rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_90 ; q is bigget so done. - jnz tmp_89 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_90 ; q is bigget so done. - jnz tmp_89 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_90 ; q is bigget so done. - jnz tmp_89 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_90 ; q is bigget so done. - jnz tmp_89 ; q is lower - - ; If equal substract q -tmp_89: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_90: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - -tmp_88: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toLongNormal - mov rsi, rdi - pop rdi - pop rdx - - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - - mov rax, [rsi + 8] - xor rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - xor rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - xor rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - xor rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_92 ; q is bigget so done. - jnz tmp_91 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_92 ; q is bigget so done. - jnz tmp_91 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_92 ; q is bigget so done. - jnz tmp_91 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_92 ; q is bigget so done. - jnz tmp_91 ; q is lower - - ; If equal substract q -tmp_91: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_92: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - - -xor_s1l2m: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toNormal - mov rdx, rdi - pop rdi - pop rsi - - - mov eax, [rsi] - cmp eax, 0 - - js tmp_93 - xor rax, [rdx +8] - mov [rdi+8], rax - - xor rax, rax - xor rax, [rdx + 16] - - mov [rdi + 16 ], rax - - xor rax, rax - xor rax, [rdx + 24] - - mov [rdi + 24 ], rax - - xor rax, rax - xor rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_95 ; q is bigget so done. - jnz tmp_94 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_95 ; q is bigget so done. - jnz tmp_94 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_95 ; q is bigget so done. - jnz tmp_94 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_95 ; q is bigget so done. - jnz tmp_94 ; q is lower - - ; If equal substract q -tmp_94: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_95: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - -tmp_93: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toLongNormal - mov rsi, rdi - pop rdi - pop rdx - - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - - mov rax, [rsi + 8] - xor rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - xor rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - xor rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - xor rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_97 ; q is bigget so done. - jnz tmp_96 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_97 ; q is bigget so done. - jnz tmp_96 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_97 ; q is bigget so done. - jnz tmp_96 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_97 ; q is bigget so done. - jnz tmp_96 ; q is lower - - ; If equal substract q -tmp_96: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_97: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - - - -xor_l1l2: - bt rax, 62 ; check if montgomery first - jc xor_l1ml2 - bt rcx, 62 ; check if montgomery first - jc xor_l1nl2m -xor_l1nl2n: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - - mov rax, [rsi + 8] - xor rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - xor rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - xor rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - xor rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_99 ; q is bigget so done. - jnz tmp_98 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_99 ; q is bigget so done. - jnz tmp_98 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_99 ; q is bigget so done. - jnz tmp_98 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_99 ; q is bigget so done. - jnz tmp_98 ; q is lower - - ; If equal substract q -tmp_98: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_99: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -xor_l1nl2m: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toNormal - mov rdx, rdi - pop rdi - pop rsi - - - - mov rax, [rsi + 8] - xor rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - xor rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - xor rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - xor rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_101 ; q is bigget so done. - jnz tmp_100 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_101 ; q is bigget so done. - jnz tmp_100 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_101 ; q is bigget so done. - jnz tmp_100 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_101 ; q is bigget so done. - jnz tmp_100 ; q is lower - - ; If equal substract q -tmp_100: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_101: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -xor_l1ml2: - bt rcx, 62 ; check if montgomery first - jc xor_l1ml2m -xor_l1ml2n: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toNormal - mov rsi, rdi - pop rdi - pop rdx - - - - mov rax, [rsi + 8] - xor rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - xor rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - xor rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - xor rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_103 ; q is bigget so done. - jnz tmp_102 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_103 ; q is bigget so done. - jnz tmp_102 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_103 ; q is bigget so done. - jnz tmp_102 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_103 ; q is bigget so done. - jnz tmp_102 ; q is lower - - ; If equal substract q -tmp_102: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_103: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -xor_l1ml2m: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toNormal - mov rsi, rdi - pop rdi - pop rdx - - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toNormal - mov rdx, rdi - pop rdi - pop rsi - - - - mov rax, [rsi + 8] - xor rax, [rdx + 8] - - mov [rdi + 8 ], rax - - mov rax, [rsi + 16] - xor rax, [rdx + 16] - - mov [rdi + 16 ], rax - - mov rax, [rsi + 24] - xor rax, [rdx + 24] - - mov [rdi + 24 ], rax - - mov rax, [rsi + 32] - xor rax, [rdx + 32] - - and rax, [lboMask] - - mov [rdi + 32 ], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_105 ; q is bigget so done. - jnz tmp_104 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_105 ; q is bigget so done. - jnz tmp_104 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_105 ; q is bigget so done. - jnz tmp_104 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_105 ; q is bigget so done. - jnz tmp_104 ; q is lower - - ; If equal substract q -tmp_104: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_105: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - - -;;;;;;;;;;;;;;;;;;;;;; -; bnot -;;;;;;;;;;;;;;;;;;;;;; -; Adds two elements of any kind -; Params: -; rsi <= Pointer to element 1 -; rdi <= Pointer to result -; Modified Registers: -; r8, r9, 10, r11, rax, rcx -;;;;;;;;;;;;;;;;;;;;;; -Fr_bnot: - push rbp - push rsi - push rdx - mov rbp, rsp - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - - mov rax, [rsi] - bt rax, 63 ; Check if is long operand - jc bnot_l1 -bnot_s: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toLongNormal - mov rsi, rdi - pop rdi - pop rdx - - jmp bnot_l1n - -bnot_l1: - bt rax, 62 ; check if montgomery first - jnc bnot_l1n - -bnot_l1m: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toNormal - mov rsi, rdi - pop rdi - pop rdx - - -bnot_l1n: - - mov rax, [rsi + 8] - not rax - - mov [rdi + 8], rax - - mov rax, [rsi + 16] - not rax - - mov [rdi + 16], rax - - mov rax, [rsi + 24] - not rax - - mov [rdi + 24], rax - - mov rax, [rsi + 32] - not rax - - and rax, [lboMask] - - mov [rdi + 32], rax - - - - - - ; Compare with q - - mov rax, [rdi + 32] - cmp rax, [q + 24] - jc tmp_107 ; q is bigget so done. - jnz tmp_106 ; q is lower - - mov rax, [rdi + 24] - cmp rax, [q + 16] - jc tmp_107 ; q is bigget so done. - jnz tmp_106 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 8] - jc tmp_107 ; q is bigget so done. - jnz tmp_106 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 0] - jc tmp_107 ; q is bigget so done. - jnz tmp_106 ; q is lower - - ; If equal substract q -tmp_106: - - mov rax, [q + 0] - sub [rdi + 8], rax - - mov rax, [q + 8] - sbb [rdi + 16], rax - - mov rax, [q + 16] - sbb [rdi + 24], rax - - mov rax, [q + 24] - sbb [rdi + 32], rax - -tmp_107: - - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - - -;;;;;;;;;;;;;;;;;;;;;; -; rawShr -;;;;;;;;;;;;;;;;;;;;;; -; Adds two elements of any kind -; Params: -; rsi <= Pointer to element 1 -; rdx <= how much is shifted -; rdi <= Pointer to result -; Modified Registers: -; r8, r9, 10, r11, rax, rcx -;;;;;;;;;;;;;;;;;;;;;; -rawShr: - cmp rdx, 0 - je Fr_rawCopy - - cmp rdx, 254 - jae Fr_rawZero - -rawShr_nz: - mov r8, rdx - shr r8,6 - mov rcx, rdx - and rcx, 0x3F - jz rawShr_aligned - mov ch, 64 - sub ch, cl - - mov r9, 1 - rol cx, 8 - shl r9, cl - rol cx, 8 - sub r9, 1 - mov r10, r9 - not r10 - - - cmp r8, 3 - jae rawShr_if2_0 - - mov rax, [rsi + r8*8 + 0 ] - shr rax, cl - and rax, r9 - mov r11, [rsi + r8*8 + 8 ] - rol cx, 8 - shl r11, cl - rol cx, 8 - and r11, r10 - or rax, r11 - mov [rdi + 0], rax - - jmp rawShr_endif_0 -rawShr_if2_0: - jne rawShr_else_0 - - mov rax, [rsi + r8*8 + 0 ] - shr rax, cl - and rax, r9 - mov [rdi + 0], rax - - jmp rawShr_endif_0 -rawShr_else_0: - xor rax, rax - mov [rdi + 0], rax -rawShr_endif_0: - - cmp r8, 2 - jae rawShr_if2_1 - - mov rax, [rsi + r8*8 + 8 ] - shr rax, cl - and rax, r9 - mov r11, [rsi + r8*8 + 16 ] - rol cx, 8 - shl r11, cl - rol cx, 8 - and r11, r10 - or rax, r11 - mov [rdi + 8], rax - - jmp rawShr_endif_1 -rawShr_if2_1: - jne rawShr_else_1 - - mov rax, [rsi + r8*8 + 8 ] - shr rax, cl - and rax, r9 - mov [rdi + 8], rax - - jmp rawShr_endif_1 -rawShr_else_1: - xor rax, rax - mov [rdi + 8], rax -rawShr_endif_1: - - cmp r8, 1 - jae rawShr_if2_2 - - mov rax, [rsi + r8*8 + 16 ] - shr rax, cl - and rax, r9 - mov r11, [rsi + r8*8 + 24 ] - rol cx, 8 - shl r11, cl - rol cx, 8 - and r11, r10 - or rax, r11 - mov [rdi + 16], rax - - jmp rawShr_endif_2 -rawShr_if2_2: - jne rawShr_else_2 - - mov rax, [rsi + r8*8 + 16 ] - shr rax, cl - and rax, r9 - mov [rdi + 16], rax - - jmp rawShr_endif_2 -rawShr_else_2: - xor rax, rax - mov [rdi + 16], rax -rawShr_endif_2: - - cmp r8, 0 - jae rawShr_if2_3 - - mov rax, [rsi + r8*8 + 24 ] - shr rax, cl - and rax, r9 - mov r11, [rsi + r8*8 + 32 ] - rol cx, 8 - shl r11, cl - rol cx, 8 - and r11, r10 - or rax, r11 - mov [rdi + 24], rax - - jmp rawShr_endif_3 -rawShr_if2_3: - jne rawShr_else_3 - - mov rax, [rsi + r8*8 + 24 ] - shr rax, cl - and rax, r9 - mov [rdi + 24], rax - - jmp rawShr_endif_3 -rawShr_else_3: - xor rax, rax - mov [rdi + 24], rax -rawShr_endif_3: - - - ret - -rawShr_aligned: - - cmp r8, 3 - ja rawShr_if3_0 - mov rax, [rsi + r8*8 + 0 ] - mov [rdi + 0], rax - jmp rawShr_endif3_0 -rawShr_if3_0: - xor rax, rax - mov [rdi + 0], rax -rawShr_endif3_0: - - cmp r8, 2 - ja rawShr_if3_1 - mov rax, [rsi + r8*8 + 8 ] - mov [rdi + 8], rax - jmp rawShr_endif3_1 -rawShr_if3_1: - xor rax, rax - mov [rdi + 8], rax -rawShr_endif3_1: - - cmp r8, 1 - ja rawShr_if3_2 - mov rax, [rsi + r8*8 + 16 ] - mov [rdi + 16], rax - jmp rawShr_endif3_2 -rawShr_if3_2: - xor rax, rax - mov [rdi + 16], rax -rawShr_endif3_2: - - cmp r8, 0 - ja rawShr_if3_3 - mov rax, [rsi + r8*8 + 24 ] - mov [rdi + 24], rax - jmp rawShr_endif3_3 -rawShr_if3_3: - xor rax, rax - mov [rdi + 24], rax -rawShr_endif3_3: - - ret - - -;;;;;;;;;;;;;;;;;;;;;; -; rawShl -;;;;;;;;;;;;;;;;;;;;;; -; Adds two elements of any kind -; Params: -; rsi <= Pointer to element 1 -; rdx <= how much is shifted -; rdi <= Pointer to result -; Modified Registers: -; r8, r9, 10, r11, rax, rcx -;;;;;;;;;;;;;;;;;;;;;; -rawShl: - cmp rdx, 0 - je Fr_rawCopy - - cmp rdx, 254 - jae Fr_rawZero - - mov r8, rdx - shr r8,6 - mov rcx, rdx - and rcx, 0x3F - jz rawShl_aligned - mov ch, 64 - sub ch, cl - - - mov r10, 1 - shl r10, cl - sub r10, 1 - mov r9, r10 - not r9 - - mov rdx, rsi - mov rax, r8 - shl rax, 3 - sub rdx, rax - - - cmp r8, 3 - jae rawShl_if2_3 - - mov rax, [rdx + 24 ] - shl rax, cl - and rax, r9 - mov r11, [rdx + 16 ] - rol cx, 8 - shr r11, cl - rol cx, 8 - and r11, r10 - or rax, r11 - - and rax, [lboMask] - - - mov [rdi + 24], rax - - jmp rawShl_endif_3 -rawShl_if2_3: - jne rawShl_else_3 - - mov rax, [rdx + 24 ] - shl rax, cl - and rax, r9 - - and rax, [lboMask] - - - mov [rdi + 24], rax - - jmp rawShl_endif_3 -rawShl_else_3: - xor rax, rax - mov [rdi + 24], rax -rawShl_endif_3: - - cmp r8, 2 - jae rawShl_if2_2 - - mov rax, [rdx + 16 ] - shl rax, cl - and rax, r9 - mov r11, [rdx + 8 ] - rol cx, 8 - shr r11, cl - rol cx, 8 - and r11, r10 - or rax, r11 - - - mov [rdi + 16], rax - - jmp rawShl_endif_2 -rawShl_if2_2: - jne rawShl_else_2 - - mov rax, [rdx + 16 ] - shl rax, cl - and rax, r9 - - - mov [rdi + 16], rax - - jmp rawShl_endif_2 -rawShl_else_2: - xor rax, rax - mov [rdi + 16], rax -rawShl_endif_2: - - cmp r8, 1 - jae rawShl_if2_1 - - mov rax, [rdx + 8 ] - shl rax, cl - and rax, r9 - mov r11, [rdx + 0 ] - rol cx, 8 - shr r11, cl - rol cx, 8 - and r11, r10 - or rax, r11 - - - mov [rdi + 8], rax - - jmp rawShl_endif_1 -rawShl_if2_1: - jne rawShl_else_1 - - mov rax, [rdx + 8 ] - shl rax, cl - and rax, r9 - - - mov [rdi + 8], rax - - jmp rawShl_endif_1 -rawShl_else_1: - xor rax, rax - mov [rdi + 8], rax -rawShl_endif_1: - - cmp r8, 0 - jae rawShl_if2_0 - - mov rax, [rdx + 0 ] - shl rax, cl - and rax, r9 - mov r11, [rdx + -8 ] - rol cx, 8 - shr r11, cl - rol cx, 8 - and r11, r10 - or rax, r11 - - - mov [rdi + 0], rax - - jmp rawShl_endif_0 -rawShl_if2_0: - jne rawShl_else_0 - - mov rax, [rdx + 0 ] - shl rax, cl - and rax, r9 - - - mov [rdi + 0], rax - - jmp rawShl_endif_0 -rawShl_else_0: - xor rax, rax - mov [rdi + 0], rax -rawShl_endif_0: - - - - - - - ; Compare with q - - mov rax, [rdi + 24] - cmp rax, [q + 24] - jc tmp_109 ; q is bigget so done. - jnz tmp_108 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 16] - jc tmp_109 ; q is bigget so done. - jnz tmp_108 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 8] - jc tmp_109 ; q is bigget so done. - jnz tmp_108 ; q is lower - - mov rax, [rdi + 0] - cmp rax, [q + 0] - jc tmp_109 ; q is bigget so done. - jnz tmp_108 ; q is lower - - ; If equal substract q -tmp_108: - - mov rax, [q + 0] - sub [rdi + 0], rax - - mov rax, [q + 8] - sbb [rdi + 8], rax - - mov rax, [q + 16] - sbb [rdi + 16], rax - - mov rax, [q + 24] - sbb [rdi + 24], rax - -tmp_109: - - ret; - -rawShl_aligned: - mov rdx, rsi - mov rax, r8 - shl rax, 3 - sub rdx, rax - - - cmp r8, 3 - ja rawShl_if3_3 - mov rax, [rdx + 24 ] - - and rax, [lboMask] - - mov [rdi + 24], rax - jmp rawShl_endif3_3 -rawShl_if3_3: - xor rax, rax - mov [rdi + 24], rax -rawShl_endif3_3: - - cmp r8, 2 - ja rawShl_if3_2 - mov rax, [rdx + 16 ] - - mov [rdi + 16], rax - jmp rawShl_endif3_2 -rawShl_if3_2: - xor rax, rax - mov [rdi + 16], rax -rawShl_endif3_2: - - cmp r8, 1 - ja rawShl_if3_1 - mov rax, [rdx + 8 ] - - mov [rdi + 8], rax - jmp rawShl_endif3_1 -rawShl_if3_1: - xor rax, rax - mov [rdi + 8], rax -rawShl_endif3_1: - - cmp r8, 0 - ja rawShl_if3_0 - mov rax, [rdx + 0 ] - - mov [rdi + 0], rax - jmp rawShl_endif3_0 -rawShl_if3_0: - xor rax, rax - mov [rdi + 0], rax -rawShl_endif3_0: - - - - - - ; Compare with q - - mov rax, [rdi + 24] - cmp rax, [q + 24] - jc tmp_111 ; q is bigget so done. - jnz tmp_110 ; q is lower - - mov rax, [rdi + 16] - cmp rax, [q + 16] - jc tmp_111 ; q is bigget so done. - jnz tmp_110 ; q is lower - - mov rax, [rdi + 8] - cmp rax, [q + 8] - jc tmp_111 ; q is bigget so done. - jnz tmp_110 ; q is lower - - mov rax, [rdi + 0] - cmp rax, [q + 0] - jc tmp_111 ; q is bigget so done. - jnz tmp_110 ; q is lower - - ; If equal substract q -tmp_110: - - mov rax, [q + 0] - sub [rdi + 0], rax - - mov rax, [q + 8] - sbb [rdi + 8], rax - - mov rax, [q + 16] - sbb [rdi + 16], rax - - mov rax, [q + 24] - sbb [rdi + 24], rax - -tmp_111: - - ret - - - - - - -;;;;;;;;;;;;;;;;;;;;;; -; shr -;;;;;;;;;;;;;;;;;;;;;; -; Adds two elements of any kind -; Params: -; rsi <= Pointer to element 1 -; rdx <= Pointer to element 2 -; rdi <= Pointer to result -; Modified Registers: -; r8, r9, 10, r11, rax, rcx -;;;;;;;;;;;;;;;;;;;;;; -Fr_shr: - push rbp - push rsi - push rdi - push rdx - mov rbp, rsp - - - - - - - mov rcx, [rdx] - bt rcx, 63 ; Check if is short second operand - jnc tmp_112 - - ; long 2 - bt rcx, 62 ; Check if is montgomery second operand - jnc tmp_113 - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toNormal - mov rdx, rdi - pop rdi - pop rsi - -tmp_113: - mov rcx, [rdx + 8] - cmp rcx, 254 - jae tmp_114 - xor rax, rax - - cmp [rdx + 16], rax - jnz tmp_114 - - cmp [rdx + 24], rax - jnz tmp_114 - - cmp [rdx + 32], rax - jnz tmp_114 - - mov rdx, rcx - jmp do_shr - -tmp_114: - mov rcx, [q] - sub rcx, [rdx+8] - cmp rcx, 254 - jae setzero - mov rax, [q] - sub rax, [rdx+8] - - mov rax, [q+ 8] - sbb rax, [rdx + 16] - jnz setzero - - mov rax, [q+ 16] - sbb rax, [rdx + 24] - jnz setzero - - mov rax, [q+ 24] - sbb rax, [rdx + 32] - jnz setzero - - mov rdx, rcx - jmp do_shl - -tmp_112: - cmp ecx, 0 - jl tmp_115 - cmp ecx, 254 - jae setzero - movsx rdx, ecx - jmp do_shr -tmp_115: - neg ecx - cmp ecx, 254 - jae setzero - movsx rdx, ecx - jmp do_shl - - - - -;;;;;;;;;;;;;;;;;;;;;; -; shl -;;;;;;;;;;;;;;;;;;;;;; -; Adds two elements of any kind -; Params: -; rsi <= Pointer to element 1 -; rdx <= Pointer to element 2 -; rdi <= Pointer to result -; Modified Registers: -; r8, r9, 10, r11, rax, rcx -;;;;;;;;;;;;;;;;;;;;;; -Fr_shl: - push rbp - push rsi - push rdi - push rdx - mov rbp, rsp - - - - - - mov rcx, [rdx] - bt rcx, 63 ; Check if is short second operand - jnc tmp_116 - - ; long 2 - bt rcx, 62 ; Check if is montgomery second operand - jnc tmp_117 - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toNormal - mov rdx, rdi - pop rdi - pop rsi - -tmp_117: - mov rcx, [rdx + 8] - cmp rcx, 254 - jae tmp_118 - xor rax, rax - - cmp [rdx + 16], rax - jnz tmp_118 - - cmp [rdx + 24], rax - jnz tmp_118 - - cmp [rdx + 32], rax - jnz tmp_118 - - mov rdx, rcx - jmp do_shl - -tmp_118: - mov rcx, [q] - sub rcx, [rdx+8] - cmp rcx, 254 - jae setzero - mov rax, [q] - sub rax, [rdx+8] - - mov rax, [q+ 8] - sbb rax, [rdx + 16] - jnz setzero - - mov rax, [q+ 16] - sbb rax, [rdx + 24] - jnz setzero - - mov rax, [q+ 24] - sbb rax, [rdx + 32] - jnz setzero - - mov rdx, rcx - jmp do_shr - -tmp_116: - cmp ecx, 0 - jl tmp_119 - cmp ecx, 254 - jae setzero - movsx rdx, ecx - jmp do_shl -tmp_119: - neg ecx - cmp ecx, 254 - jae setzero - movsx rdx, ecx - jmp do_shr - - - -;;;;;;;;;; -;;; doShl -;;;;;;;;;; -do_shl: - mov rcx, [rsi] - bt rcx, 63 ; Check if is short second operand - jc do_shll -do_shls: - - movsx rax, ecx - cmp rax, 0 - jz setzero; - jl do_shlcl - - cmp rdx, 31 - jae do_shlcl - - mov cl, dl - shl rax, cl - mov rcx, rax - shr rcx, 31 - jnz do_shlcl - mov [rdi], rax - mov rsp, rbp - pop rdx - pop rdi - pop rsi - pop rbp - ret - -do_shlcl: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toLongNormal - mov rsi, rdi - pop rdi - pop rdx - - jmp do_shlln - -do_shll: - bt rcx, 62 ; Check if is short second operand - jnc do_shlln - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toNormal - mov rsi, rdi - pop rdi - pop rdx - -do_shlln: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - add rdi, 8 - add rsi, 8 - call rawShl - mov rsp, rbp - pop rdx - pop rdi - pop rsi - pop rbp - ret - - -;;;;;;;;;; -;;; doShr -;;;;;;;;;; -do_shr: - mov rcx, [rsi] - bt rcx, 63 ; Check if is short second operand - jc do_shrl -do_shrs: - movsx rax, ecx - cmp rax, 0 - jz setzero; - jl do_shrcl - - cmp rdx, 31 - jae setzero - - mov cl, dl - shr rax, cl - mov [rdi], rax - mov rsp, rbp - pop rdx - pop rdi - pop rsi - pop rbp - ret - -do_shrcl: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toLongNormal - mov rsi, rdi - pop rdi - pop rdx - - -do_shrl: - bt rcx, 62 ; Check if is short second operand - jnc do_shrln - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toNormal - mov rsi, rdi - pop rdi - pop rdx - -do_shrln: - mov r11b, 0x80 - shl r11d, 24 - mov [rdi+4], r11d - add rdi, 8 - add rsi, 8 - call rawShr - mov rsp, rbp - pop rdx - pop rdi - pop rsi - pop rbp - ret - -setzero: - xor rax, rax - mov [rdi], rax - mov rsp, rbp - pop rdx - pop rdi - pop rsi - pop rbp - ret - - - - - -;;;;;;;;;;;;;;;;;;;;;; -; rgt - Raw Greater Than -;;;;;;;;;;;;;;;;;;;;;; -; returns in ax 1 id *rsi > *rdx -; Params: -; rsi <= Pointer to element 1 -; rdx <= Pointer to element 2 -; rax <= Return 1 or 0 -; Modified Registers: -; r8, r9, rax -;;;;;;;;;;;;;;;;;;;;;; -Fr_rgt: - push rbp - push rsi - push rdx - mov rbp, rsp - mov r8, [rsi] - mov r9, [rdx] - bt r8, 63 ; Check if is short first operand - jc rgt_l1 - bt r9, 63 ; Check if is short second operand - jc rgt_s1l2 - -rgt_s1s2: ; Both operands are short - cmp r8d, r9d - jg rgt_ret1 - jmp rgt_ret0 - - -rgt_l1: - bt r9, 63 ; Check if is short second operand - jc rgt_l1l2 - -;;;;;;;; -rgt_l1s2: - bt r8, 62 ; check if montgomery first - jc rgt_l1ms2 -rgt_l1ns2: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toLongNormal - mov rdx, rdi - pop rdi - pop rsi - - jmp rgtL1L2 - -rgt_l1ms2: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toLongNormal - mov rdx, rdi - pop rdi - pop rsi - - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toNormal - mov rsi, rdi - pop rdi - pop rdx - - jmp rgtL1L2 - - -;;;;;;;; -rgt_s1l2: - bt r9, 62 ; check if montgomery second - jc rgt_s1l2m -rgt_s1l2n: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toLongNormal - mov rsi, rdi - pop rdi - pop rdx - - jmp rgtL1L2 - -rgt_s1l2m: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toLongNormal - mov rsi, rdi - pop rdi - pop rdx - - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toNormal - mov rdx, rdi - pop rdi - pop rsi - - jmp rgtL1L2 - -;;;; -rgt_l1l2: - bt r8, 62 ; check if montgomery first - jc rgt_l1ml2 -rgt_l1nl2: - bt r9, 62 ; check if montgomery second - jc rgt_l1nl2m -rgt_l1nl2n: - jmp rgtL1L2 - -rgt_l1nl2m: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toNormal - mov rdx, rdi - pop rdi - pop rsi - - jmp rgtL1L2 - -rgt_l1ml2: - bt r9, 62 ; check if montgomery second - jc rgt_l1ml2m -rgt_l1ml2n: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toNormal - mov rsi, rdi - pop rdi - pop rdx - - jmp rgtL1L2 - -rgt_l1ml2m: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toNormal - mov rsi, rdi - pop rdi - pop rdx - - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toNormal - mov rdx, rdi - pop rdi - pop rsi - - jmp rgtL1L2 - - -;;;;;; -; rgtL1L2 -;;;;;; - -rgtL1L2: - - - mov rax, [rsi + 32] - cmp [half + 24], rax ; comare with (q-1)/2 - jc rgtl1l2_n1 ; half e1-e2 is neg => e1 < e2 - - jnz rgtl1l2_p1 ; half>rax => e1 -e2 is pos => e1 > e2 - - - mov rax, [rsi + 24] - cmp [half + 16], rax ; comare with (q-1)/2 - jc rgtl1l2_n1 ; half e1-e2 is neg => e1 < e2 - - jnz rgtl1l2_p1 ; half>rax => e1 -e2 is pos => e1 > e2 - - - mov rax, [rsi + 16] - cmp [half + 8], rax ; comare with (q-1)/2 - jc rgtl1l2_n1 ; half e1-e2 is neg => e1 < e2 - - jnz rgtl1l2_p1 ; half>rax => e1 -e2 is pos => e1 > e2 - - - mov rax, [rsi + 8] - cmp [half + 0], rax ; comare with (q-1)/2 - jc rgtl1l2_n1 ; half e1-e2 is neg => e1 < e2 - - jmp rgtl1l2_p1 - - - -rgtl1l2_p1: - - - mov rax, [rdx + 32] - cmp [half + 24], rax ; comare with (q-1)/2 - jc rgt_ret1 ; half e1-e2 is neg => e1 < e2 - - jnz rgtRawL1L2 ; half>rax => e1 -e2 is pos => e1 > e2 - - - mov rax, [rdx + 24] - cmp [half + 16], rax ; comare with (q-1)/2 - jc rgt_ret1 ; half e1-e2 is neg => e1 < e2 - - jnz rgtRawL1L2 ; half>rax => e1 -e2 is pos => e1 > e2 - - - mov rax, [rdx + 16] - cmp [half + 8], rax ; comare with (q-1)/2 - jc rgt_ret1 ; half e1-e2 is neg => e1 < e2 - - jnz rgtRawL1L2 ; half>rax => e1 -e2 is pos => e1 > e2 - - - mov rax, [rdx + 8] - cmp [half + 0], rax ; comare with (q-1)/2 - jc rgt_ret1 ; half e1-e2 is neg => e1 < e2 - - jmp rgtRawL1L2 - - - - -rgtl1l2_n1: - - - mov rax, [rdx + 32] - cmp [half + 24], rax ; comare with (q-1)/2 - jc rgtRawL1L2 ; half e1-e2 is neg => e1 < e2 - - jnz rgt_ret0 ; half>rax => e1 -e2 is pos => e1 > e2 - - - mov rax, [rdx + 24] - cmp [half + 16], rax ; comare with (q-1)/2 - jc rgtRawL1L2 ; half e1-e2 is neg => e1 < e2 - - jnz rgt_ret0 ; half>rax => e1 -e2 is pos => e1 > e2 - - - mov rax, [rdx + 16] - cmp [half + 8], rax ; comare with (q-1)/2 - jc rgtRawL1L2 ; half e1-e2 is neg => e1 < e2 - - jnz rgt_ret0 ; half>rax => e1 -e2 is pos => e1 > e2 - - - mov rax, [rdx + 8] - cmp [half + 0], rax ; comare with (q-1)/2 - jc rgtRawL1L2 ; half e1-e2 is neg => e1 < e2 - - jmp rgt_ret0 - - - - - -rgtRawL1L2: - - mov rax, [rsi + 32] - cmp [rdx + 32], rax ; comare with (q-1)/2 - jc rgt_ret1 ; rsi 1st > 2nd - - jnz rgt_ret0 - - - mov rax, [rsi + 24] - cmp [rdx + 24], rax ; comare with (q-1)/2 - jc rgt_ret1 ; rsi 1st > 2nd - - jnz rgt_ret0 - - - mov rax, [rsi + 16] - cmp [rdx + 16], rax ; comare with (q-1)/2 - jc rgt_ret1 ; rsi 1st > 2nd - - jnz rgt_ret0 - - - mov rax, [rsi + 8] - cmp [rdx + 8], rax ; comare with (q-1)/2 - jc rgt_ret1 ; rsi 1st > 2nd - - - -rgt_ret0: - xor rax, rax - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret -rgt_ret1: - mov rax, 1 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - -;;;;;;;;;;;;;;;;;;;;;; -; rlt - Raw Less Than -;;;;;;;;;;;;;;;;;;;;;; -; returns in ax 1 id *rsi > *rdx -; Params: -; rsi <= Pointer to element 1 -; rdx <= Pointer to element 2 -; rax <= Return 1 or 0 -; Modified Registers: -; r8, r9, rax -;;;;;;;;;;;;;;;;;;;;;; -Fr_rlt: - push rbp - push rsi - push rdx - mov rbp, rsp - mov r8, [rsi] - mov r9, [rdx] - bt r8, 63 ; Check if is short first operand - jc rlt_l1 - bt r9, 63 ; Check if is short second operand - jc rlt_s1l2 - -rlt_s1s2: ; Both operands are short - cmp r8d, r9d - jl rlt_ret1 - jmp rlt_ret0 - - -rlt_l1: - bt r9, 63 ; Check if is short second operand - jc rlt_l1l2 - -;;;;;;;; -rlt_l1s2: - bt r8, 62 ; check if montgomery first - jc rlt_l1ms2 -rlt_l1ns2: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toLongNormal - mov rdx, rdi - pop rdi - pop rsi - - jmp rltL1L2 - -rlt_l1ms2: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toLongNormal - mov rdx, rdi - pop rdi - pop rsi - - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toNormal - mov rsi, rdi - pop rdi - pop rdx - - jmp rltL1L2 - - -;;;;;;;; -rlt_s1l2: - bt r9, 62 ; check if montgomery second - jc rlt_s1l2m -rlt_s1l2n: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toLongNormal - mov rsi, rdi - pop rdi - pop rdx - - jmp rltL1L2 - -rlt_s1l2m: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toLongNormal - mov rsi, rdi - pop rdi - pop rdx - - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toNormal - mov rdx, rdi - pop rdi - pop rsi - - jmp rltL1L2 - -;;;; -rlt_l1l2: - bt r8, 62 ; check if montgomery first - jc rlt_l1ml2 -rlt_l1nl2: - bt r9, 62 ; check if montgomery second - jc rlt_l1nl2m -rlt_l1nl2n: - jmp rltL1L2 - -rlt_l1nl2m: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toNormal - mov rdx, rdi - pop rdi - pop rsi - - jmp rltL1L2 - -rlt_l1ml2: - bt r9, 62 ; check if montgomery second - jc rlt_l1ml2m -rlt_l1ml2n: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toNormal - mov rsi, rdi - pop rdi - pop rdx - - jmp rltL1L2 - -rlt_l1ml2m: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toNormal - mov rsi, rdi - pop rdi - pop rdx - - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toNormal - mov rdx, rdi - pop rdi - pop rsi - - jmp rltL1L2 - - -;;;;;; -; rltL1L2 -;;;;;; - -rltL1L2: - - - mov rax, [rsi + 32] - cmp [half + 24], rax ; comare with (q-1)/2 - jc rltl1l2_n1 ; half e1-e2 is neg => e1 < e2 - - jnz rltl1l2_p1 ; half>rax => e1 -e2 is pos => e1 > e2 - - - mov rax, [rsi + 24] - cmp [half + 16], rax ; comare with (q-1)/2 - jc rltl1l2_n1 ; half e1-e2 is neg => e1 < e2 - - jnz rltl1l2_p1 ; half>rax => e1 -e2 is pos => e1 > e2 - - - mov rax, [rsi + 16] - cmp [half + 8], rax ; comare with (q-1)/2 - jc rltl1l2_n1 ; half e1-e2 is neg => e1 < e2 - - jnz rltl1l2_p1 ; half>rax => e1 -e2 is pos => e1 > e2 - - - mov rax, [rsi + 8] - cmp [half + 0], rax ; comare with (q-1)/2 - jc rltl1l2_n1 ; half e1-e2 is neg => e1 < e2 - - jmp rltl1l2_p1 - - - -rltl1l2_p1: - - - mov rax, [rdx + 32] - cmp [half + 24], rax ; comare with (q-1)/2 - jc rlt_ret0 ; half e1-e2 is neg => e1 < e2 - - jnz rltRawL1L2 ; half>rax => e1 -e2 is pos => e1 > e2 - - - mov rax, [rdx + 24] - cmp [half + 16], rax ; comare with (q-1)/2 - jc rlt_ret0 ; half e1-e2 is neg => e1 < e2 - - jnz rltRawL1L2 ; half>rax => e1 -e2 is pos => e1 > e2 - - - mov rax, [rdx + 16] - cmp [half + 8], rax ; comare with (q-1)/2 - jc rlt_ret0 ; half e1-e2 is neg => e1 < e2 - - jnz rltRawL1L2 ; half>rax => e1 -e2 is pos => e1 > e2 - - - mov rax, [rdx + 8] - cmp [half + 0], rax ; comare with (q-1)/2 - jc rlt_ret0 ; half e1-e2 is neg => e1 < e2 - - jmp rltRawL1L2 - - - - -rltl1l2_n1: - - - mov rax, [rdx + 32] - cmp [half + 24], rax ; comare with (q-1)/2 - jc rltRawL1L2 ; half e1-e2 is neg => e1 < e2 - - jnz rlt_ret1 ; half>rax => e1 -e2 is pos => e1 > e2 - - - mov rax, [rdx + 24] - cmp [half + 16], rax ; comare with (q-1)/2 - jc rltRawL1L2 ; half e1-e2 is neg => e1 < e2 - - jnz rlt_ret1 ; half>rax => e1 -e2 is pos => e1 > e2 - - - mov rax, [rdx + 16] - cmp [half + 8], rax ; comare with (q-1)/2 - jc rltRawL1L2 ; half e1-e2 is neg => e1 < e2 - - jnz rlt_ret1 ; half>rax => e1 -e2 is pos => e1 > e2 - - - mov rax, [rdx + 8] - cmp [half + 0], rax ; comare with (q-1)/2 - jc rltRawL1L2 ; half e1-e2 is neg => e1 < e2 - - jmp rlt_ret1 - - - - - -rltRawL1L2: - - mov rax, [rsi + 32] - cmp [rdx + 32], rax ; comare with (q-1)/2 - jc rlt_ret0 ; rsi 1st > 2nd - jnz rlt_ret1 - - mov rax, [rsi + 24] - cmp [rdx + 24], rax ; comare with (q-1)/2 - jc rlt_ret0 ; rsi 1st > 2nd - jnz rlt_ret1 - - mov rax, [rsi + 16] - cmp [rdx + 16], rax ; comare with (q-1)/2 - jc rlt_ret0 ; rsi 1st > 2nd - jnz rlt_ret1 - - mov rax, [rsi + 8] - cmp [rdx + 8], rax ; comare with (q-1)/2 - jc rlt_ret0 ; rsi 1st > 2nd - jnz rlt_ret1 - - -rlt_ret0: - xor rax, rax - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret -rlt_ret1: - mov rax, 1 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - - -;;;;;;;;;;;;;;;;;;;;;; -; req - Raw Eq -;;;;;;;;;;;;;;;;;;;;;; -; returns in ax 1 id *rsi == *rdx -; Params: -; rsi <= Pointer to element 1 -; rdx <= Pointer to element 2 -; rax <= Return 1 or 0 -; Modified Registers: -; r8, r9, rax -;;;;;;;;;;;;;;;;;;;;;; -Fr_req: - push rbp - push rsi - push rdx - mov rbp, rsp - mov r8, [rsi] - mov r9, [rdx] - bt r8, 63 ; Check if is short first operand - jc req_l1 - bt r9, 63 ; Check if is short second operand - jc req_s1l2 - -req_s1s2: ; Both operands are short - cmp r8d, r9d - je req_ret1 - jmp req_ret0 - - -req_l1: - bt r9, 63 ; Check if is short second operand - jc req_l1l2 - -;;;;;;;; -req_l1s2: - bt r8, 62 ; check if montgomery first - jc req_l1ms2 -req_l1ns2: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toLongNormal - mov rdx, rdi - pop rdi - pop rsi - - jmp reqL1L2 - -req_l1ms2: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toMontgomery - mov rdx, rdi - pop rdi - pop rsi - - jmp reqL1L2 - - -;;;;;;;; -req_s1l2: - bt r9, 62 ; check if montgomery second - jc req_s1l2m -req_s1l2n: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toLongNormal - mov rsi, rdi - pop rdi - pop rdx - - jmp reqL1L2 - -req_s1l2m: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toMontgomery - mov rsi, rdi - pop rdi - pop rdx - - jmp reqL1L2 - -;;;; -req_l1l2: - bt r8, 62 ; check if montgomery first - jc req_l1ml2 -req_l1nl2: - bt r9, 62 ; check if montgomery second - jc req_l1nl2m -req_l1nl2n: - jmp reqL1L2 - -req_l1nl2m: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rdx - push r8 - call Fr_toMontgomery - mov rsi, rdi - pop rdi - pop rdx - - jmp reqL1L2 - -req_l1ml2: - bt r9, 62 ; check if montgomery second - jc req_l1ml2m -req_l1ml2n: - - mov r8, rdi - sub rsp, 40 - mov rdi, rsp - push rsi - mov rsi, rdx - push r8 - call Fr_toMontgomery - mov rdx, rdi - pop rdi - pop rsi - - jmp reqL1L2 - -req_l1ml2m: - jmp reqL1L2 - - -;;;;;; -; eqL1L2 -;;;;;; - -reqL1L2: - - mov rax, [rsi + 8] - cmp [rdx + 8], rax - jne req_ret0 ; rsi 1st > 2nd - - mov rax, [rsi + 16] - cmp [rdx + 16], rax - jne req_ret0 ; rsi 1st > 2nd - - mov rax, [rsi + 24] - cmp [rdx + 24], rax - jne req_ret0 ; rsi 1st > 2nd - - mov rax, [rsi + 32] - cmp [rdx + 32], rax - jne req_ret0 ; rsi 1st > 2nd - - -req_ret1: - mov rax, 1 - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - -req_ret0: - xor rax, rax - mov rsp, rbp - pop rdx - pop rsi - pop rbp - ret - - -;;;;;;;;;;;;;;;;;;;;;; -; gt -;;;;;;;;;;;;;;;;;;;;;; -; Compares two elements of any kind -; Params: -; rsi <= Pointer to element 1 -; rdx <= Pointer to element 2 -; rdi <= Pointer to result can be zero or one. -; Modified Registers: -; rax, rcx -;;;;;;;;;;;;;;;;;;;;;; -Fr_gt: - call Fr_rgt - mov [rdi], rax - ret - -;;;;;;;;;;;;;;;;;;;;;; -; lt -;;;;;;;;;;;;;;;;;;;;;; -; Compares two elements of any kind -; Params: -; rsi <= Pointer to element 1 -; rdx <= Pointer to element 2 -; rdi <= Pointer to result can be zero or one. -; Modified Registers: -; rax, rcx -;;;;;;;;;;;;;;;;;;;;;; -Fr_lt: - call Fr_rlt - mov [rdi], rax - ret - -;;;;;;;;;;;;;;;;;;;;;; -; eq -;;;;;;;;;;;;;;;;;;;;;; -; Compares two elements of any kind -; Params: -; rsi <= Pointer to element 1 -; rdx <= Pointer to element 2 -; rdi <= Pointer to result can be zero or one. -; Modified Registers: -; rax, rcx -;;;;;;;;;;;;;;;;;;;;;; -Fr_eq: - call Fr_req - mov [rdi], rax - ret - -;;;;;;;;;;;;;;;;;;;;;; -; neq -;;;;;;;;;;;;;;;;;;;;;; -; Compares two elements of any kind -; Params: -; rsi <= Pointer to element 1 -; rdx <= Pointer to element 2 -; rdi <= Pointer to result can be zero or one. -; Modified Registers: -; rax, rcx -;;;;;;;;;;;;;;;;;;;;;; -Fr_neq: - call Fr_req - xor rax, 1 - mov [rdi], rax - ret - -;;;;;;;;;;;;;;;;;;;;;; -; geq -;;;;;;;;;;;;;;;;;;;;;; -; Compares two elements of any kind -; Params: -; rsi <= Pointer to element 1 -; rdx <= Pointer to element 2 -; rdi <= Pointer to result can be zero or one. -; Modified Registers: -; rax, rcx -;;;;;;;;;;;;;;;;;;;;;; -Fr_geq: - call Fr_rlt - xor rax, 1 - mov [rdi], rax - ret - -;;;;;;;;;;;;;;;;;;;;;; -; leq -;;;;;;;;;;;;;;;;;;;;;; -; Compares two elements of any kind -; Params: -; rsi <= Pointer to element 1 -; rdx <= Pointer to element 2 -; rdi <= Pointer to result can be zero or one. -; Modified Registers: -; rax, rcx -;;;;;;;;;;;;;;;;;;;;;; -Fr_leq: - call Fr_rgt - xor rax, 1 - mov [rdi], rax - ret - - - -;;;;;;;;;;;;;;;;;;;;;; -; rawIsEq -;;;;;;;;;;;;;;;;;;;;;; -; Compares two elements of any kind -; Params: -; rdi <= Pointer to element 1 -; rsi <= Pointer to element 2 -; Returns -; ax <= 1 if are equal 0, otherwise -; Modified Registers: -; rax -;;;;;;;;;;;;;;;;;;;;;; -Fr_rawIsEq: - - mov rax, [rsi + 0] - cmp [rdi + 0], rax - jne rawIsEq_ret0 - - mov rax, [rsi + 8] - cmp [rdi + 8], rax - jne rawIsEq_ret0 - - mov rax, [rsi + 16] - cmp [rdi + 16], rax - jne rawIsEq_ret0 - - mov rax, [rsi + 24] - cmp [rdi + 24], rax - jne rawIsEq_ret0 - -rawIsEq_ret1: - mov rax, 1 - ret - -rawIsEq_ret0: - xor rax, rax - ret - -;;;;;;;;;;;;;;;;;;;;;; -; rawIsZero -;;;;;;;;;;;;;;;;;;;;;; -; Compares two elements of any kind -; Params: -; rdi <= Pointer to element 1 -; Returns -; ax <= 1 if is 0, otherwise -; Modified Registers: -; rax -;;;;;;;;;;;;;;;;;;;;;; -Fr_rawIsZero: - - cmp qword [rdi + 0], $0 - jne rawIsZero_ret0 - - cmp qword [rdi + 8], $0 - jne rawIsZero_ret0 - - cmp qword [rdi + 16], $0 - jne rawIsZero_ret0 - - cmp qword [rdi + 24], $0 - jne rawIsZero_ret0 - - -rawIsZero_ret1: - mov rax, 1 - ret - -rawIsZero_ret0: - xor rax, rax - ret - - - - - - - - - - - -;;;;;;;;;;;;;;;;;;;;;; -; land -;;;;;;;;;;;;;;;;;;;;;; -; Logical and between two elements -; Params: -; rsi <= Pointer to element 1 -; rdx <= Pointer to element 2 -; rdi <= Pointer to result zero or one -; Modified Registers: -; rax, rcx, r8 -;;;;;;;;;;;;;;;;;;;;;; -Fr_land: - - - - - - - mov rax, [rsi] - bt rax, 63 - jc tmp_120 - - test eax, eax - jz retZero_122 - jmp retOne_121 - -tmp_120: - - mov rax, [rsi + 8] - test rax, rax - jnz retOne_121 - - mov rax, [rsi + 16] - test rax, rax - jnz retOne_121 - - mov rax, [rsi + 24] - test rax, rax - jnz retOne_121 - - mov rax, [rsi + 32] - test rax, rax - jnz retOne_121 - - -retZero_122: - mov qword r8, 0 - jmp done_123 - -retOne_121: - mov qword r8, 1 - -done_123: - - - - - - - - mov rax, [rdx] - bt rax, 63 - jc tmp_124 - - test eax, eax - jz retZero_126 - jmp retOne_125 - -tmp_124: - - mov rax, [rdx + 8] - test rax, rax - jnz retOne_125 - - mov rax, [rdx + 16] - test rax, rax - jnz retOne_125 - - mov rax, [rdx + 24] - test rax, rax - jnz retOne_125 - - mov rax, [rdx + 32] - test rax, rax - jnz retOne_125 - - -retZero_126: - mov qword rcx, 0 - jmp done_127 - -retOne_125: - mov qword rcx, 1 - -done_127: - - and rcx, r8 - mov [rdi], rcx - ret - - -;;;;;;;;;;;;;;;;;;;;;; -; lor -;;;;;;;;;;;;;;;;;;;;;; -; Logical or between two elements -; Params: -; rsi <= Pointer to element 1 -; rdx <= Pointer to element 2 -; rdi <= Pointer to result zero or one -; Modified Registers: -; rax, rcx, r8 -;;;;;;;;;;;;;;;;;;;;;; -Fr_lor: - - - - - - - mov rax, [rsi] - bt rax, 63 - jc tmp_128 - - test eax, eax - jz retZero_130 - jmp retOne_129 - -tmp_128: - - mov rax, [rsi + 8] - test rax, rax - jnz retOne_129 - - mov rax, [rsi + 16] - test rax, rax - jnz retOne_129 - - mov rax, [rsi + 24] - test rax, rax - jnz retOne_129 - - mov rax, [rsi + 32] - test rax, rax - jnz retOne_129 - - -retZero_130: - mov qword r8, 0 - jmp done_131 - -retOne_129: - mov qword r8, 1 - -done_131: - - - - - - - - mov rax, [rdx] - bt rax, 63 - jc tmp_132 - - test eax, eax - jz retZero_134 - jmp retOne_133 - -tmp_132: - - mov rax, [rdx + 8] - test rax, rax - jnz retOne_133 - - mov rax, [rdx + 16] - test rax, rax - jnz retOne_133 - - mov rax, [rdx + 24] - test rax, rax - jnz retOne_133 - - mov rax, [rdx + 32] - test rax, rax - jnz retOne_133 - - -retZero_134: - mov qword rcx, 0 - jmp done_135 - -retOne_133: - mov qword rcx, 1 - -done_135: - - or rcx, r8 - mov [rdi], rcx - ret - - -;;;;;;;;;;;;;;;;;;;;;; -; lnot -;;;;;;;;;;;;;;;;;;;;;; -; Do the logical not of an element -; Params: -; rsi <= Pointer to element to be tested -; rdi <= Pointer to result one if element1 is zero and zero otherwise -; Modified Registers: -; rax, rax, r8 -;;;;;;;;;;;;;;;;;;;;;; -Fr_lnot: - - - - - - - mov rax, [rsi] - bt rax, 63 - jc tmp_136 - - test eax, eax - jz retZero_138 - jmp retOne_137 - -tmp_136: - - mov rax, [rsi + 8] - test rax, rax - jnz retOne_137 - - mov rax, [rsi + 16] - test rax, rax - jnz retOne_137 - - mov rax, [rsi + 24] - test rax, rax - jnz retOne_137 - - mov rax, [rsi + 32] - test rax, rax - jnz retOne_137 - - -retZero_138: - mov qword rcx, 0 - jmp done_139 - -retOne_137: - mov qword rcx, 1 - -done_139: - - test rcx, rcx - - jz lnot_retOne -lnot_retZero: - mov qword [rdi], 0 - ret -lnot_retOne: - mov qword [rdi], 1 - ret - - -;;;;;;;;;;;;;;;;;;;;;; -; isTrue -;;;;;;;;;;;;;;;;;;;;;; -; Convert a 64 bit integer to a long format field element -; Params: -; rsi <= Pointer to the element -; Returs: -; rax <= 1 if true 0 if false -;;;;;;;;;;;;;;;;;;;;;;; -Fr_isTrue: - - - - - - - mov rax, [rdi] - bt rax, 63 - jc tmp_140 - - test eax, eax - jz retZero_142 - jmp retOne_141 - -tmp_140: - - mov rax, [rdi + 8] - test rax, rax - jnz retOne_141 - - mov rax, [rdi + 16] - test rax, rax - jnz retOne_141 - - mov rax, [rdi + 24] - test rax, rax - jnz retOne_141 - - mov rax, [rdi + 32] - test rax, rax - jnz retOne_141 - - -retZero_142: - mov qword rax, 0 - jmp done_143 - -retOne_141: - mov qword rax, 1 - -done_143: - - ret - - - - - - section .data -Fr_q: - dd 0 - dd 0x80000000 -Fr_rawq: -q dq 0x43e1f593f0000001,0x2833e84879b97091,0xb85045b68181585d,0x30644e72e131a029 -half dq 0xa1f0fac9f8000000,0x9419f4243cdcb848,0xdc2822db40c0ac2e,0x183227397098d014 -R2 dq 0x1bb8e645ae216da7,0x53fe3ab1e35c59e3,0x8c49833d53bb8085,0x0216d0b17f4e44a5 -Fr_R3: - dd 0 - dd 0x80000000 -Fr_rawR3: -R3 dq 0x5e94d8e1b4bf0040,0x2a489cbe1cfbb6b8,0x893cc664a19fcfed,0x0cf8594b7fcc657c -lboMask dq 0x3fffffffffffffff -np dq 0xc2e1f593efffffff - diff --git a/circuits/snarkjs_groth16/circuit_cpp/fr.cpp b/circuits/snarkjs_groth16/circuit_cpp/fr.cpp deleted file mode 100644 index 14864de..0000000 --- a/circuits/snarkjs_groth16/circuit_cpp/fr.cpp +++ /dev/null @@ -1,321 +0,0 @@ -#include "fr.hpp" -#include -#include -#include -#include -#include - - -static mpz_t q; -static mpz_t zero; -static mpz_t one; -static mpz_t mask; -static size_t nBits; -static bool initialized = false; - - -void Fr_toMpz(mpz_t r, PFrElement pE) { - FrElement tmp; - Fr_toNormal(&tmp, pE); - if (!(tmp.type & Fr_LONG)) { - mpz_set_si(r, tmp.shortVal); - if (tmp.shortVal<0) { - mpz_add(r, r, q); - } - } else { - mpz_import(r, Fr_N64, -1, 8, -1, 0, (const void *)tmp.longVal); - } -} - -void Fr_fromMpz(PFrElement pE, mpz_t v) { - if (mpz_fits_sint_p(v)) { - pE->type = Fr_SHORT; - pE->shortVal = mpz_get_si(v); - } else { - pE->type = Fr_LONG; - for (int i=0; ilongVal[i] = 0; - mpz_export((void *)(pE->longVal), NULL, -1, 8, -1, 0, v); - } -} - - -bool Fr_init() { - if (initialized) return false; - initialized = true; - mpz_init(q); - mpz_import(q, Fr_N64, -1, 8, -1, 0, (const void *)Fr_q.longVal); - mpz_init_set_ui(zero, 0); - mpz_init_set_ui(one, 1); - nBits = mpz_sizeinbase (q, 2); - mpz_init(mask); - mpz_mul_2exp(mask, one, nBits); - mpz_sub(mask, mask, one); - return true; -} - -void Fr_str2element(PFrElement pE, char const *s, uint base) { - mpz_t mr; - mpz_init_set_str(mr, s, base); - mpz_fdiv_r(mr, mr, q); - Fr_fromMpz(pE, mr); - mpz_clear(mr); -} - -char *Fr_element2str(PFrElement pE) { - FrElement tmp; - mpz_t r; - if (!(pE->type & Fr_LONG)) { - if (pE->shortVal>=0) { - char *r = new char[32]; - sprintf(r, "%d", pE->shortVal); - return r; - } else { - mpz_init_set_si(r, pE->shortVal); - mpz_add(r, r, q); - } - } else { - Fr_toNormal(&tmp, pE); - mpz_init(r); - mpz_import(r, Fr_N64, -1, 8, -1, 0, (const void *)tmp.longVal); - } - char *res = mpz_get_str (0, 10, r); - mpz_clear(r); - return res; -} - -void Fr_idiv(PFrElement r, PFrElement a, PFrElement b) { - mpz_t ma; - mpz_t mb; - mpz_t mr; - mpz_init(ma); - mpz_init(mb); - mpz_init(mr); - - Fr_toMpz(ma, a); - // char *s1 = mpz_get_str (0, 10, ma); - // printf("s1 %s\n", s1); - Fr_toMpz(mb, b); - // char *s2 = mpz_get_str (0, 10, mb); - // printf("s2 %s\n", s2); - mpz_fdiv_q(mr, ma, mb); - // char *sr = mpz_get_str (0, 10, mr); - // printf("r %s\n", sr); - Fr_fromMpz(r, mr); - - mpz_clear(ma); - mpz_clear(mb); - mpz_clear(mr); -} - -void Fr_mod(PFrElement r, PFrElement a, PFrElement b) { - mpz_t ma; - mpz_t mb; - mpz_t mr; - mpz_init(ma); - mpz_init(mb); - mpz_init(mr); - - Fr_toMpz(ma, a); - Fr_toMpz(mb, b); - mpz_fdiv_r(mr, ma, mb); - Fr_fromMpz(r, mr); - - mpz_clear(ma); - mpz_clear(mb); - mpz_clear(mr); -} - -void Fr_pow(PFrElement r, PFrElement a, PFrElement b) { - mpz_t ma; - mpz_t mb; - mpz_t mr; - mpz_init(ma); - mpz_init(mb); - mpz_init(mr); - - Fr_toMpz(ma, a); - Fr_toMpz(mb, b); - mpz_powm(mr, ma, mb, q); - Fr_fromMpz(r, mr); - - mpz_clear(ma); - mpz_clear(mb); - mpz_clear(mr); -} - -void Fr_inv(PFrElement r, PFrElement a) { - mpz_t ma; - mpz_t mr; - mpz_init(ma); - mpz_init(mr); - - Fr_toMpz(ma, a); - mpz_invert(mr, ma, q); - Fr_fromMpz(r, mr); - mpz_clear(ma); - mpz_clear(mr); -} - -void Fr_div(PFrElement r, PFrElement a, PFrElement b) { - FrElement tmp; - Fr_inv(&tmp, b); - Fr_mul(r, a, &tmp); -} - -void Fr_fail() { - assert(false); -} - - -RawFr::RawFr() { - Fr_init(); - set(fZero, 0); - set(fOne, 1); - neg(fNegOne, fOne); -} - -RawFr::~RawFr() { -} - -void RawFr::fromString(Element &r, const std::string &s, uint32_t radix) { - mpz_t mr; - mpz_init_set_str(mr, s.c_str(), radix); - mpz_fdiv_r(mr, mr, q); - for (int i=0; i>3] & (1 << (p & 0x7))) -void RawFr::exp(Element &r, const Element &base, uint8_t* scalar, unsigned int scalarSize) { - bool oneFound = false; - Element copyBase; - copy(copyBase, base); - for (int i=scalarSize*8-1; i>=0; i--) { - if (!oneFound) { - if ( !BIT_IS_SET(scalar, i) ) continue; - copy(r, copyBase); - oneFound = true; - continue; - } - square(r, r); - if ( BIT_IS_SET(scalar, i) ) { - mul(r, r, copyBase); - } - } - if (!oneFound) { - copy(r, fOne); - } -} - -void RawFr::toMpz(mpz_t r, const Element &a) { - Element tmp; - Fr_rawFromMontgomery(tmp.v, a.v); - mpz_import(r, Fr_N64, -1, 8, -1, 0, (const void *)tmp.v); -} - -void RawFr::fromMpz(Element &r, const mpz_t a) { - for (int i=0; i -#include -#include - -#define Fr_N64 4 -#define Fr_SHORT 0x00000000 -#define Fr_LONG 0x80000000 -#define Fr_LONGMONTGOMERY 0xC0000000 -typedef uint64_t FrRawElement[Fr_N64]; -typedef struct __attribute__((__packed__)) { - int32_t shortVal; - uint32_t type; - FrRawElement longVal; -} FrElement; -typedef FrElement *PFrElement; -extern FrElement Fr_q; -extern FrElement Fr_R3; -extern FrRawElement Fr_rawq; -extern FrRawElement Fr_rawR3; - -extern "C" void Fr_copy(PFrElement r, PFrElement a); -extern "C" void Fr_copyn(PFrElement r, PFrElement a, int n); -extern "C" void Fr_add(PFrElement r, PFrElement a, PFrElement b); -extern "C" void Fr_sub(PFrElement r, PFrElement a, PFrElement b); -extern "C" void Fr_neg(PFrElement r, PFrElement a); -extern "C" void Fr_mul(PFrElement r, PFrElement a, PFrElement b); -extern "C" void Fr_square(PFrElement r, PFrElement a); -extern "C" void Fr_band(PFrElement r, PFrElement a, PFrElement b); -extern "C" void Fr_bor(PFrElement r, PFrElement a, PFrElement b); -extern "C" void Fr_bxor(PFrElement r, PFrElement a, PFrElement b); -extern "C" void Fr_bnot(PFrElement r, PFrElement a); -extern "C" void Fr_shl(PFrElement r, PFrElement a, PFrElement b); -extern "C" void Fr_shr(PFrElement r, PFrElement a, PFrElement b); -extern "C" void Fr_eq(PFrElement r, PFrElement a, PFrElement b); -extern "C" void Fr_neq(PFrElement r, PFrElement a, PFrElement b); -extern "C" void Fr_lt(PFrElement r, PFrElement a, PFrElement b); -extern "C" void Fr_gt(PFrElement r, PFrElement a, PFrElement b); -extern "C" void Fr_leq(PFrElement r, PFrElement a, PFrElement b); -extern "C" void Fr_geq(PFrElement r, PFrElement a, PFrElement b); -extern "C" void Fr_land(PFrElement r, PFrElement a, PFrElement b); -extern "C" void Fr_lor(PFrElement r, PFrElement a, PFrElement b); -extern "C" void Fr_lnot(PFrElement r, PFrElement a); -extern "C" void Fr_toNormal(PFrElement r, PFrElement a); -extern "C" void Fr_toLongNormal(PFrElement r, PFrElement a); -extern "C" void Fr_toMontgomery(PFrElement r, PFrElement a); - -extern "C" int Fr_isTrue(PFrElement pE); -extern "C" int Fr_toInt(PFrElement pE); - -extern "C" void Fr_rawCopy(FrRawElement pRawResult, const FrRawElement pRawA); -extern "C" void Fr_rawSwap(FrRawElement pRawResult, FrRawElement pRawA); -extern "C" void Fr_rawAdd(FrRawElement pRawResult, const FrRawElement pRawA, const FrRawElement pRawB); -extern "C" void Fr_rawSub(FrRawElement pRawResult, const FrRawElement pRawA, const FrRawElement pRawB); -extern "C" void Fr_rawNeg(FrRawElement pRawResult, const FrRawElement pRawA); -extern "C" void Fr_rawMMul(FrRawElement pRawResult, const FrRawElement pRawA, const FrRawElement pRawB); -extern "C" void Fr_rawMSquare(FrRawElement pRawResult, const FrRawElement pRawA); -extern "C" void Fr_rawMMul1(FrRawElement pRawResult, const FrRawElement pRawA, uint64_t pRawB); -extern "C" void Fr_rawToMontgomery(FrRawElement pRawResult, const FrRawElement &pRawA); -extern "C" void Fr_rawFromMontgomery(FrRawElement pRawResult, const FrRawElement &pRawA); -extern "C" int Fr_rawIsEq(const FrRawElement pRawA, const FrRawElement pRawB); -extern "C" int Fr_rawIsZero(const FrRawElement pRawB); - -extern "C" void Fr_fail(); - - -// Pending functions to convert - -void Fr_str2element(PFrElement pE, char const*s, uint base); -char *Fr_element2str(PFrElement pE); -void Fr_idiv(PFrElement r, PFrElement a, PFrElement b); -void Fr_mod(PFrElement r, PFrElement a, PFrElement b); -void Fr_inv(PFrElement r, PFrElement a); -void Fr_div(PFrElement r, PFrElement a, PFrElement b); -void Fr_pow(PFrElement r, PFrElement a, PFrElement b); - -class RawFr { - -public: - const static int N64 = Fr_N64; - const static int MaxBits = 254; - - - struct Element { - FrRawElement v; - }; - -private: - Element fZero; - Element fOne; - Element fNegOne; - -public: - - RawFr(); - ~RawFr(); - - const Element &zero() { return fZero; }; - const Element &one() { return fOne; }; - const Element &negOne() { return fNegOne; }; - Element set(int value); - void set(Element &r, int value); - - void fromString(Element &r, const std::string &n, uint32_t radix = 10); - std::string toString(const Element &a, uint32_t radix = 10); - - void inline copy(Element &r, const Element &a) { Fr_rawCopy(r.v, a.v); }; - void inline swap(Element &a, Element &b) { Fr_rawSwap(a.v, b.v); }; - void inline add(Element &r, const Element &a, const Element &b) { Fr_rawAdd(r.v, a.v, b.v); }; - void inline sub(Element &r, const Element &a, const Element &b) { Fr_rawSub(r.v, a.v, b.v); }; - void inline mul(Element &r, const Element &a, const Element &b) { Fr_rawMMul(r.v, a.v, b.v); }; - - Element inline add(const Element &a, const Element &b) { Element r; Fr_rawAdd(r.v, a.v, b.v); return r;}; - Element inline sub(const Element &a, const Element &b) { Element r; Fr_rawSub(r.v, a.v, b.v); return r;}; - Element inline mul(const Element &a, const Element &b) { Element r; Fr_rawMMul(r.v, a.v, b.v); return r;}; - - Element inline neg(const Element &a) { Element r; Fr_rawNeg(r.v, a.v); return r; }; - Element inline square(const Element &a) { Element r; Fr_rawMSquare(r.v, a.v); return r; }; - - Element inline add(int a, const Element &b) { return add(set(a), b);}; - Element inline sub(int a, const Element &b) { return sub(set(a), b);}; - Element inline mul(int a, const Element &b) { return mul(set(a), b);}; - - Element inline add(const Element &a, int b) { return add(a, set(b));}; - Element inline sub(const Element &a, int b) { return sub(a, set(b));}; - Element inline mul(const Element &a, int b) { return mul(a, set(b));}; - - void inline mul1(Element &r, const Element &a, uint64_t b) { Fr_rawMMul1(r.v, a.v, b); }; - void inline neg(Element &r, const Element &a) { Fr_rawNeg(r.v, a.v); }; - void inline square(Element &r, const Element &a) { Fr_rawMSquare(r.v, a.v); }; - void inv(Element &r, const Element &a); - void div(Element &r, const Element &a, const Element &b); - void exp(Element &r, const Element &base, uint8_t* scalar, unsigned int scalarSize); - - void inline toMontgomery(Element &r, const Element &a) { Fr_rawToMontgomery(r.v, a.v); }; - void inline fromMontgomery(Element &r, const Element &a) { Fr_rawFromMontgomery(r.v, a.v); }; - int inline eq(const Element &a, const Element &b) { return Fr_rawIsEq(a.v, b.v); }; - int inline isZero(const Element &a) { return Fr_rawIsZero(a.v); }; - - void toMpz(mpz_t r, const Element &a); - void fromMpz(Element &a, const mpz_t r); - - int toRprBE(const Element &element, uint8_t *data, int bytes); - int fromRprBE(Element &element, const uint8_t *data, int bytes); - - int bytes ( void ) { return Fr_N64 * 8; }; - - void fromUI(Element &r, unsigned long int v); - - static RawFr field; - -}; - - -#endif // __FR_H - - - diff --git a/circuits/snarkjs_groth16/circuit_cpp/main.cpp b/circuits/snarkjs_groth16/circuit_cpp/main.cpp deleted file mode 100644 index 18d846c..0000000 --- a/circuits/snarkjs_groth16/circuit_cpp/main.cpp +++ /dev/null @@ -1,288 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using json = nlohmann::json; - -#include "calcwit.hpp" -#include "circom.hpp" - - -#define handle_error(msg) \ - do { perror(msg); exit(EXIT_FAILURE); } while (0) - -Circom_Circuit* loadCircuit(std::string const &datFileName) { - Circom_Circuit *circuit = new Circom_Circuit; - - int fd; - struct stat sb; - - fd = open(datFileName.c_str(), O_RDONLY); - if (fd == -1) { - std::cout << ".dat file not found: " << datFileName << "\n"; - throw std::system_error(errno, std::generic_category(), "open"); - } - - if (fstat(fd, &sb) == -1) { /* To obtain file size */ - throw std::system_error(errno, std::generic_category(), "fstat"); - } - - u8* bdata = (u8*)mmap(NULL, sb.st_size, PROT_READ , MAP_PRIVATE, fd, 0); - close(fd); - - circuit->InputHashMap = new HashSignalInfo[get_size_of_input_hashmap()]; - uint dsize = get_size_of_input_hashmap()*sizeof(HashSignalInfo); - memcpy((void *)(circuit->InputHashMap), (void *)bdata, dsize); - - circuit->witness2SignalList = new u64[get_size_of_witness()]; - uint inisize = dsize; - dsize = get_size_of_witness()*sizeof(u64); - memcpy((void *)(circuit->witness2SignalList), (void *)(bdata+inisize), dsize); - - circuit->circuitConstants = new FrElement[get_size_of_constants()]; - if (get_size_of_constants()>0) { - inisize += dsize; - dsize = get_size_of_constants()*sizeof(FrElement); - memcpy((void *)(circuit->circuitConstants), (void *)(bdata+inisize), dsize); - } - - std::map templateInsId2IOSignalInfo1; - if (get_size_of_io_map()>0) { - u32 index[get_size_of_io_map()]; - inisize += dsize; - dsize = get_size_of_io_map()*sizeof(u32); - memcpy((void *)index, (void *)(bdata+inisize), dsize); - inisize += dsize; - assert(inisize % sizeof(u32) == 0); - assert(sb.st_size % sizeof(u32) == 0); - u32 dataiomap[(sb.st_size-inisize)/sizeof(u32)]; - memcpy((void *)dataiomap, (void *)(bdata+inisize), sb.st_size-inisize); - u32* pu32 = dataiomap; - - for (int i = 0; i < get_size_of_io_map(); i++) { - u32 n = *pu32; - IODefPair p; - p.len = n; - IODef defs[n]; - pu32 += 1; - for (u32 j = 0; j templateInsId2IOSignalInfo = move(templateInsId2IOSignalInfo1); - - munmap(bdata, sb.st_size); - - return circuit; -} - -bool check_valid_number(std::string & s, uint base){ - bool is_valid = true; - if (base == 16){ - for (uint i = 0; i < s.size(); i++){ - is_valid &= ( - ('0' <= s[i] && s[i] <= '9') || - ('a' <= s[i] && s[i] <= 'f') || - ('A' <= s[i] && s[i] <= 'F') - ); - } - } else{ - for (uint i = 0; i < s.size(); i++){ - is_valid &= ('0' <= s[i] && s[i] < char(int('0') + base)); - } - } - return is_valid; -} - -void json2FrElements (json val, std::vector & vval){ - if (!val.is_array()) { - FrElement v; - std::string s_aux, s; - uint base; - if (val.is_string()) { - s_aux = val.get(); - std::string possible_prefix = s_aux.substr(0, 2); - if (possible_prefix == "0b" || possible_prefix == "0B"){ - s = s_aux.substr(2, s_aux.size() - 2); - base = 2; - } else if (possible_prefix == "0o" || possible_prefix == "0O"){ - s = s_aux.substr(2, s_aux.size() - 2); - base = 8; - } else if (possible_prefix == "0x" || possible_prefix == "0X"){ - s = s_aux.substr(2, s_aux.size() - 2); - base = 16; - } else{ - s = s_aux; - base = 10; - } - if (!check_valid_number(s, base)){ - std::ostringstream errStrStream; - errStrStream << "Invalid number in JSON input: " << s_aux << "\n"; - throw std::runtime_error(errStrStream.str() ); - } - } else if (val.is_number()) { - double vd = val.get(); - std::stringstream stream; - stream << std::fixed << std::setprecision(0) << vd; - s = stream.str(); - base = 10; - } else { - std::ostringstream errStrStream; - errStrStream << "Invalid JSON type\n"; - throw std::runtime_error(errStrStream.str() ); - } - Fr_str2element (&v, s.c_str(), base); - vval.push_back(v); - } else { - for (uint i = 0; i < val.size(); i++) { - json2FrElements (val[i], vval); - } - } -} - - -void loadJson(Circom_CalcWit *ctx, std::string filename) { - std::ifstream inStream(filename); - json j; - inStream >> j; - - u64 nItems = j.size(); - // printf("Items : %llu\n",nItems); - if (nItems == 0){ - ctx->tryRunCircuit(); - } - for (json::iterator it = j.begin(); it != j.end(); ++it) { - // std::cout << it.key() << " => " << it.value() << '\n'; - u64 h = fnv1a(it.key()); - std::vector v; - json2FrElements(it.value(),v); - uint signalSize = ctx->getInputSignalSize(h); - if (v.size() < signalSize) { - std::ostringstream errStrStream; - errStrStream << "Error loading signal " << it.key() << ": Not enough values\n"; - throw std::runtime_error(errStrStream.str() ); - } - if (v.size() > signalSize) { - std::ostringstream errStrStream; - errStrStream << "Error loading signal " << it.key() << ": Too many values\n"; - throw std::runtime_error(errStrStream.str() ); - } - for (uint i = 0; i " << Fr_element2str(&(v[i])) << '\n'; - ctx->setInputSignal(h,i,v[i]); - } catch (std::runtime_error e) { - std::ostringstream errStrStream; - errStrStream << "Error setting signal: " << it.key() << "\n" << e.what(); - throw std::runtime_error(errStrStream.str() ); - } - } - } -} - -void writeBinWitness(Circom_CalcWit *ctx, std::string wtnsFileName) { - FILE *write_ptr; - - write_ptr = fopen(wtnsFileName.c_str(),"wb"); - - fwrite("wtns", 4, 1, write_ptr); - - u32 version = 2; - fwrite(&version, 4, 1, write_ptr); - - u32 nSections = 2; - fwrite(&nSections, 4, 1, write_ptr); - - // Header - u32 idSection1 = 1; - fwrite(&idSection1, 4, 1, write_ptr); - - u32 n8 = Fr_N64*8; - - u64 idSection1length = 8 + n8; - fwrite(&idSection1length, 8, 1, write_ptr); - - fwrite(&n8, 4, 1, write_ptr); - - fwrite(Fr_q.longVal, Fr_N64*8, 1, write_ptr); - - uint Nwtns = get_size_of_witness(); - - u32 nVars = (u32)Nwtns; - fwrite(&nVars, 4, 1, write_ptr); - - // Data - u32 idSection2 = 2; - fwrite(&idSection2, 4, 1, write_ptr); - - u64 idSection2length = (u64)n8*(u64)Nwtns; - fwrite(&idSection2length, 8, 1, write_ptr); - - FrElement v; - - for (int i=0;igetWitness(i, &v); - Fr_toLongNormal(&v, &v); - fwrite(v.longVal, Fr_N64*8, 1, write_ptr); - } - fclose(write_ptr); -} - -int main (int argc, char *argv[]) { - std::string cl(argv[0]); - if (argc!=3) { - std::cout << "Usage: " << cl << " \n"; - } else { - std::string datfile = cl + ".dat"; - std::string jsonfile(argv[1]); - std::string wtnsfile(argv[2]); - - // auto t_start = std::chrono::high_resolution_clock::now(); - - Circom_Circuit *circuit = loadCircuit(datfile); - - Circom_CalcWit *ctx = new Circom_CalcWit(circuit); - - loadJson(ctx, jsonfile); - if (ctx->getRemaingInputsToBeSet()!=0) { - std::cerr << "Not all inputs have been set. Only " << get_main_input_signal_no()-ctx->getRemaingInputsToBeSet() << " out of " << get_main_input_signal_no() << std::endl; - assert(false); - } - /* - for (uint i = 0; igetWitness(i, &x); - std::cout << i << ": " << Fr_element2str(&x) << std::endl; - } - */ - - //auto t_mid = std::chrono::high_resolution_clock::now(); - //std::cout << std::chrono::duration(t_mid-t_start).count()<(t_end-t_mid).count()< "); -} else { - const input = JSON.parse(readFileSync(process.argv[3], "utf8")); - - const buffer = readFileSync(process.argv[2]); - wc(buffer).then(async witnessCalculator => { - // const w= await witnessCalculator.calculateWitness(input,0); - // for (let i=0; i< w.length; i++){ - // console.log(w[i]); - // } - const buff= await witnessCalculator.calculateWTNSBin(input,0); - writeFile(process.argv[4], buff, function(err) { - if (err) throw err; - }); - }); -} diff --git a/circuits/snarkjs_groth16/circuit_js/input.json b/circuits/snarkjs_groth16/circuit_js/input.json deleted file mode 100644 index 02177e3..0000000 --- a/circuits/snarkjs_groth16/circuit_js/input.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "x": "3" -} \ No newline at end of file diff --git a/circuits/snarkjs_groth16/circuit_js/witness.wtns b/circuits/snarkjs_groth16/circuit_js/witness.wtns deleted file mode 100644 index edf7759..0000000 Binary files a/circuits/snarkjs_groth16/circuit_js/witness.wtns and /dev/null differ diff --git a/circuits/snarkjs_groth16/circuit_js/witness_calculator.js b/circuits/snarkjs_groth16/circuit_js/witness_calculator.js deleted file mode 100644 index 20e6e20..0000000 --- a/circuits/snarkjs_groth16/circuit_js/witness_calculator.js +++ /dev/null @@ -1,337 +0,0 @@ -module.exports = async function builder(code, options) { - - options = options || {}; - - let wasmModule; - try { - wasmModule = await WebAssembly.compile(code); - } catch (err) { - console.log(err); - console.log("\nTry to run circom --c in order to generate c++ code instead\n"); - throw new Error(err); - } - - let wc; - - let errStr = ""; - let msgStr = ""; - - const instance = await WebAssembly.instantiate(wasmModule, { - runtime: { - exceptionHandler : function(code) { - let err; - if (code == 1) { - err = "Signal not found.\n"; - } else if (code == 2) { - err = "Too many signals set.\n"; - } else if (code == 3) { - err = "Signal already set.\n"; - } else if (code == 4) { - err = "Assert Failed.\n"; - } else if (code == 5) { - err = "Not enough memory.\n"; - } else if (code == 6) { - err = "Input signal array access exceeds the size.\n"; - } else { - err = "Unknown error.\n"; - } - throw new Error(err + errStr); - }, - printErrorMessage : function() { - errStr += getMessage() + "\n"; - // console.error(getMessage()); - }, - writeBufferMessage : function() { - const msg = getMessage(); - // Any calls to `log()` will always end with a `\n`, so that's when we print and reset - if (msg === "\n") { - console.log(msgStr); - msgStr = ""; - } else { - // If we've buffered other content, put a space in between the items - if (msgStr !== "") { - msgStr += " " - } - // Then append the message to the message we are creating - msgStr += msg; - } - }, - showSharedRWMemory : function() { - printSharedRWMemory (); - } - - } - }); - - const sanityCheck = - options -// options && -// ( -// options.sanityCheck || -// options.logGetSignal || -// options.logSetSignal || -// options.logStartComponent || -// options.logFinishComponent -// ); - - - wc = new WitnessCalculator(instance, sanityCheck); - return wc; - - function getMessage() { - var message = ""; - var c = instance.exports.getMessageChar(); - while ( c != 0 ) { - message += String.fromCharCode(c); - c = instance.exports.getMessageChar(); - } - return message; - } - - function printSharedRWMemory () { - const shared_rw_memory_size = instance.exports.getFieldNumLen32(); - const arr = new Uint32Array(shared_rw_memory_size); - for (let j=0; j { - const h = fnvHash(k); - const hMSB = parseInt(h.slice(0,8), 16); - const hLSB = parseInt(h.slice(8,16), 16); - const fArr = flatArray(input[k]); - let signalSize = this.instance.exports.getInputSignalSize(hMSB, hLSB); - if (signalSize < 0){ - throw new Error(`Signal ${k} not found\n`); - } - if (fArr.length < signalSize) { - throw new Error(`Not enough values for input signal ${k}\n`); - } - if (fArr.length > signalSize) { - throw new Error(`Too many values for input signal ${k}\n`); - } - for (let i=0; i0) { - res.unshift(0); - i--; - } - } - return res; -} - -function fromArray32(arr) { //returns a BigInt - var res = BigInt(0); - const radix = BigInt(0x100000000); - for (let i = 0; i /dev/null; then + return 1 + fi + return 0 +} + +check_debian_package() { + if dpkg -l "$1" 2>/dev/null | grep -q "^ii"; then + return 0 + fi + return 1 +} + +check_nlohmann_json() { + if is_debian_based; then + if check_debian_package "nlohmann-json3-dev"; then + return 0 + fi + else + if [ -f "/usr/include/nlohmann/json.hpp" ] || \ + [ -f "/usr/local/include/nlohmann/json.hpp" ] || \ + [ -f "/usr/include/json/json.hpp" ]; then + return 0 + fi + fi + return 1 +} + +check_gmp() { + if is_debian_based; then + if check_debian_package "libgmp-dev"; then + return 0 + fi + else + if [ -f "/usr/include/gmp.h" ] && (ldconfig -p | grep -q "libgmp"); then + return 0 + fi + fi + return 1 +} + +is_debian_based() { + if [ -f "/etc/debian_version" ]; then + return 0 + fi + return 1 +} + +echo "Checking system dependencies..." + +# Checks for nlohmann-json +if ! check_nlohmann_json; then + echo "Missing: nlohmann-json library" + if is_debian_based; then + echo "On Debian/Ubuntu systems, install with: sudo apt install nlohmann-json3-dev" + else + echo "Please install nlohmann-json development library for your system" + fi +else + echo "✓ nlohmann-json library installed" +fi + +# Checks for GMP +if ! check_gmp; then + echo "Missing: GMP library" + if is_debian_based; then + echo "On Debian/Ubuntu systems, install with: sudo apt install libgmp-dev" + else + echo "Please install GMP development library for your system" + fi +else + echo "✓ GMP library installed" +fi + +# Checks for NASM +if ! check_command "nasm"; then + echo "Missing: NASM assembler" + if is_debian_based; then + echo "On Debian/Ubuntu systems, install with: sudo apt install nasm" + else + echo "Please install NASM for your system" + fi +else + echo "✓ NASM installed" +fi + +# Checks for Node.js +if ! check_command "node"; then + echo "Missing: Node.js" + echo "Please install Node.js from https://nodejs.org/" + exit 1 +fi + +# Checks Node.js version +NODE_VERSION=$(node -v | cut -d'v' -f2) +if [ "$(printf '%s\n' "18.0.0" "$NODE_VERSION" | sort -V | head -n1)" = "18.0.0" ]; then + echo "✓ Node.js version $NODE_VERSION" +else + echo "Node.js version must be 18.0.0 or higher (current: $NODE_VERSION)" + echo "Please upgrade Node.js from https://nodejs.org/" + exit 1 +fi + +# Checks for Go +if ! check_command "go"; then + echo "Missing: Go programming language" + echo "Please install Go from https://golang.org/doc/install" + exit 1 +fi + +# Checks Go version +GO_VERSION=$(go version | awk '{print $3}' | cut -c 3-) +if [ "$(printf '%s\n' "1.22.0" "$GO_VERSION" | sort -V | head -n1)" = "1.22.0" ]; then + echo "✓ Go version $GO_VERSION" +else + echo "Go version must be 1.22.0 or higher (current: $GO_VERSION)" + echo "Please upgrade Go from https://golang.org/doc/install" + exit 1 +fi + +# Checks for snarkjs +if ! check_command "snarkjs"; then + echo "Missing: snarkjs" + read -p "Do you want to install snarkjs globally? (y/n) " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + npm install -g snarkjs@latest + else + echo "Please install snarkjs manually with: npm install -g snarkjs@latest" + exit 1 + fi +else + echo "✓ snarkjs installed" +fi + +# Checks for Rust +if ! check_command "rustc"; then + echo "Missing: Rust" + echo "Please install Rust using:" + echo "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh" + exit 1 +fi + +# Checks for Rust nightly +if ! rustup toolchain list | grep -q "nightly"; then + echo "Installing Rust nightly..." + rustup install nightly +else + echo "✓ Rust nightly installed" +fi + +# Checks for RISC-Zero target +if ! rustup target list | grep -q "riscv32imac-unknown-none-elf"; then + echo "Adding RISC-Zero target..." + rustup target add riscv32imac-unknown-none-elf +else + echo "✓ RISC-Zero target installed" +fi + +# Checks for cargo-risczero +if ! check_command "cargo-risczero"; then + echo "Installing cargo-risczero..." + cargo install cargo-risczero + cargo risczero install +else + echo "✓ cargo-risczero installed" +fi + +# Checks for SP1 +if ! check_command "sp1up"; then + echo "Installing SP1..." + curl -L https://sp1.succinct.xyz | bash + sp1up +else + echo "✓ SP1 installed" +fi + +# Make build.sh executable +if [ -f "circuits/snarkjs_groth16/build.sh" ]; then + chmod +x circuits/snarkjs_groth16/build.sh + echo "✓ circuits/snarkjs_groth16/build.sh is executable" +else + echo "Warning: circuits/snarkjs_groth16/build.sh not found" +fi + +# Checks if any of the required dependencies were missing +MISSING_DEPS=0 +! check_nlohmann_json && MISSING_DEPS=1 +! check_gmp && MISSING_DEPS=1 +! check_command "nasm" && MISSING_DEPS=1 + +echo "Setup check completed!" +if [ $MISSING_DEPS -eq 0 ]; then + echo "✓ All required dependencies are installed!" +else + echo "⚠ Some dependencies are missing. Please install them before proceeding." + exit 1 +fi \ No newline at end of file diff --git a/test_credentials.js b/test_credentials.js new file mode 100644 index 0000000..70194d4 --- /dev/null +++ b/test_credentials.js @@ -0,0 +1,20 @@ +require('dotenv').config(); +const { Quantum } = require("quantum-sdk"); + +async function testCredentials() { + const hint = "inside your .env file, make sure that RPC_ENDPOINT and ACCESS_KEY are correct." + try { + const quantum = new Quantum(process.env.RPC_ENDPOINT, process.env.ACCESS_KEY); + const rpcLive = await quantum.checkServerConnection(); + if (!rpcLive) { + console.error(`Failed to connect to Quantum server:\n ${hint}`); + process.exit(1); + } + console.log('API credentials verified successfully!'); + } catch (error) { + console.error(`Invalid API credentials:\n ${hint}`); + process.exit(1); + } +} + +testCredentials(); \ No newline at end of file