From 9293252bc48089a280eb8b26fab219fa49b6fee5 Mon Sep 17 00:00:00 2001 From: Adylan Roaffa <adylanrff@gmail.com> Date: Thu, 11 Apr 2019 22:17:19 +0700 Subject: [PATCH] add readme and output writer --- .vscode/settings.json | 38 + Makefile | 14 +- README.md | 136 + output/output.txt | 5000 +++++++++++++++++++++++++++++++++++ radixsort_serial | Bin 0 -> 13704 bytes src/radixSort/radixSort.cu | 11 +- src/radixSort/radixSort.cuh | 1 - src/radixsort_paralel.cu | 6 +- src/radixsort_serial.c | 1 + src/util/util.cpp | 22 +- src/util/util.hpp | 4 +- 11 files changed, 5211 insertions(+), 22 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 README.md create mode 100644 output/output.txt create mode 100755 radixsort_serial diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..f043d8f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,38 @@ +{ + "files.associations": { + "array": "cpp", + "*.tcc": "cpp", + "cctype": "cpp", + "clocale": "cpp", + "cstdarg": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "exception": "cpp", + "fstream": "cpp", + "functional": "cpp", + "initializer_list": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "memory": "cpp", + "new": "cpp", + "ostream": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "system_error": "cpp", + "type_traits": "cpp", + "tuple": "cpp", + "typeinfo": "cpp", + "utility": "cpp", + "cmath": "cpp", + "string_view": "cpp", + "string": "cpp" + } +} \ No newline at end of file diff --git a/Makefile b/Makefile index ffb4e92..4831438 100644 --- a/Makefile +++ b/Makefile @@ -2,18 +2,16 @@ CXX := gcc CUDA := nvcc OUTPUT_DIR := output LIB := -lm -EXEC_PARALEL := radixsort_paralel -EXEC_SERIAL := radixsort_serial - -debug: - @mkdir -p ${OUTPUT_DIR} - ${CUDA} src/radixsort_paralel.cu src/cudaUtil/cudaUtil.cu src/radixSort/radixSort.cu src/util/util.cpp --device-c - ${CUDA} radixsort_paralel.o util.o cudaUtil.o radixSort.o -o bin/radixsort_paralel.out +EXEC_PARALEL := radixsort_paralel.o radixSort.o +EXEC_SERIAL := radixsort_serial.o +all: + make clean + make build build: @mkdir -p ${OUTPUT_DIR} - ${CUDA} src/radixsort_paralel.cu src/cudaUtil/cudaUtil.cu src/radixSort/radixSort.cu src/util/util.cpp --device-c + ${CUDA} src/radixsort_paralel.cu src/cudaUtil/cudaUtil.cu src/radixSort/radixSort.cu src/util/util.cpp --device-c ${CUDA} radixsort_paralel.o util.o cudaUtil.o radixSort.o -o bin/radixsort_paralel.out ${CXX} src/util/util.cpp src/radixsort_serial.c -o ${EXEC_SERIAL} diff --git a/README.md b/README.md new file mode 100644 index 0000000..d09a9e3 --- /dev/null +++ b/README.md @@ -0,0 +1,136 @@ +# Praktikum 2 - Open MPI Radix Sort + +## Daftar Isi +- [Praktikum 2 - Open MPI Radix Sort](#praktikum-2---open-mpi-radix-sort) + - [Daftar Isi](#daftar-isi) + - [Overview](#overview) + - [Petunjuk Penggunaan](#petunjuk-penggunaan) + - [Prerequisites](#prerequisites) + - [Installing](#installing) + - [Running The Program](#running-the-program) + - [Pembagian Tugas](#pembagian-tugas) + - [1. Tugas - Adylan Roaffa Ilmy](#1-tugas---adylan-roaffa-ilmy) + - [2. Tugas - Ayrton Cyril](#2-tugas---ayrton-cyril) + - [Laporan Pengerjaan](#laporan-pengerjaan) + - [Deskripsi Solusi](#deskripsi-solusi) + - [Analisis Solusi](#analisis-solusi) + - [Pemetaan Thread & Jumlah Thread](#pemetaan-thread--jumlah-thread) + - [Spesifikasi *Hardware*](#spesifikasi-hardware) + - [Pengukuran Kinerja](#pengukuran-kinerja) + - [Analisis Kinerja](#analisis-kinerja) + - [Authors](#authors) + +## Overview +Implementasi *Radix Sort* secara paralel pada OpenMPI. Radix Sort adalah algoritma sorting yang mengurutkan data menggunakan kunci bilangan (integer) dengan melakukan pengelompokan kunci berdasarkan angka yang memiliki kesamaan posisi dan nilai (ratusan dengan ratusan, puluhan dengan puluhan). Ide utama dari algoritma ini adalah melakukan pengurutan untuk setiap angka (digit) dari least significant digit sampai dengan most significant digit. + +## Petunjuk Penggunaan + +### Prerequisites + +Berikut adalah *library* yang harus sudah di-*install* pada komputer anda. + +1. GCC version 7+ +2. [CUDA Toolkit](https://developer.nvidia.com/cuda-downloads) + +### Installing + +1. Panggil command `make` pada *root directory* repository ini. + \ + Setelah melakukan pemanggilan command `make`, diharapkan akan ada output sebagai berikut: + ``` + make clean + make[1]: Entering directory '/data' + make[1]: Leaving directory '/data' + make build + make[1]: Entering directory '/data' + nvcc src/radixsort_paralel.cu src/cudaUtil/cudaUtil.cu src/radixSort/radixSort.cu src/util/util.cpp --device-c + nvcc radixsort_paralel.o util.o cudaUtil.o radixSort.o -o bin/radixsort_paralel.out + gcc src/util/util.cpp src/radixsort_serial.c -o radixsort_serial.o + make[1]: Leaving directory '/data' + ``` + Apabila telah keluar output seperti di atas, program telah berhasil di-*install*. + +### Running The Program + +1. Ketikkan `bash run_cuda.sh <N>` untuk menjalankan program *Radix Sort* dengan <N> adalah jumlah elemen pada array yang ingin diurutkan. + +2. Apabila program berhasil dijalankan, akan keluar output yang menandakan waktu yang dibutuhkan untuk melakukan algoritma *Radix Sort*.\ +Contoh: + ``` + $ bash run_cuda.sh 500000 + + Sorted! + + Parallel execution time = 258747. + + Serial execution time = 751007. + ``` + + +## Pembagian Tugas + +### 1. Tugas - Adylan Roaffa Ilmy +|No|Tugas| +|---|---| +|1|Optimasi CUDA + analisis| +|2|Output writer| +|3|Membuat README.md| + +### 2. Tugas - Ayrton Cyril +|No|Tugas| +|---|---| +|1 | Membuat paralel create bucket| +|2 | Membuat copy output| +|3 | Membuat penghitung waktu| + + +## Laporan Pengerjaan + +### Deskripsi Solusi +1. Melakukan sorting radix sort dengan Most Significant Bit +2. Membagi element array yang sudah di sort ke setiap proses. Setiap thread dibagi serata mungkin dengan aturan tidak boleh ada kumpulan Most Significant Bit yang sama yang terpisah di 2 proses yang berbeda +3. Lakukan radix sort pada setiap masing-masing proses +4. Gabungkan kembali hasil sorting ke array pada root + +### Analisis Solusi +Dari hasil analisis yang paling berpengaruh dalam performa *Radix Sort CUDA* adalah dengan menggunakan GPU dalam melaksanakan pengurutan array. *Overhead* yang diakibatkan oleh fungsi ***cudaMalloc*** dan ***cudaMemcpy*** adalah hal yang menyebabkan algoritma *Radix Sort* terasa lambat apabila dijalankan secara parallel. + +### Pemetaan Thread & Jumlah Thread +Jumlah thread yang digunakan pada kasus ini adalah **256 thread**. Hal ini dikarenakan pada CUDA GPU, thread harus dalam kelipatan 32. Dan berdasarkan percobaan yang telah kami lakukan, jumlah thread yang paling optimal dalam penyelesaian kasus *Radix Sort* adalah sejumlah **256 thread**. + +### Spesifikasi *Hardware* + +Percobaan digunakan dengan menggunakan **Asus ROG GL552-VW** dengan spesifikasi sebagai berikut + +|No| Nama | Keterangan| +|---| -----| -----| +|1| Processor| Intel Skylake Core i7-6700HQ CPU, quad-core 2.6 GHz (3.5 GHz TBoost)| +|2| Video| Integrated Intel HD 530 + **Nvidia GTX 960M 4GB**| +|3| Memory| 16 GB DDR4 2133Mhz (2xDIMMs)| +|4| Storage| 1 TB 2.5″ HDD (Hitachi HTS5410)| + + +### Pengukuran Kinerja +Satuan kinerja yang digunakan adalah ukuran waktu dengan satuan *microseconds (μs)*. Berikut adalah hasil pengukuran kinerja algoritma *Radix Sort* yang dijalankan secara parallel dibandingkan dengan *Radix Sort* yang dijalankan secara serial. +Hasil dicatat dilakukan dengan laptop. + +- Pengetesan pada local + +|No | N | Waktu Eksekusi Serial (μs)| Waktu Eksekusi Parallel (μs)| +|---|----|----|----| +| 1 |5.000|1241505<br>1229600<br>780531|1190322<br>1180110<br>732153| +| 2 |50.000|991688<br>1012789<br>735255|894433<br>874755<br>613396| +| 3 |100000|1733229<br>578202<br>1188002|1522080<br>390158<br>997728| +| 4 |200000|1316615<br>526201<br>1248599|978895<br>190177<br>167008 +| 5 |400000|2167407<br>1481110<br>2252768|1541969<br>836728<br>1615249| + +### Analisis Kinerja +Seperti yang dapat dilihat pada bagian pengukuran kinerja di atas, dapat dilihat bahwa pengerjaan secara parallel hampir selalu dapat melampaui waktu pengerjaan *Radix Sort* dibandingkan dengan pengerjaan secara serial. Ini berarti algoritma parallel yang kami buat telah dapat melampaui *baseline* yang telah ditetapkan oleh pengerjaan secara serial. + +Namun, dikarenakan dengan *overhead* fungsi *cudaMalloc* dan *cudaMemcpy* yang masing-masing berfungsi untuk melakukan alokasi dan melakukan *copy* pada *GPU device*, terkadang waktu eksekusi *Radix Sort* secara paralel dapat lebih lambat dibandingkan pengerjaan secara serial. Oleh karena itu, *cudaMalloc* dan *cudaMemcpy* merupakan sebab lambannya pengerjaan secara parallel menggunakan CUDA. + +## Authors + +* **Adylan Roaffa Ilmy** - *13516016* +* **Ayrton Cyril Niwarlangga** - *13516019* + diff --git a/output/output.txt b/output/output.txt new file mode 100644 index 0000000..f9c8882 --- /dev/null +++ b/output/output.txt @@ -0,0 +1,5000 @@ +130785 +451369 +502004 +782453 +905905 +1464457 +1699441 +1918970 +2929735 +3155148 +3934480 +4835725 +4971945 +6178255 +6713397 +7234428 +7478268 +7560926 +7746674 +9725128 +9872645 +10045452 +10204066 +10572718 +10817870 +11285212 +11734829 +11977659 +12619061 +12723954 +12849393 +13070841 +13681091 +13772692 +14278105 +15792685 +16739335 +16995134 +17355483 +17583975 +17826138 +17995445 +18344982 +19341120 +19612534 +19889097 +20394957 +20410364 +21073951 +21490742 +21616339 +21637539 +22053922 +22374629 +22598666 +23184616 +23473372 +24083920 +25067354 +25127564 +25493320 +25868789 +26225688 +26245812 +26274466 +26698047 +26723603 +26780560 +27025096 +27425858 +27488926 +27861170 +28221046 +28786263 +28872704 +29349159 +29558717 +29854336 +30276957 +30688177 +32952661 +34451521 +34548769 +34747976 +34996500 +35437956 +36612478 +36678912 +37273030 +37338844 +37517700 +37550913 +38805951 +39029632 +39224962 +39323993 +39360422 +39782135 +40481641 +40586967 +40813682 +40943416 +42009591 +42027295 +42676642 +43341345 +43683167 +43913340 +44189256 +44288163 +44800453 +45152365 +45859278 +47011017 +47400903 +47677238 +48392053 +48813519 +49326125 +49731690 +49951160 +49988739 +50026749 +50287519 +50425041 +50479185 +50561880 +51287315 +52033964 +52386793 +52666688 +53814719 +54435226 +56501871 +56601022 +56862654 +57329454 +57448255 +57699482 +58225509 +59089426 +59632396 +60657605 +60965134 +61052478 +61714325 +61920929 +62213715 +62475423 +62886538 +63191204 +63529451 +64002576 +64264323 +64289109 +65774350 +66177103 +66907289 +66954117 +68541564 +69414292 +70103006 +70512912 +70544692 +71534826 +71563532 +72347711 +72409360 +73599690 +74024203 +74830815 +75274446 +75868813 +75899805 +75957314 +75994881 +77039634 +77471552 +77504684 +77588602 +77623425 +78069134 +78316720 +78322346 +79637735 +79777366 +80428634 +80658810 +82604576 +83122252 +83313933 +83603639 +83710100 +83767575 +84003241 +84502165 +84790032 +85181974 +85525346 +85944508 +86802717 +87874095 +87915969 +88970659 +89172256 +89939310 +90138406 +90576446 +90690344 +91706404 +92775731 +93004996 +93144812 +93198636 +93433483 +94323772 +94500565 +95601552 +96300134 +96636471 +96778506 +97147802 +97753420 +98183160 +98230519 +98823234 +98938801 +99070174 +99085297 +99174651 +100215660 +100390131 +100536895 +100657593 +100915515 +101199949 +101457130 +101595696 +102477749 +102715070 +102800715 +102993784 +103127370 +103901326 +103916753 +104462461 +104821104 +105091533 +105137592 +106409008 +106632710 +106986016 +107001992 +107913144 +108118183 +108357419 +108935562 +109139950 +109456261 +110629904 +110897156 +110995227 +111086174 +112645290 +113477124 +114084764 +114609935 +114778123 +115032041 +115118025 +115976782 +116619357 +116693370 +117184433 +117310092 +117346352 +117388375 +117645211 +117794796 +117939999 +118329392 +118694239 +118786648 +118842160 +119267500 +119307894 +123277712 +123340593 +123600821 +124163065 +124314576 +124523762 +124575895 +126154470 +126519409 +126525873 +126839696 +127115889 +127284834 +127334045 +128201888 +128797650 +129274409 +129425319 +130101279 +132076444 +132616017 +132848697 +132924790 +133037470 +133535331 +133905206 +133971779 +134598929 +135090676 +136846812 +137526409 +137663635 +138687609 +138719942 +138915656 +138953968 +139249787 +139805503 +139873165 +140633217 +142057461 +142290440 +142375449 +142392583 +142977375 +143329271 +144139308 +144558201 +145060041 +145550236 +145985169 +146323177 +146962155 +147103664 +147167651 +147176229 +147714093 +148681689 +149363876 +149947357 +150262753 +151086829 +152033283 +152221451 +152322471 +153034515 +153718475 +154088559 +154275862 +154462315 +154619383 +155912420 +155951248 +156489314 +156625446 +156742996 +157224627 +157231719 +157325010 +157513909 +157675853 +159419879 +159685127 +160717067 +161131148 +161734944 +162320140 +162647507 +162671312 +162738605 +163562027 +163789196 +163838229 +164004869 +164066396 +164157916 +165404580 +165421943 +165725781 +165926479 +166977757 +167226007 +167623534 +168500369 +169297525 +169428233 +170303668 +170477407 +170831334 +171108569 +171757378 +171977894 +172775910 +173054509 +174138888 +174908145 +175068276 +175915193 +175960912 +176382590 +176701374 +176777010 +177035143 +177092431 +177244372 +177526144 +177548209 +178770696 +178790762 +178929872 +179183535 +179318336 +179422496 +181216851 +181296252 +181898844 +182328165 +183133285 +183416295 +183673264 +183722075 +185253989 +185650124 +185654308 +185747958 +186690587 +186896853 +187446252 +187544980 +187886158 +188359725 +188456682 +189220552 +189688598 +189960276 +190365191 +191524868 +191759206 +192289374 +193094496 +193321118 +193819056 +193836893 +194594196 +195316886 +195362785 +195380453 +195786909 +196368923 +198184065 +198445109 +198602266 +198739782 +198860494 +198932216 +200325449 +200455273 +200830489 +200999532 +201407195 +201480087 +202299768 +202547354 +202730394 +202812554 +203236991 +203265047 +203298612 +203925626 +204165511 +204918154 +206029401 +207060476 +207303175 +207401736 +207657312 +208425652 +208555266 +210319852 +210550448 +210682909 +211637748 +211826222 +211856860 +213025785 +213808217 +213824752 +213907301 +214892306 +214941581 +214962297 +215148032 +216567868 +217011365 +218521835 +219098315 +219339878 +219367296 +220381288 +220408506 +220524228 +221370031 +221829736 +222424683 +222502711 +222610875 +222782580 +223055005 +223082981 +223947950 +224397471 +225071789 +225254212 +225529330 +226563856 +226757842 +226899535 +228390305 +228615609 +229192365 +229401498 +229721458 +229931051 +230414096 +230647158 +230945032 +231092931 +231314360 +231500559 +231592255 +231639626 +231935645 +232059456 +232252737 +232443437 +232527388 +232933434 +233137637 +233292903 +233321646 +233630661 +233801343 +233950626 +234031385 +234067900 +235300463 +235529469 +237239141 +238139156 +238452451 +238816231 +238926995 +238952299 +239096314 +239326227 +239531239 +239644466 +239805194 +239866366 +240545763 +240787905 +241398144 +241472460 +242224042 +242635002 +242914323 +243192511 +243583531 +243712248 +245322697 +245548241 +245781158 +246328976 +247666656 +248421028 +249195581 +249231133 +249390678 +249510985 +250003870 +250284967 +250377680 +250829854 +251148247 +252070083 +252091542 +252262105 +252301141 +252363257 +253121723 +253717686 +253797538 +254030046 +254409900 +254411753 +254836789 +255660332 +256420623 +257194574 +257521472 +257863065 +258285480 +258439679 +258737125 +259135598 +259146639 +259198006 +259293529 +259357952 +261053081 +262049239 +263032327 +263457549 +263973810 +264027710 +264284399 +264539625 +264565150 +265135121 +265533972 +265868706 +266613623 +266737639 +267174045 +267507110 +267570231 +267701016 +267811901 +268055385 +268364024 +268405172 +269331231 +269505202 +269966225 +270054690 +271268057 +273284492 +273331550 +273839590 +273995155 +274166357 +274362984 +274837660 +274947734 +276015700 +276257257 +276402334 +276518013 +276641567 +276730204 +276948660 +277687373 +278111087 +278590439 +278984085 +279374519 +279435877 +279437365 +279575421 +280954385 +281690058 +282096954 +282804867 +282975806 +283697072 +283810560 +284314855 +284356950 +284725932 +286039452 +286133751 +286804158 +287140963 +287174798 +288555138 +289268263 +290742694 +290780485 +290817265 +290871667 +290978644 +291640764 +291893059 +292657338 +293122294 +293844556 +295711318 +296291666 +296323241 +296409860 +296494956 +296692719 +296843553 +296974338 +297140568 +297885628 +297907529 +297908758 +297937617 +298060000 +299171321 +299185173 +299557877 +300090350 +300352872 +300538280 +300906094 +302165952 +302949179 +303026618 +303035385 +303076983 +303466582 +304232155 +304286201 +304536600 +304549662 +304734826 +304921889 +305074824 +305356285 +306185189 +307601340 +308580249 +308609563 +309191931 +309737140 +310064259 +310253111 +310467773 +310973505 +311102785 +311779665 +312647368 +314288691 +314517354 +315215664 +315364480 +316034556 +316136850 +316261059 +316442663 +316684383 +317350181 +317413288 +318910202 +319093251 +319699737 +320482190 +321424995 +321697006 +321997894 +322284039 +322298145 +322728056 +323117769 +323233559 +323673167 +324388733 +324902803 +325544975 +325584196 +325717204 +326290083 +326324644 +326535410 +327303016 +327670138 +327775199 +327794399 +327895775 +329943619 +330569109 +330685958 +330857810 +331412424 +331689018 +331795668 +332280262 +333756454 +333895964 +334693434 +336750664 +336871830 +337509975 +337693362 +338165402 +340159332 +340322851 +340508732 +341395103 +341538757 +341608762 +342360102 +342675590 +342705319 +342745562 +342970153 +343294672 +343783639 +343921578 +344589140 +344604739 +344802054 +345409594 +346499850 +346971002 +347044502 +347654402 +348605996 +348640269 +348650515 +348905680 +350155082 +350192582 +350815834 +350854381 +351049902 +352711027 +353103052 +353491557 +353966225 +354531425 +354963229 +355585110 +355775171 +356333910 +357908221 +358390661 +359048432 +359192161 +359429182 +360781550 +360812894 +360949322 +361043953 +361204207 +361538845 +362053539 +362771899 +363010397 +363169724 +363617062 +363932359 +363948906 +364282637 +364377760 +364849348 +364875783 +365547208 +365898832 +366064047 +366368639 +366555750 +366779280 +367067392 +367099028 +367266832 +368075914 +369105585 +369341826 +369347980 +369709584 +369890486 +369927792 +370475452 +370836143 +371034641 +371072562 +372361480 +372512254 +373093399 +373383129 +374014001 +374333726 +375096976 +375429316 +376084747 +376236459 +376803326 +376814981 +376903854 +377100549 +377120524 +378915699 +380017334 +380199436 +380313867 +381533640 +382487232 +382500553 +383135651 +384005681 +384061445 +384666954 +384875719 +384894383 +385259504 +385288048 +385715415 +385776427 +386363646 +386987321 +388631665 +388739581 +389669751 +390473734 +390597166 +390702555 +391384533 +391782438 +391967041 +392479292 +392945702 +393282481 +393772380 +394395587 +394437313 +394499260 +394743456 +395786255 +396412347 +396513856 +396796121 +396920739 +397227413 +397310563 +398094931 +398273472 +398916188 +399644924 +399944256 +400167624 +400870072 +401385131 +401880162 +401985834 +402689755 +402754274 +402963447 +403109435 +403306647 +403344502 +404440656 +404569848 +404743109 +405204359 +406480015 +406848094 +407025110 +407748482 +408321077 +408840811 +410113977 +411171540 +411413115 +411519142 +411709784 +411860320 +412370564 +412470524 +415438368 +416459089 +416631857 +416862798 +417054221 +417324100 +417407098 +417736024 +417745761 +417769952 +418133553 +418317974 +419065814 +419254389 +420064281 +420721142 +420965332 +421105189 +421213922 +421396218 +421613537 +421739606 +421855146 +422554101 +423332002 +423383811 +423634950 +424778292 +424812449 +424875127 +426319058 +427214417 +429266101 +429705073 +430184618 +431601337 +431969517 +432859066 +433009678 +433028787 +433682423 +433805893 +433818318 +433941615 +434178606 +435037007 +435942913 +436125506 +436395921 +437148834 +437161524 +437845752 +437984916 +438823489 +439328674 +439879655 +441116461 +441454018 +441977031 +442805971 +443521566 +444020655 +444423872 +444516691 +445392935 +445691519 +445706377 +446261287 +446623283 +446842547 +446984851 +447046072 +448340827 +448433655 +448473334 +448553663 +448839070 +449029014 +449204030 +449449892 +449700117 +450173633 +450617011 +451452263 +451808874 +452125995 +452153300 +452496673 +453552880 +454031710 +455055043 +455393670 +457217048 +457432951 +457473296 +458015601 +458309198 +458833582 +459318498 +460091233 +460215366 +460386868 +460542005 +461650468 +462594944 +462821303 +463279871 +463290572 +463530524 +464423753 +464735151 +465507797 +465584679 +465884171 +466110737 +466190892 +466836026 +466837458 +467435685 +467576322 +467775525 +468136246 +468153036 +468282263 +468837667 +469027842 +471432351 +471451806 +471468949 +471732503 +471803669 +471959967 +472403784 +472442439 +472505013 +473070123 +473453782 +473565982 +473805008 +474186709 +475243167 +476513886 +477549712 +477628135 +477952022 +478539620 +479050261 +480288418 +480355128 +481945795 +482107747 +482644644 +482905082 +483309712 +483667338 +483671565 +484614009 +484719038 +485232017 +485712142 +485755217 +485784155 +487049345 +487577833 +488436412 +489109050 +489579565 +489869984 +489899453 +490620301 +490842369 +490882829 +491858813 +491859947 +492021360 +493184959 +493734565 +494021825 +494235952 +494468787 +495118194 +496265370 +496329343 +496714906 +497058712 +497398685 +497463402 +497538717 +498504869 +498949984 +499093802 +499975181 +500466683 +501386783 +501709849 +501775682 +501852137 +502026515 +502060851 +502134240 +503636891 +505251027 +505697837 +507513459 +507727665 +508549246 +508651838 +508934850 +509518999 +509564617 +509695253 +509961950 +509966702 +510400168 +511379465 +511460629 +511571555 +512002025 +512536916 +512762443 +513883048 +514020122 +514417726 +514952635 +515721270 +516576296 +517088714 +518004616 +518577173 +518620385 +519022405 +520290380 +520562296 +520576283 +521952550 +522756386 +522994835 +523003041 +523051163 +523417208 +523491004 +523842722 +524015981 +524098159 +524657977 +525115169 +525410547 +525482492 +525868134 +526034661 +526132718 +526143014 +526305796 +526420583 +526638318 +526816412 +527157072 +527506618 +527671774 +527735629 +527779688 +528044493 +528330494 +529479540 +529571299 +530615078 +530877925 +531202640 +531932203 +532751634 +534204878 +534243853 +535927152 +535939952 +536130276 +536890209 +536894362 +538661688 +539421477 +539737307 +540209777 +540462117 +540917290 +541600764 +541844417 +541847557 +541898674 +542485494 +542709117 +542923030 +542951615 +543068464 +543658274 +543675571 +544601367 +544647906 +544773921 +544916085 +545280349 +545405158 +545521640 +545618198 +546237729 +547818898 +548053978 +548561944 +549030887 +549047943 +550422592 +550510307 +551078534 +551314514 +551387565 +552002842 +552043652 +552592413 +552679601 +553358414 +553374866 +554070933 +554085233 +554113458 +555411554 +555790549 +556257517 +556543606 +556716795 +557569611 +557743524 +558011604 +558132246 +558657351 +558661686 +558899963 +559234190 +559525805 +559800125 +559847118 +560746711 +561080014 +561080280 +561373774 +562180806 +562367865 +562436887 +562551172 +562949043 +563116763 +564097553 +564169864 +564334112 +564571175 +564675354 +565915897 +566374179 +566624769 +566782959 +566948125 +567599525 +568212275 +570632478 +570994924 +571009241 +571225089 +572835686 +574219037 +574313341 +574315217 +574710756 +574714483 +574965667 +575171435 +575420047 +575673319 +576087305 +577206124 +577211326 +578731240 +579135673 +579733916 +579857363 +580398011 +580547400 +580860425 +580930100 +581766457 +582107146 +582344077 +583455384 +583827951 +583835743 +585254117 +585543258 +585936316 +586234182 +586262148 +587511667 +587527271 +587994482 +588110816 +588636240 +588639892 +589909635 +590665489 +591627539 +592017831 +592220075 +592559511 +592599995 +592732486 +594080647 +594100118 +594215145 +595156067 +595388034 +595476403 +595966933 +596197787 +596743860 +596802623 +597158339 +597967996 +598085309 +598440980 +598940462 +599280991 +599335325 +599667622 +600250327 +600400790 +600433840 +600884498 +601449893 +601823342 +602001506 +602575535 +602850891 +602958699 +603657430 +604108837 +604529060 +605234439 +605505869 +605788980 +606167946 +607054881 +607209033 +607315779 +607750142 +608325593 +608328176 +608486391 +608525337 +608834035 +609036954 +609561404 +609937802 +610133269 +610829107 +611400523 +611797651 +612594625 +613352587 +613688369 +614578079 +615149284 +615693448 +615787172 +615954564 +617445395 +617592676 +618093810 +618398226 +618536377 +619059212 +619707686 +619778310 +619790087 +620290896 +620297978 +621028979 +621668380 +621781130 +622427563 +622975202 +623068263 +623419343 +624746411 +624966248 +625313278 +626236559 +626434905 +626481440 +626577865 +627333071 +627679656 +627766758 +628504624 +628588498 +628801548 +629314007 +629768273 +632121747 +633106973 +633347188 +633787735 +633845806 +634202694 +634555703 +634581457 +635216686 +636001721 +637307742 +637437822 +638333754 +639149358 +640646257 +641356319 +641583412 +641793719 +642121666 +642329795 +642678582 +643624632 +643679949 +643759871 +644079358 +644580225 +644984758 +645277060 +646461043 +646654621 +647028471 +647324379 +647455987 +647611157 +647736147 +648089058 +648100067 +648957618 +649384152 +651362805 +651677827 +652408471 +652713009 +653245008 +653317058 +654750537 +655036986 +655106931 +655441884 +655791336 +655815847 +656078809 +656334750 +657024287 +657035538 +657790897 +658537283 +659266856 +659572434 +659992940 +660120677 +660192199 +660560666 +660631398 +660649794 +661161499 +661474322 +661999238 +662410458 +662963040 +662995983 +663174797 +663330960 +663478362 +663498589 +663538425 +664346617 +664619344 +665746612 +665771573 +666243385 +667336251 +667372688 +667569316 +668519452 +668602407 +669029792 +669431474 +669682426 +669865055 +670194981 +670436672 +670461275 +670629286 +671489262 +671775724 +673066515 +673118072 +673757657 +673861890 +674096432 +674324787 +675269650 +675450491 +676220158 +676263728 +676497039 +676527531 +677020737 +677280587 +677942744 +680045391 +680567131 +680663318 +680687439 +681120674 +681350814 +681574533 +681889147 +683067257 +683600460 +683745485 +684799171 +684861591 +685062976 +685824457 +685951958 +686193871 +686410259 +687012921 +687409987 +687746748 +688241508 +688263945 +688891111 +689456682 +689784237 +690116910 +690205030 +690626346 +690705361 +691114009 +691583795 +691881151 +691954063 +692238496 +692541571 +692815693 +693016592 +693736541 +694330718 +694816854 +694883798 +695315066 +695844703 +696885055 +698907037 +699384102 +699518500 +699809374 +700731291 +700832095 +701993791 +702158866 +702211568 +702796509 +703171407 +703194116 +703382849 +704269658 +704764134 +704800443 +704973189 +705193307 +705434331 +705482310 +705859247 +706034307 +706062775 +706576914 +706929168 +708197414 +708981844 +709297191 +709515979 +710181936 +710637378 +711466549 +711618776 +711926100 +711934479 +711967155 +711993290 +712188977 +713465285 +713471068 +713640618 +713658968 +713750940 +714580550 +714943035 +715745377 +716856325 +716967180 +717164599 +717180661 +717271933 +717704153 +718024154 +718289973 +718319113 +718582561 +719259688 +720103311 +720268528 +720976997 +721045534 +721141814 +721596826 +722051221 +722188441 +722296251 +722463510 +723379906 +724294118 +725117969 +725452285 +725791187 +727279645 +727320478 +727367212 +728040835 +728381106 +728433300 +729121329 +729316560 +729448628 +729772014 +730993608 +731186021 +731488551 +731883422 +731955542 +733038432 +733268553 +733823102 +733904937 +733970333 +735392941 +735815088 +736285606 +736465712 +736700309 +736720261 +736911331 +737329988 +737493885 +737634552 +737683519 +738016655 +738158199 +738222973 +738676589 +739038249 +739897458 +740643295 +742915409 +742920153 +743488859 +743618251 +744149392 +744250881 +745127392 +745583537 +745588668 +745595499 +746047348 +746630976 +747013682 +747088541 +747400826 +747671862 +748468917 +748585405 +748964411 +749106236 +749604362 +750247342 +750363474 +750663852 +751620774 +752102970 +752353794 +752808297 +753783242 +755210661 +755372708 +756415124 +756435896 +756992740 +758451766 +758474094 +760014302 +760470189 +760505545 +760731889 +761652987 +761928707 +762353591 +762935395 +763396347 +763811960 +763935952 +763984915 +764042069 +764554832 +765354039 +765564476 +766284732 +766378154 +767108783 +768187296 +768823901 +769066548 +769457727 +769728263 +770015312 +770161457 +770306777 +770490347 +770699370 +770776177 +771169227 +771417348 +771518646 +772373518 +773096782 +773132136 +773822908 +774170145 +774189136 +774460846 +775130427 +775181991 +775438800 +775587037 +776566902 +776689599 +776932313 +776977004 +777104589 +778077847 +778144258 +778603898 +778659874 +778859956 +779322984 +779524360 +781491482 +782025134 +782189189 +782249257 +783262264 +783448407 +784126442 +784127270 +784530752 +784787534 +785210953 +785318436 +785935590 +786061541 +786194290 +786696393 +786874848 +786983325 +787270635 +787605992 +788038278 +788104881 +788310993 +788440137 +788681410 +788744808 +788800690 +789272818 +791071426 +791569246 +791941332 +792247970 +792256933 +792748502 +793592892 +794161230 +794299444 +796070219 +796090552 +796245659 +796250006 +796477741 +796549040 +797199735 +797552562 +797573203 +797818816 +798676284 +799244278 +800368183 +800985409 +801021920 +801242883 +801659046 +801916294 +803330454 +804067375 +804260552 +804506791 +804623772 +804846476 +805452821 +805705871 +806083058 +806972971 +807243241 +807377715 +808187252 +808836109 +808874468 +808984562 +809579721 +809807200 +810211462 +810395182 +811124033 +812302744 +813692893 +813948140 +815223154 +815538590 +816874433 +816920461 +817292250 +817466042 +817658106 +818218632 +818799796 +818807486 +821637837 +821657284 +821935231 +822112212 +822257254 +822412279 +823010950 +823321378 +823674466 +823806082 +823933458 +824127185 +824148447 +824349037 +824412007 +824476652 +824801953 +825191165 +825766700 +825843879 +826364942 +826624567 +827021738 +828056704 +829061279 +829584246 +829888695 +830084642 +830687475 +830780433 +830969474 +831138367 +831280695 +831770530 +831927752 +832203977 +832261316 +832604307 +832640017 +832690641 +833207912 +833596587 +833783550 +833917140 +834410305 +834467442 +835279585 +835474012 +835826038 +836002233 +836185491 +836856352 +838469346 +838668025 +838816646 +839450830 +839801429 +840778392 +841947122 +842218427 +842256804 +842400216 +842758690 +843423237 +843507289 +843884886 +844250666 +844325286 +845542871 +845662724 +845719474 +845787048 +845919400 +846880511 +846946980 +847166627 +847273825 +847791657 +847996663 +848228106 +849139976 +850801315 +851309931 +851862706 +852224777 +852615415 +853603755 +853721667 +854152622 +854262330 +854265428 +854545117 +856193888 +856758929 +857308910 +857895014 +858332830 +858798896 +858905762 +859409603 +859440005 +859585526 +859658316 +860181962 +860669150 +860846767 +861244801 +861952175 +862024356 +862147500 +862755113 +863105807 +863245501 +863445567 +863657978 +863932476 +863973283 +864669182 +864773970 +865482594 +866221799 +866618541 +867763185 +868586958 +868777869 +868912079 +869134304 +869201064 +869943645 +870916025 +871106145 +871235422 +871249879 +871399091 +872310681 +872822082 +873398211 +873857056 +873920170 +874153004 +874329839 +876311930 +876392094 +876576250 +877499033 +877699200 +878067931 +878110743 +879593393 +879677523 +879791861 +880561087 +880953879 +881229375 +881615148 +883903061 +884284099 +884692806 +885095188 +885140126 +885501659 +885520637 +886351791 +886615847 +886737985 +886984397 +888210078 +888397042 +889319035 +889907007 +890129800 +891060271 +891244698 +891949106 +893464287 +893869217 +894228049 +894526626 +894877961 +896004628 +896245503 +896312145 +896459833 +897534231 +898068523 +898865299 +900633894 +900902736 +900922944 +901633622 +902319375 +902349396 +902380894 +902531215 +903687005 +904144909 +904524510 +905880013 +906113243 +906207888 +906909240 +907542862 +907767273 +907940255 +908475140 +908927009 +909594165 +910831637 +910918632 +910944145 +910974730 +911112670 +912416444 +912521444 +913702297 +913718441 +913910541 +914261671 +915075353 +915835172 +916007689 +916060944 +918207744 +918547244 +918725464 +918903292 +919526743 +919849925 +920395261 +920513838 +920614314 +921002765 +921489445 +922492113 +922841453 +922945374 +922985928 +923014160 +923231840 +924584419 +924668768 +924696817 +924803583 +924990823 +925151328 +925686466 +925696100 +926437410 +926736830 +928003738 +928217600 +928253788 +928364431 +928782620 +928897787 +929440022 +929599426 +929692543 +930042894 +930350734 +930892884 +931514124 +932092652 +932162454 +932709784 +932747424 +932826724 +933658421 +933919065 +934248280 +934823036 +934984232 +935473415 +936425151 +937122748 +937568800 +938088604 +938498884 +939009080 +939158082 +939386815 +939829128 +939977175 +940272278 +940297206 +940520745 +940549850 +940640720 +941126844 +941582782 +942016928 +942331764 +942374902 +942839608 +944353394 +945050433 +945152441 +945297706 +945338172 +945745584 +946036740 +946129670 +946597406 +946873143 +947053314 +947893877 +947933443 +948149434 +948700961 +949007959 +949400578 +950138729 +950236130 +950699394 +951167033 +951366604 +951732277 +952801374 +953364219 +953936840 +954158063 +954324938 +954454148 +955258910 +955816774 +955830565 +955902050 +956173278 +957517798 +959046782 +959533961 +959767665 +960165653 +960708196 +960956111 +961585581 +962535489 +962599520 +962762332 +963361456 +964248308 +964351911 +965734983 +965965444 +966381191 +966450475 +967034686 +967683013 +967706650 +969333032 +969358181 +969369786 +969471810 +969885070 +970216351 +971358788 +973216374 +973536806 +973598896 +973723825 +974000196 +974666688 +974878491 +975408501 +975510255 +975897935 +976586569 +976663438 +976978749 +978022408 +979026116 +980233913 +980591712 +981227348 +981593533 +981764728 +981941310 +982166937 +983061146 +983141727 +983421073 +983696319 +985061671 +985357253 +985374377 +985418226 +985473470 +985527201 +985768717 +986194262 +986838172 +987564826 +987605311 +988230730 +989510175 +989737119 +990081609 +990151439 +991245076 +991257245 +991936898 +992383024 +992742163 +992874694 +993562357 +994018753 +994287022 +994604695 +994654548 +994854661 +996111692 +996240934 +996866453 +997082757 +997397977 +997556733 +998123090 +999044302 +999091627 +1000266560 +1000717865 +1001535284 +1003289706 +1003386310 +1003479455 +1003965028 +1004420573 +1005109112 +1005122472 +1005351891 +1005753061 +1005830251 +1006420519 +1006600584 +1007660176 +1008970563 +1008995282 +1011302013 +1011500146 +1011539802 +1012021363 +1012967130 +1013403857 +1014202673 +1014442072 +1014662609 +1014730052 +1014769266 +1015062057 +1015418659 +1015681374 +1015808080 +1015939255 +1016047759 +1016965354 +1017842936 +1017991854 +1018340765 +1018392194 +1019618768 +1020147868 +1020293583 +1020611652 +1020949381 +1021372878 +1021928120 +1022232204 +1022826216 +1023010628 +1023421969 +1023608099 +1024565053 +1026029225 +1026151029 +1026309562 +1026637583 +1026671081 +1027392292 +1028013710 +1029135037 +1029135769 +1030168017 +1030627345 +1030708474 +1032438653 +1032676624 +1033646084 +1034134797 +1034328674 +1034571278 +1034648376 +1035053309 +1036832025 +1037509238 +1037915284 +1038143520 +1038239651 +1038602647 +1038603208 +1038808070 +1039180233 +1039626256 +1039968358 +1040268098 +1040721343 +1041206487 +1041959971 +1042099789 +1042937982 +1043204475 +1043875100 +1044671379 +1044852442 +1045647915 +1047003847 +1047452010 +1047664362 +1047721883 +1047998696 +1048715672 +1048881964 +1049173198 +1049499341 +1049790948 +1050055488 +1050224385 +1050359285 +1051746717 +1051891711 +1052741026 +1052809749 +1053401992 +1054137674 +1054220281 +1055083390 +1055292578 +1055398678 +1055476298 +1056219868 +1057127663 +1057279051 +1057621686 +1057925991 +1058008798 +1058742204 +1060737961 +1064364042 +1064575796 +1065325307 +1065692631 +1066079052 +1066239432 +1067014486 +1068042721 +1068515929 +1068547311 +1068762711 +1068989959 +1069148189 +1069432124 +1069549236 +1070301109 +1070496957 +1070618913 +1070851433 +1071840441 +1072512360 +1073447571 +1073484443 +1073699058 +1074279919 +1074625295 +1074845815 +1075428377 +1075606392 +1076104675 +1076888855 +1076930249 +1079434688 +1079686843 +1079967247 +1079994033 +1080345797 +1080346832 +1080357157 +1080789325 +1081705809 +1082356324 +1082799666 +1083022591 +1083120904 +1083259070 +1084545480 +1084781252 +1084864109 +1086266683 +1086317318 +1086734310 +1086843923 +1087119915 +1087311210 +1087434179 +1087620178 +1087801202 +1088231781 +1088398556 +1090393339 +1091082771 +1091095262 +1091923865 +1092140767 +1092501442 +1092646847 +1092693074 +1092974753 +1092974835 +1093183435 +1093499933 +1093743692 +1095153509 +1095429885 +1095477296 +1096251985 +1097138753 +1097139485 +1097206264 +1097471261 +1097954478 +1098384267 +1098428012 +1098622200 +1098762990 +1099626907 +1100727431 +1101196552 +1101266849 +1101978683 +1102007410 +1102227925 +1102228647 +1102404177 +1102406466 +1102551082 +1102888500 +1103044768 +1103214530 +1103557336 +1105252276 +1106946281 +1107540702 +1107618460 +1108291878 +1108471475 +1108785367 +1109632642 +1109715022 +1109947110 +1110250754 +1110734299 +1111219745 +1111304283 +1112770637 +1112866629 +1112959674 +1113132162 +1113234149 +1113345603 +1113691819 +1114160301 +1114273128 +1114311520 +1115320183 +1115971984 +1116028112 +1116087289 +1116202907 +1116806735 +1117121674 +1117500199 +1117628143 +1117701773 +1117812152 +1117928234 +1118360713 +1118590156 +1120344227 +1120379667 +1121819313 +1121904005 +1121995478 +1122099757 +1123004067 +1123316587 +1123363797 +1123687797 +1123732030 +1124206279 +1124775605 +1125584582 +1126012697 +1126044669 +1126279754 +1126455852 +1126634011 +1126888838 +1127310935 +1128055983 +1128773207 +1129623572 +1129683340 +1131113938 +1131482647 +1132354849 +1132905563 +1133495576 +1133684927 +1133785574 +1133908365 +1134300407 +1134314354 +1134360646 +1134431419 +1135370887 +1135531769 +1135622366 +1135984857 +1136256974 +1136501021 +1137260485 +1138164026 +1138339650 +1138352051 +1138743538 +1139577982 +1139914167 +1139953975 +1140207169 +1140213430 +1140795769 +1140925446 +1140950272 +1141083386 +1141445750 +1141575488 +1142331284 +1142359890 +1143180092 +1143216976 +1144424404 +1145882291 +1146197815 +1146216246 +1146294261 +1147232188 +1147315896 +1148129795 +1148563452 +1148770457 +1148809803 +1150552491 +1151261682 +1151473653 +1152058682 +1152615647 +1152773680 +1152937384 +1152964711 +1152972542 +1153271652 +1153829659 +1155607130 +1156133891 +1156504018 +1156757397 +1156933541 +1156936554 +1157073625 +1157138475 +1157178955 +1158142848 +1158410082 +1158927239 +1159369669 +1160186554 +1160226468 +1161141016 +1161141924 +1161437467 +1161491155 +1161742074 +1162850071 +1163365372 +1163367198 +1163510103 +1163524533 +1163864639 +1164709435 +1164761228 +1165189117 +1165261891 +1165830467 +1166212832 +1166405508 +1167488005 +1169564874 +1169573095 +1169786757 +1169892175 +1170029643 +1170106294 +1170358938 +1170479437 +1171024357 +1171894119 +1172047197 +1172536440 +1173948844 +1175194597 +1175572741 +1176649595 +1177541667 +1178088223 +1179459932 +1179609743 +1179688016 +1179931028 +1180296623 +1180703268 +1181360818 +1181810825 +1181818452 +1182117072 +1182320456 +1183227621 +1183348505 +1183522473 +1185049664 +1186000542 +1186081026 +1186922443 +1187175823 +1187298559 +1187334103 +1187517391 +1188526372 +1188816822 +1189086384 +1189290523 +1190427613 +1190798700 +1191263023 +1191291887 +1191590999 +1192008875 +1192110073 +1192448697 +1192544001 +1193094521 +1193156820 +1193276503 +1193539579 +1194004570 +1194068802 +1194961354 +1195033773 +1195576242 +1196490937 +1197110148 +1197304500 +1197336764 +1197719118 +1197726505 +1198409161 +1198445936 +1199644508 +1199660096 +1199690027 +1200205131 +1201379040 +1201942282 +1202389591 +1202642932 +1203258264 +1203401171 +1204396528 +1204426701 +1204444898 +1205496084 +1205712678 +1205834464 +1206177224 +1206354026 +1206940796 +1208352594 +1208692212 +1209485202 +1210188958 +1211152898 +1211321723 +1211400209 +1211583980 +1211750531 +1212066272 +1214172575 +1214579654 +1215324576 +1215963747 +1216329106 +1216869855 +1217504414 +1217590391 +1217637671 +1218188069 +1218195949 +1218283517 +1218304924 +1218617701 +1218993311 +1219180565 +1219288775 +1220122975 +1220160065 +1220869344 +1220995559 +1221769484 +1222224373 +1222651376 +1222680637 +1223295239 +1223876121 +1223951017 +1224235171 +1224327401 +1224565081 +1224980718 +1226335306 +1226343431 +1226421543 +1227228561 +1228111138 +1228179574 +1228807465 +1229335707 +1229778942 +1230059006 +1230191560 +1230325615 +1230749820 +1230774559 +1231040873 +1231163045 +1232030458 +1232300232 +1232843059 +1233356699 +1234004276 +1234893708 +1235741937 +1236646528 +1237110457 +1237305452 +1237519010 +1237643908 +1237780491 +1237942506 +1237996543 +1238776815 +1239159047 +1239630040 +1240282159 +1240616767 +1240722836 +1241534992 +1241561498 +1241840911 +1242475446 +1242484834 +1242592979 +1243283147 +1243685673 +1243810591 +1244300139 +1246152126 +1246485907 +1246499424 +1246520860 +1246553655 +1248833045 +1248972008 +1249432282 +1250597544 +1251136707 +1251293583 +1251601520 +1251619252 +1251870916 +1252401781 +1252851015 +1253201606 +1253259425 +1253678610 +1253756402 +1254213047 +1254493022 +1254961543 +1255275736 +1256310157 +1256661329 +1256729824 +1256870131 +1256967804 +1257515622 +1257604200 +1259192236 +1260933986 +1261248745 +1261290932 +1261609242 +1262211218 +1262409479 +1263893897 +1264373737 +1264831149 +1264954645 +1265142662 +1265210603 +1265270336 +1266354696 +1267204086 +1267909135 +1269579863 +1269592240 +1269904367 +1270240439 +1270677022 +1271204838 +1271293045 +1271820084 +1271928879 +1272015101 +1272069244 +1272128404 +1272463518 +1273447405 +1273526524 +1274230735 +1274375494 +1274679776 +1274905492 +1274936529 +1275538530 +1275837410 +1276025919 +1277247426 +1277727655 +1278368930 +1278390925 +1278933294 +1279124025 +1279178225 +1279623505 +1281296108 +1281319329 +1281759554 +1281962235 +1282249287 +1282694527 +1283908045 +1284417298 +1284726410 +1285209786 +1285809750 +1285943579 +1286068735 +1286863199 +1287057208 +1287273616 +1287459338 +1287758831 +1287845714 +1287963341 +1288275672 +1288464837 +1288522491 +1288546770 +1290178599 +1290240447 +1291102316 +1292541083 +1293966253 +1294571985 +1295405824 +1295416569 +1295418421 +1295750523 +1295959461 +1296015846 +1296057611 +1296103603 +1296355252 +1296789436 +1297279118 +1297612177 +1297914897 +1298269648 +1298424718 +1299032923 +1299091772 +1300024831 +1300287705 +1300926604 +1301279651 +1302117231 +1303669803 +1304123641 +1304415030 +1304629076 +1305936117 +1306017579 +1306101704 +1306148671 +1306612951 +1306874466 +1307684763 +1309917261 +1310477429 +1311451297 +1312435478 +1312597834 +1313299123 +1313601104 +1314256876 +1314369374 +1314457898 +1314577815 +1314883576 +1315284972 +1316042816 +1316134962 +1316281365 +1317008279 +1317110603 +1317167466 +1317685412 +1318144766 +1318348582 +1318527110 +1318715843 +1318790523 +1318939896 +1319548576 +1319993196 +1320502263 +1320772351 +1320805513 +1320867553 +1321194025 +1322417555 +1323050632 +1324460942 +1324479039 +1324751634 +1324867594 +1327209657 +1328640044 +1328692608 +1329177086 +1329541613 +1329751405 +1330826317 +1331026655 +1331081163 +1331297109 +1331503387 +1332542213 +1332584730 +1334870967 +1335116193 +1335424890 +1336272110 +1336361382 +1336586477 +1337020325 +1337271115 +1337768838 +1337819504 +1339190157 +1340545419 +1340733735 +1341072107 +1341520169 +1341535252 +1342432502 +1342857841 +1343465464 +1343775781 +1343999744 +1345989583 +1347768191 +1347821451 +1348160326 +1350849860 +1351443356 +1351508473 +1351750364 +1352545131 +1353065137 +1353068010 +1353631290 +1353653943 +1354615964 +1354635935 +1355148118 +1355555649 +1355631490 +1357938490 +1358398488 +1359144267 +1359660698 +1360161993 +1360681445 +1360713969 +1361182987 +1361398842 +1362096357 +1362133292 +1362321523 +1362649807 +1363836739 +1364154230 +1364596368 +1365030732 +1365676841 +1365980647 +1366132258 +1366222411 +1366273005 +1367169393 +1367444643 +1367697683 +1368293482 +1368527320 +1368753050 +1369551529 +1369554260 +1370360624 +1370363575 +1370567981 +1370962599 +1370973073 +1371175643 +1371836135 +1371861247 +1371977391 +1371993875 +1372032237 +1372549295 +1373050660 +1373130585 +1373237767 +1373520832 +1373632764 +1374151009 +1375624187 +1375723777 +1375885479 +1377291031 +1377472507 +1377483074 +1378004369 +1378143851 +1378278311 +1378391009 +1378456337 +1379444348 +1379622013 +1379859808 +1379904750 +1380179359 +1380405917 +1380749430 +1381388823 +1382472329 +1382496058 +1382645639 +1383123095 +1383372543 +1383427877 +1384261801 +1384925669 +1386477070 +1386582514 +1386700061 +1387299312 +1387907574 +1388711607 +1389130569 +1390281846 +1390652826 +1390878516 +1391898914 +1392052586 +1392401200 +1392789176 +1393032431 +1394107268 +1394327923 +1394646204 +1394659336 +1394750550 +1394846645 +1395142909 +1395499526 +1395718127 +1396305676 +1396672791 +1397766112 +1397810463 +1398109054 +1398200300 +1398264341 +1398281442 +1398323421 +1399244424 +1400060395 +1400371467 +1400411686 +1400623222 +1400995069 +1401042204 +1401571228 +1401806711 +1402001793 +1402889299 +1403474407 +1403845175 +1403906083 +1403975471 +1404053364 +1404566355 +1404744627 +1405807063 +1405825309 +1405844078 +1405880738 +1406468936 +1407029090 +1407606526 +1407697808 +1407855123 +1407942962 +1408242665 +1408694034 +1409051063 +1409339134 +1409609924 +1409824959 +1410413292 +1410833306 +1411800388 +1412520083 +1412612802 +1413107483 +1413277809 +1413540026 +1413716324 +1413718179 +1414031964 +1414080261 +1415277633 +1415402040 +1415872429 +1417408253 +1417726950 +1418040717 +1418321500 +1418468058 +1418606187 +1418681661 +1419574914 +1420483250 +1420555786 +1420752777 +1420849331 +1420858076 +1421115860 +1421755527 +1422230539 +1422449029 +1423244566 +1423509394 +1423905300 +1424278890 +1424451800 +1424866652 +1426350543 +1426792910 +1427714219 +1427753957 +1427892507 +1428318238 +1428703372 +1429616774 +1431413867 +1431823014 +1432422232 +1432943730 +1433227321 +1433380916 +1433430731 +1435664771 +1435897252 +1436413936 +1436785927 +1437195636 +1437494397 +1437776216 +1438096422 +1438196246 +1438527021 +1438921633 +1439186832 +1439270535 +1439361996 +1439922786 +1440190080 +1440251367 +1440269322 +1440730796 +1440913702 +1440978580 +1442020786 +1442035564 +1442063280 +1443088571 +1443394850 +1445253514 +1445372823 +1446051187 +1446300174 +1446663920 +1447416218 +1447707328 +1447931178 +1447936720 +1448074039 +1448698871 +1449166623 +1449505864 +1449762806 +1449911337 +1449968169 +1450003993 +1450060931 +1450188952 +1450328124 +1450414967 +1451152680 +1452286978 +1452315703 +1452327929 +1452787292 +1453706559 +1454046848 +1454147128 +1454428315 +1455053111 +1455282082 +1455349047 +1456523795 +1456534413 +1457525159 +1459308083 +1459609402 +1460065656 +1460519224 +1460731383 +1460811963 +1460904128 +1460983677 +1461222397 +1461256132 +1462903673 +1463212256 +1463451920 +1463709953 +1464353694 +1465587892 +1465633913 +1465854394 +1466261722 +1467430721 +1467439978 +1469074142 +1469358803 +1469407541 +1469704001 +1470403450 +1471610784 +1471612916 +1471849541 +1472069359 +1473962240 +1474229018 +1474973188 +1474985679 +1475570247 +1476720748 +1478075545 +1478192291 +1478255091 +1478583671 +1478833648 +1479282989 +1479293955 +1479333735 +1479489357 +1480494531 +1481511819 +1481893717 +1482467304 +1482489064 +1483632586 +1484734418 +1486291345 +1486459799 +1487207888 +1487424531 +1487448866 +1487710970 +1488195303 +1488465025 +1488878204 +1489856203 +1490801508 +1490941901 +1491248307 +1491586535 +1491790677 +1491821328 +1492414344 +1492794111 +1492799059 +1493103516 +1493278716 +1493922063 +1494159304 +1494203009 +1494270007 +1494334454 +1494337215 +1495564853 +1495696031 +1496041547 +1496995031 +1497274586 +1499930905 +1500100753 +1500907704 +1501253003 +1501467401 +1501629864 +1501840524 +1502398960 +1503275341 +1503284545 +1503596591 +1503952611 +1504618601 +1504982016 +1505054937 +1505620267 +1506807780 +1507176430 +1507278565 +1508946686 +1509050434 +1509408203 +1509638026 +1509644439 +1509758735 +1510554155 +1510831191 +1511259942 +1512504538 +1512973172 +1513179131 +1513730160 +1513796476 +1513903285 +1513924815 +1514086119 +1514477934 +1515501023 +1515761366 +1516441295 +1516760093 +1517193078 +1517334307 +1517499717 +1518222117 +1518251780 +1518267452 +1518715466 +1519132691 +1519767115 +1520069584 +1520291061 +1520635139 +1520640317 +1520953109 +1520981701 +1521249740 +1521276875 +1521406902 +1522080772 +1522295250 +1523671356 +1523875640 +1524293803 +1524448144 +1524602840 +1524903660 +1524929137 +1525033237 +1525140446 +1525210961 +1525725828 +1526541458 +1526585925 +1526977635 +1527465638 +1527688676 +1527825702 +1528017317 +1529061754 +1529337799 +1529954922 +1530221024 +1530731061 +1531392118 +1531613236 +1531664003 +1531865138 +1532397339 +1532591085 +1533109193 +1534328604 +1535016435 +1535112248 +1535130676 +1535555463 +1535966417 +1536481432 +1537162781 +1537963263 +1538252821 +1539097437 +1540594368 +1541948528 +1542702576 +1543713665 +1544916794 +1544960794 +1545470611 +1545572814 +1545660560 +1546154631 +1546497642 +1546521207 +1546759770 +1547633130 +1547777065 +1548125467 +1548293334 +1548524078 +1549330908 +1549431732 +1549526284 +1549607934 +1549799363 +1550832084 +1551391721 +1551455029 +1551639489 +1553954869 +1554045808 +1554799690 +1557252236 +1558494726 +1558539747 +1559151702 +1560885090 +1561464788 +1561873678 +1562309331 +1563873846 +1563980603 +1565964581 +1566775478 +1568173821 +1568837091 +1569218287 +1569229615 +1569763997 +1570152544 +1570463818 +1570601757 +1570716822 +1571369753 +1571439616 +1571459161 +1571645445 +1571722384 +1573585859 +1573715069 +1573732893 +1573870156 +1574360985 +1574677301 +1574890448 +1575007245 +1575162676 +1575454908 +1576352370 +1576391672 +1576489639 +1576540059 +1576741125 +1577076922 +1578162247 +1578838178 +1579937204 +1580410100 +1581294373 +1581370573 +1581610401 +1581914937 +1581932891 +1582870828 +1583106605 +1583688456 +1583739266 +1583906895 +1584854395 +1584914180 +1585478510 +1585797530 +1585882836 +1585940671 +1586224034 +1587103315 +1587182360 +1587638818 +1587670151 +1588731777 +1590148524 +1591041811 +1591050034 +1591277657 +1591370511 +1591535966 +1591629519 +1592008864 +1592377236 +1593161478 +1593554343 +1593776608 +1593939019 +1594190241 +1594308215 +1594568611 +1594822092 +1595137572 +1595299085 +1595560392 +1595898322 +1596135861 +1596330015 +1596338545 +1596510207 +1596711996 +1596889353 +1596895256 +1597034039 +1597450914 +1597564621 +1597658480 +1598319969 +1598672590 +1599042640 +1599395952 +1599853096 +1600181931 +1601237946 +1601266876 +1601372273 +1602058330 +1602436554 +1602507669 +1602580094 +1603252147 +1603341972 +1604199879 +1604703033 +1604834262 +1605086244 +1605791424 +1607438659 +1607446139 +1607503808 +1607689325 +1608888789 +1609025624 +1609209357 +1609420722 +1610326933 +1610354835 +1610907046 +1611021262 +1611150032 +1611467954 +1611664715 +1611916639 +1612517587 +1613163141 +1613165298 +1613386044 +1613979046 +1614635894 +1616526251 +1617180560 +1617480512 +1618820264 +1620246009 +1620419572 +1620558038 +1621091953 +1621529118 +1622005328 +1622050333 +1622179155 +1623050888 +1623209394 +1623459939 +1623484003 +1623603762 +1623889393 +1624173548 +1624464896 +1625170136 +1625362763 +1626430015 +1626970192 +1628121672 +1628408236 +1628680402 +1628925528 +1629189561 +1629370292 +1630008235 +1630930773 +1631421822 +1631563384 +1631675429 +1632334611 +1632444064 +1633251030 +1633279576 +1633749839 +1635711422 +1635720341 +1636157500 +1636414415 +1637251845 +1637285116 +1637734537 +1637810065 +1638312299 +1639636432 +1640069510 +1640251217 +1640495243 +1640852930 +1640902548 +1640973194 +1641303157 +1641602577 +1641940941 +1642386203 +1642911398 +1643200834 +1643432013 +1643945857 +1645163315 +1647038764 +1647432727 +1647550481 +1647681641 +1647739773 +1648407946 +1650957865 +1651189800 +1651228661 +1651602615 +1651723990 +1651979014 +1652035980 +1652336635 +1652488990 +1652662678 +1652917121 +1653730724 +1653793588 +1653808566 +1654218363 +1655512981 +1656357057 +1656382282 +1656527659 +1656836737 +1656899384 +1657491772 +1657581217 +1658389312 +1659558942 +1659763330 +1660203289 +1660354498 +1660936402 +1660941546 +1661160008 +1661615543 +1662120637 +1662713773 +1663348811 +1663703378 +1664878532 +1664927449 +1665063679 +1665592075 +1665665907 +1665797164 +1666560188 +1666610125 +1667012405 +1667094821 +1667723273 +1668291627 +1668425093 +1668950342 +1669878494 +1670051000 +1670430610 +1670843380 +1671617025 +1671679821 +1671687486 +1672636521 +1673022090 +1673071844 +1673450973 +1673561338 +1673593629 +1673652923 +1673869590 +1673943363 +1674093161 +1674183829 +1674526340 +1675009974 +1675050457 +1676062785 +1676489972 +1676828446 +1677809117 +1677942847 +1678303043 +1678800583 +1678966473 +1679435900 +1679760311 +1679807748 +1680355846 +1680740109 +1680854603 +1681145630 +1681154519 +1682433608 +1682860219 +1683120726 +1683309335 +1683703655 +1683898065 +1684093902 +1685479660 +1685670802 +1685674772 +1685886511 +1686078315 +1686638605 +1687247302 +1687293049 +1687482043 +1689336427 +1689372805 +1689487672 +1690513744 +1690649318 +1690807299 +1690811551 +1691243981 +1692028399 +1692111480 +1692530403 +1692543235 +1692621968 +1693307286 +1695864459 +1695920939 +1696302113 +1696325466 +1696537007 +1696791383 +1697137871 +1697372223 +1697413331 +1697491301 +1697497417 +1697839909 +1697861675 +1698136637 +1698294722 +1698557750 +1698784584 +1699935507 +1700043014 +1700344833 +1700638336 +1701233079 +1701647480 +1701851674 +1702935667 +1703357407 +1704279225 +1704292550 +1704737065 +1705025741 +1705212855 +1705921936 +1706027242 +1706809413 +1707155967 +1707161544 +1707468143 +1708824936 +1708916678 +1709077084 +1709201354 +1709389906 +1709634512 +1710259167 +1710426304 +1710907081 +1711432322 +1711982922 +1712616754 +1713655136 +1714938058 +1715382969 +1715586644 +1715791259 +1715949475 +1716206064 +1716336110 +1717057363 +1717674414 +1717679162 +1717729007 +1717764027 +1718068782 +1718195253 +1718899451 +1718932089 +1718964581 +1719218496 +1719291728 +1719311226 +1719530929 +1719668723 +1719714046 +1720452382 +1720674605 +1721892191 +1722090599 +1722335152 +1722687898 +1722830323 +1723559018 +1724443772 +1724494481 +1725845274 +1725963428 +1726439150 +1726464916 +1726765254 +1728412086 +1728563880 +1728953525 +1729113281 +1729204466 +1729572730 +1729966674 +1729979067 +1730134231 +1730380637 +1730717673 +1730988528 +1732361885 +1732578383 +1732727339 +1733041184 +1734255953 +1735128089 +1735188871 +1735780827 +1736050561 +1736129733 +1736538146 +1736627648 +1736738386 +1736906002 +1736977930 +1737568236 +1738193197 +1738305701 +1738335772 +1738410219 +1739025158 +1739482622 +1740161959 +1740174027 +1742250186 +1743015970 +1743152565 +1743244151 +1743848324 +1744401022 +1745102682 +1745361932 +1745555996 +1745959691 +1746080292 +1746273827 +1746520899 +1746919396 +1747378767 +1747440482 +1748636583 +1748903633 +1749524853 +1749910679 +1750330993 +1750337080 +1750662000 +1751617362 +1751860646 +1752201454 +1752744208 +1752943554 +1753498480 +1754069475 +1754410332 +1754668850 +1754839684 +1755510835 +1755959226 +1755979355 +1756994021 +1757011032 +1758073489 +1758562660 +1758672764 +1759978969 +1760383955 +1760598328 +1760727398 +1760766488 +1761709344 +1762994023 +1763354671 +1764240108 +1764280160 +1764908354 +1765066231 +1765484552 +1765509215 +1765514062 +1766056039 +1766904506 +1767032456 +1768092545 +1768481597 +1768494505 +1769279627 +1769447272 +1770040087 +1770166660 +1770223040 +1770398467 +1770637092 +1772535604 +1772721028 +1773208391 +1774533974 +1774733493 +1774812689 +1776097147 +1776765870 +1777147864 +1777228440 +1779267712 +1779689400 +1780048056 +1780773352 +1780955231 +1781180662 +1781306409 +1781515844 +1781932314 +1782345601 +1782509548 +1783467085 +1783610303 +1784656862 +1784788601 +1785661614 +1786015992 +1786188113 +1788317961 +1788625505 +1788880175 +1789037327 +1790074506 +1790086362 +1790088972 +1790234426 +1790656731 +1791132216 +1791692142 +1791821393 +1792014727 +1792552205 +1792700310 +1793106630 +1793516700 +1793607412 +1794544786 +1794939367 +1794957315 +1795211682 +1795449985 +1795569252 +1796204638 +1796221962 +1796748614 +1796909870 +1797243573 +1797597107 +1797958480 +1800425111 +1800738917 +1800784106 +1801618897 +1801998995 +1802193328 +1802328716 +1802647610 +1803271884 +1803564093 +1803801439 +1804320961 +1804347859 +1804656545 +1805363254 +1805659158 +1805922105 +1806020360 +1806282075 +1806630884 +1807597377 +1808069952 +1808357277 +1808474384 +1809128164 +1809529970 +1809582629 +1809661249 +1809805200 +1810651209 +1811061184 +1812409866 +1812710028 +1812840931 +1813526744 +1813546587 +1814129334 +1814547074 +1814663544 +1816147218 +1816566383 +1816887781 +1817229282 +1817242323 +1817514697 +1817776049 +1817965390 +1819167855 +1819841820 +1820280974 +1821160636 +1821714369 +1822113638 +1822114083 +1822427912 +1823179812 +1823920990 +1824104215 +1824644645 +1824901525 +1825384639 +1825449584 +1826302182 +1826640037 +1827312589 +1827876561 +1828010540 +1828348957 +1828412690 +1829452033 +1829596130 +1829836468 +1829956581 +1830226610 +1831334710 +1831677676 +1831696566 +1831739185 +1831812601 +1831868289 +1831871876 +1832113294 +1833076876 +1833677387 +1833683126 +1834457754 +1835077262 +1835332071 +1836151690 +1837438781 +1837443209 +1838780412 +1839152579 +1839157259 +1840905985 +1841092705 +1841388853 +1841482482 +1842486688 +1843077410 +1843383840 +1844232879 +1845889973 +1846273263 +1846370022 +1846399412 +1846568813 +1846576748 +1847178352 +1847257552 +1847552042 +1848144703 +1848151369 +1848769448 +1849506631 +1849856032 +1849887092 +1849908467 +1850011484 +1852897629 +1853179444 +1853417277 +1853568390 +1853763638 +1853875969 +1853937506 +1854342883 +1854566556 +1855114084 +1855312350 +1856090999 +1856211760 +1856305515 +1856806916 +1857241566 +1857648016 +1857710634 +1857847907 +1857936757 +1858772616 +1859006602 +1859354089 +1859797040 +1860272693 +1861885371 +1862087517 +1862226584 +1862594299 +1862741469 +1863208190 +1863912680 +1864056209 +1865134111 +1865276847 +1865334967 +1865390995 +1865709646 +1866477481 +1866843632 +1867933256 +1868830821 +1868853086 +1870646807 +1871389170 +1872358810 +1872617926 +1872970983 +1872993547 +1873183223 +1873327330 +1873437895 +1874003906 +1874011506 +1874646522 +1874661105 +1874977901 +1875079164 +1876214171 +1876339191 +1876348522 +1876731496 +1877080768 +1877437289 +1877725691 +1878986308 +1879779298 +1880004204 +1880565034 +1881760657 +1881889897 +1882060884 +1882154612 +1882267809 +1882275028 +1882388880 +1883564279 +1883652998 +1883956673 +1884024922 +1885380055 +1886168595 +1886300653 +1886598362 +1886674036 +1886745809 +1887012935 +1887429795 +1887496316 +1887507727 +1888292363 +1888911383 +1889203830 +1889307884 +1891590751 +1892073929 +1892091329 +1892927136 +1893816894 +1893878442 +1895015806 +1895156441 +1895686413 +1896296912 +1896336358 +1896538683 +1896656087 +1896731866 +1896951407 +1896972359 +1897629965 +1898125878 +1899012867 +1899298070 +1900855434 +1900920988 +1901517834 +1901557112 +1901560354 +1902201505 +1902416401 +1902579514 +1902783838 +1903483048 +1904134983 +1904212175 +1904297982 +1904525077 +1905167202 +1905258796 +1905347024 +1905462781 +1906103699 +1906207926 +1906281883 +1906312200 +1906372951 +1906474448 +1906604183 +1907159131 +1908694399 +1908696811 +1908782239 +1909466103 +1909743078 +1910445699 +1910671166 +1910821166 +1911223213 +1911437377 +1911762770 +1912649397 +1912786546 +1912856893 +1914247458 +1915243709 +1915469775 +1916024656 +1916177385 +1916258364 +1917471321 +1917836456 +1918015925 +1918274790 +1918460161 +1918559100 +1919014693 +1919081423 +1919842401 +1920132366 +1920892040 +1921920020 +1922025095 +1922608091 +1922907778 +1923023522 +1924122507 +1924264526 +1924585057 +1924817394 +1925019173 +1925325102 +1925401163 +1925924671 +1927196287 +1928656918 +1928952270 +1929030151 +1929468576 +1929524543 +1929884419 +1929995761 +1930833031 +1931869325 +1931978336 +1932319093 +1932326598 +1932340264 +1932434559 +1932779228 +1934567780 +1934746482 +1935354728 +1936410255 +1936743077 +1937414813 +1938199990 +1938740718 +1939766282 +1939900837 +1939929205 +1940769323 +1941152827 +1941256335 +1941521037 +1941830273 +1942086567 +1942241109 +1942932263 +1942951687 +1943791877 +1943828473 +1944017124 +1944325972 +1944401579 +1944925275 +1944929049 +1945434542 +1945541061 +1945731227 +1945881798 +1946224703 +1946912817 +1947312328 +1947394013 +1947690946 +1947816930 +1949046003 +1949138565 +1949201016 +1949295933 +1949332544 +1950300738 +1950373557 +1950665699 +1950732970 +1951096566 +1952481778 +1952837489 +1953245862 +1954170253 +1955204315 +1955283460 +1955360207 +1955557415 +1955812599 +1955822659 +1955855673 +1957021068 +1957433783 +1958698151 +1959605041 +1961883944 +1962067476 +1962261137 +1962456541 +1963725302 +1963746826 +1964571639 +1964575207 +1964798655 +1965214887 +1965236632 +1965938096 +1966397780 +1966448042 +1966455501 +1966594745 +1966756799 +1966992714 +1968001627 +1969459881 +1970121684 +1970215698 +1970419885 +1971899521 +1972138625 +1972401863 +1972579106 +1972773434 +1972906172 +1972983984 +1973008677 +1973496900 +1973843890 +1974651527 +1974866841 +1974905464 +1975321621 +1975347291 +1975686428 +1975763743 +1976042858 +1976260885 +1976303715 +1976769124 +1976872309 +1977400993 +1977693925 +1979831306 +1980004795 +1980247142 +1980369263 +1980439693 +1981151767 +1981707536 +1982633863 +1982913987 +1983294490 +1983765429 +1984077960 +1985214231 +1985876929 +1986082466 +1986134900 +1986406134 +1986464126 +1986546127 +1988022187 +1988232552 +1988595497 +1988935788 +1989069465 +1989387157 +1990311334 +1990337428 +1990398117 +1992060907 +1992746174 +1992910288 +1993056274 +1993396144 +1994057935 +1994123377 +1994163260 +1994647893 +1994840702 +1994927466 +1995027992 +1995039840 +1995179989 +1995348814 +1995658531 +1995699806 +1996738215 +1996953453 +1997057051 +1997122557 +1997163490 +1998530430 +1999106261 +1999457567 +1999535108 +1999783458 +1999996902 +2000140696 +2000858786 +2001416693 +2002873105 +2003151458 +2003509785 +2004334485 +2005110560 +2006437298 +2006816312 +2006887547 +2008131648 +2008526800 +2008594260 +2008654248 +2008796347 +2009133395 +2009706935 +2010246257 +2010504454 +2011030804 +2011084922 +2011586681 +2012388542 +2012633790 +2012641329 +2012818205 +2013697987 +2013783047 +2013840398 +2014038108 +2014065280 +2014083971 +2014092020 +2015968022 +2016268558 +2016429328 +2017536240 +2019874372 +2019929511 +2020959200 +2021018452 +2021076883 +2022154087 +2022492824 +2023542021 +2023554808 +2023753310 +2024201018 +2024227440 +2024334195 +2025139946 +2025186860 +2025282751 +2025716148 +2026189422 +2026203246 +2026675993 +2027552250 +2027904571 +2028219547 +2028562101 +2028665399 +2028670128 +2029791986 +2030365295 +2030413558 +2030960044 +2031405039 +2032559711 +2032941145 +2033534783 +2034634128 +2034672808 +2036708515 +2037835062 +2037888774 +2038009612 +2038045667 +2039431051 +2039637761 +2039800301 +2041082761 +2041303094 +2042107432 +2042233542 +2042363657 +2042415472 +2042511229 +2043231877 +2043319160 +2043987821 +2044253939 +2044283948 +2044408040 +2044631917 +2044788184 +2044899365 +2045168728 +2045727198 +2046044615 +2046301553 +2046390674 +2046829433 +2046968218 +2047291275 +2047430125 +2047456911 +2047539620 +2047862769 +2048572294 +2048659403 +2049934499 +2050182629 +2051069870 +2052220794 +2053171160 +2053336231 +2053481834 +2054271782 +2054635617 +2055350505 +2056340906 +2056366255 +2057248757 +2057315093 +2058066491 +2058518045 +2058685969 +2059209995 +2060067617 +2060111076 +2061034051 +2061092671 +2061388786 +2061768134 +2061907676 +2061993958 +2062197121 +2062271333 +2063413297 +2063501373 +2063706316 +2064169171 +2064313331 +2065322790 +2065840687 +2066118079 +2066674714 +2066821226 +2067555697 +2068512319 +2068957858 +2069260837 +2069358687 +2070009892 +2070626763 +2070895199 +2071158399 +2071378176 +2071599112 +2071848992 +2071875224 +2072162629 +2072210587 +2072295356 +2072960425 +2073561460 +2073684155 +2073724569 +2073937076 +2074396037 +2074824750 +2074832425 +2075345733 +2075563039 +2076186873 +2076394855 +2077570395 +2077648263 +2078316825 +2078455964 +2078928409 +2079371022 +2079987655 +2080298995 +2080392692 +2080401227 +2081132740 +2081373230 +2081511914 +2082544123 +2082689306 +2082942262 +2084997147 +2085264933 +2085375131 +2085375151 +2085845962 +2086540880 +2088117863 +2088143853 +2088252155 +2088275985 +2088464145 +2089702689 +2089923485 +2090195138 +2091546281 +2091797712 +2092744114 +2092925909 +2093300088 +2093845647 +2093971069 +2094739837 +2094747389 +2094899178 +2095002577 +2095177843 +2095189048 +2095435229 +2095676080 +2095783100 +2096030688 +2096745731 +2097512226 +2097585246 +2098874053 +2099105340 +2099358009 +2099703782 +2099745869 +2101027229 +2101103873 +2101622752 +2101839664 +2102174312 +2102566455 +2102782069 +2102896372 +2103577295 +2104716273 +2104977614 +2105098620 +2105430217 +2106089939 +2106347088 +2106439958 +2106570846 +2106712338 +2107374605 +2108822095 +2109122690 +2109426137 +2110438392 +2111173231 +2111918759 +2113518959 +2113930017 +2114912208 +2115130907 +2115876551 +2116113867 +2116583813 +2116628495 +2118107443 +2119120227 +2119917044 +2120181102 +2121261766 +2122614198 +2123843729 +2123903330 +2124023997 +2124453556 +2124573438 +2125708169 +2125791697 +2125798900 +2125953670 +2126285698 +2126864680 +2127161348 +2128559866 +2128618521 +2128935149 +2129342732 +2129469269 +2129771954 +2130379715 +2130603664 +2131097609 +2131312993 +2131365376 +2131412396 +2131844074 +2133222643 +2133424643 +2134248810 +2134711115 +2135093865 +2135365019 +2136516968 +2136913658 +2137688499 +2138239743 +2138752978 +2139768429 +2139791460 +2139933076 +2139999454 +2140611941 +2140813181 +2141337101 +2141868834 +2141956447 +2142034998 +2142255867 +2143725887 +2145151678 +2145770442 +2146120670 +2146212683 +2146236092 +2146250697 +2146915310 +2147037796 +2147279260 +2147345709 diff --git a/radixsort_serial b/radixsort_serial new file mode 100755 index 0000000000000000000000000000000000000000..5d8a21af474388660fe97fa0d0b7d6bf855efa90 GIT binary patch literal 13704 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 G|NjHQ@w_eo literal 0 HcmV?d00001 diff --git a/src/radixSort/radixSort.cu b/src/radixSort/radixSort.cu index 9a5182a..8558501 100644 --- a/src/radixSort/radixSort.cu +++ b/src/radixSort/radixSort.cu @@ -22,9 +22,10 @@ __global__ void copyToArray(int arr[], int output[], int n){ } } + void countSort(int arr[], int n, int exp) { - dim3 gridSize(20,1,1); - dim3 blockSize(20,1,1); + dim3 gridSize(1,1,1); + dim3 blockSize(256,1,1); int *d_output, *output = (int*) malloc(sizeof(int) * n); int *d_arr, *d_count; int i, count[10] = {0}; @@ -45,13 +46,13 @@ void countSort(int arr[], int n, int exp) { for (i = 1; i < 10; i++) count[i] += count[i - 1]; - // Build the output array + // // Build the output array for (i = n - 1; i >= 0; i--) { output[count[ (arr[i]/exp)%10 ] - 1] = arr[i]; count[ (arr[i]/exp)%10 ]--; - } - + } + // Copy the output array to arr[], so that arr[] now // contains sorted numbers according to current digit cudaMemcpy(d_output, output, sizeof(int) * n, cudaMemcpyHostToDevice); diff --git a/src/radixSort/radixSort.cuh b/src/radixSort/radixSort.cuh index 1b73c9c..12d59c2 100644 --- a/src/radixSort/radixSort.cuh +++ b/src/radixSort/radixSort.cuh @@ -2,6 +2,5 @@ #define RADIX_SORT_CUH void radix_sort(int arr[], int n); -__device__ void sortMSB(int* out, int* arr, int n); #endif \ No newline at end of file diff --git a/src/radixsort_paralel.cu b/src/radixsort_paralel.cu index 8520fc3..4a104e2 100644 --- a/src/radixsort_paralel.cu +++ b/src/radixsort_paralel.cu @@ -28,11 +28,11 @@ int main(int argc, char *argv[]) { gettimeofday(&start, NULL); radix_sort(arr, n); gettimeofday(&end, NULL); - + + assert_sorted(arr,n); printf("\n"); printf("Parallel execution time = %ld.\n", getTimeDiff(start, end)); - - + writeOutputToFile(arr, n, "output.txt"); return 0; } diff --git a/src/radixsort_serial.c b/src/radixsort_serial.c index ac2d806..2c47c2f 100644 --- a/src/radixsort_serial.c +++ b/src/radixsort_serial.c @@ -100,5 +100,6 @@ int main(int argc, char** argv) printf("\n"); printf("Serial execution time = %ld.\n", getTimeDiff(start, end)); + printf("Writing output to file...\n"); return 0; } \ No newline at end of file diff --git a/src/util/util.cpp b/src/util/util.cpp index d43dbb1..771f547 100644 --- a/src/util/util.cpp +++ b/src/util/util.cpp @@ -2,6 +2,7 @@ #include <stdlib.h> #include <limits.h> #include <stdio.h> +#include <string.h> void generate_random(int *arr, int n){ int seed = 13516016; @@ -29,7 +30,7 @@ int get_max(int arr[], int n){ return max; } -void assert_sorted(int arr[], int n, double time_elapsed){ +void assert_sorted(int arr[], int n){ int err_index = 0; for (int i=0; i<n-1; i++){ if (arr[i] > arr[i+1]){ @@ -42,8 +43,21 @@ void assert_sorted(int arr[], int n, double time_elapsed){ } else { printf("Not sorted after index %d\n", err_index); } - - printf("Time elapsed : %f microseconds\n", time_elapsed*1000000); - } +void writeOutputToFile(int* arr, int size, const char* filename){ + FILE *fp; + char path[50]; + sprintf(path, "output/%s", filename); + fp = fopen(path, "w+"); + if (fp == NULL) + { + printf("Error opening file!\n"); + exit(1); + } + printf("Writing to output/output.txt\n"); + for (int i = 0; i < size; i++) { + fprintf(fp, "%d\n", arr[i]); + } + fclose(fp); +} \ No newline at end of file diff --git a/src/util/util.hpp b/src/util/util.hpp index db69ab8..20b11b0 100644 --- a/src/util/util.hpp +++ b/src/util/util.hpp @@ -3,7 +3,9 @@ void generate_random(int* arr, int n); // void print_arr(int * array, int num_elements); -void assert_sorted(int arr[], int n, double time_elapsed); +void assert_sorted(int arr[], int n); int get_max(int arr[], int n); long getTimeDiff(struct timeval start, struct timeval end); +void writeOutputToFile(int* arr, int size, const char* filename); + #endif \ No newline at end of file -- GitLab