pidigits Lisp SBCL program
source code
;; The Computer Language Benchmarks Game
;; http://benchmarksgame.alioth.debian.org/
;;
;; Adapted from the C (gcc) code by Lorenzo Bolla
(declaim (optimize (speed 3) (safety 0) (debug 0)))
(define-alien-type mp-limb-t unsigned-int)
(define-alien-type mp-bitcnt-t unsigned-long)
(define-alien-type mpz-struct
(struct nil
(mp-alloc int)
(mp-size int)
(mp-d mp-limb-t)))
(define-alien-type mpz-ptr (* mpz-struct))
(define-alien-type mpz-srcptr (* mpz-struct))
(declaim (inline mpz-init))
(define-alien-routine ("__gmpz_init" mpz-init)
void
(a mpz-ptr))
(declaim (inline mpz-init-set-ui))
(define-alien-routine ("__gmpz_init_set_ui" mpz-init-set-ui)
void
(a mpz-ptr)
(b unsigned-long))
(declaim (inline mpz-get-ui))
(define-alien-routine ("__gmpz_get_ui" mpz-get-ui)
unsigned-long
(a mpz-srcptr))
(declaim (inline mpz-set-ui))
(define-alien-routine ("__gmpz_set_ui" mpz-set-ui)
void
(a mpz-ptr)
(b unsigned-long))
(declaim (inline mpz-cmp))
(define-alien-routine ("__gmpz_cmp" mpz-cmp)
int
(a mpz-srcptr)
(b mpz-srcptr))
(declaim (inline mpz-add))
(define-alien-routine ("__gmpz_add" mpz-add)
void
(a mpz-ptr)
(b mpz-srcptr)
(c mpz-srcptr))
(declaim (inline mpz-mul-2exp))
(define-alien-routine ("__gmpz_mul_2exp" mpz-mul-2exp)
void
(a mpz-ptr)
(b mpz-srcptr)
(c mp-bitcnt-t))
(declaim (inline mpz-fdiv-qr))
(define-alien-routine ("__gmpz_fdiv_qr" mpz-fdiv-qr)
void
(a mpz-ptr)
(b mpz-ptr)
(c mpz-srcptr)
(d mpz-srcptr))
(declaim (inline mpz-mul-ui))
(define-alien-routine ("__gmpz_mul_ui" mpz-mul-ui)
void
(a mpz-ptr)
(b mpz-srcptr)
(c unsigned-long))
(declaim (inline mpz-submul-ui))
(define-alien-routine ("__gmpz_submul_ui" mpz-submul-ui)
void
(a mpz-ptr)
(b mpz-srcptr)
(c unsigned-long))
(defvar *libgmp-so* (load-shared-object "libgmp.so"))
(defvar *tmp1*)
(defvar *tmp2*)
(defvar *num*)
(defvar *acc*)
(defvar *den*)
(defun init ()
(setf *tmp1* (make-alien mpz-struct))
(setf *tmp2* (make-alien mpz-struct))
(setf *num* (make-alien mpz-struct))
(setf *acc* (make-alien mpz-struct))
(setf *den* (make-alien mpz-struct)))
(defun cleanup ()
(free-alien *tmp1*)
(free-alien *tmp2*)
(free-alien *num*)
(free-alien *acc*)
(free-alien *den*))
(defun extract-digit ()
(if (> (mpz-cmp *num* *acc*) 0)
-1
(progn
(mpz-mul-2exp *tmp1* *num* 1)
(mpz-add *tmp1* *tmp1* *num*)
(mpz-add *tmp1* *tmp1* *acc*)
(mpz-fdiv-qr *tmp1* *tmp2* *tmp1* *den*)
(mpz-add *tmp2* *tmp2* *num*)
(if (>= (mpz-cmp *tmp2* *den*) 0)
-1
(mpz-get-ui *tmp1*)))))
(defun next-term (k)
(declare (type fixnum k))
(let ((y2 (1+ (* 2 k))))
(mpz-mul-2exp *tmp1* *num* 1)
(mpz-add *acc* *acc* *tmp1*)
(mpz-mul-ui *acc* *acc* y2)
(mpz-mul-ui *num* *num* k)
(mpz-mul-ui *den* *den* y2)))
(defun eliminate-digit (d)
(mpz-submul-ui *acc* *den* d)
(mpz-mul-ui *acc* *acc* 10)
(mpz-mul-ui *num* *num* 10))
(defun pidigits (n)
(declare (type fixnum n))
(let ((d 0)
(k 0)
(i 0)
(m 0))
(declare (type fixnum d k i m))
(mpz-init *tmp1*)
(mpz-init *tmp2*)
(mpz-init-set-ui *num* 1)
(mpz-init-set-ui *acc* 0)
(mpz-init-set-ui *den* 1)
(loop
(loop
(incf k)
(next-term k)
;; Uses only one bigint division instead of two when checking a produced digit's validity.
;; (setf d (extract-digit))
(unless (= d -1)
(return)))
(format t "~D" d)
(incf i)
(setf m (rem i 10))
(when (= m 0)
(format t " :~D~%" i))
(when (>= i n)
(return))
(eliminate-digit d))
(unless (= m 0)
(format t " :~D~%" n))))
(defun main (&optional n-supplied)
(let ((n (or n-supplied
(parse-integer (or (car (last #+sbcl sb-ext:*posix-argv*
#+clisp ext:*args*
#+cmu extensions:*command-line-strings*
#+gcl si::*command-args*))
"2000")))))
(init)
(pidigits n)
(cleanup)))
notes, command-line, and program output
NOTES:
64-bit Ubuntu quad core
SBCL 1.4.0
Thu, 26 Oct 2017 17:27:35 GMT
MAKE:
cp: 'pidigits.sbcl' and './pidigits.sbcl' are the same file
SBCL built with: /opt/src/sbcl-1.4.0/bin/sbcl --userinit /dev/null --batch --eval '(load "pidigits.sbcl_compile")'
### START pidigits.sbcl_compile
(handler-bind ((sb-ext:defconstant-uneql (lambda (c) (abort c)))) (load (compile-file "pidigits.sbcl" ))) (save-lisp-and-die "sbcl.core" :purify t)
### END pidigits.sbcl_compile
; compiling file "/home/dunham/benchmarksgame/bench/pidigits/pidigits.sbcl" (written 06 OCT 2016 10:51:43 AM):
; compiling (DECLAIM (OPTIMIZE # ...))
; compiling (DEFINE-ALIEN-TYPE MP-LIMB-T ...)
; compiling (DEFINE-ALIEN-TYPE MP-BITCNT-T ...)
; compiling (DEFINE-ALIEN-TYPE MPZ-STRUCT ...)
; compiling (DEFINE-ALIEN-TYPE MPZ-PTR ...)
; compiling (DEFINE-ALIEN-TYPE MPZ-SRCPTR ...)
; compiling (DECLAIM (INLINE MPZ-INIT))
; compiling (DEFINE-ALIEN-ROUTINE ("__gmpz_init" MPZ-INIT) ...)
; compiling (DECLAIM (INLINE MPZ-INIT-SET-UI))
; compiling (DEFINE-ALIEN-ROUTINE ("__gmpz_init_set_ui" MPZ-INIT-SET-UI) ...)
; compiling (DECLAIM (INLINE MPZ-GET-UI))
; compiling (DEFINE-ALIEN-ROUTINE ("__gmpz_get_ui" MPZ-GET-UI) ...)
; file: /home/dunham/benchmarksgame/bench/pidigits/pidigits.sbcl
; in: DEFINE-ALIEN-ROUTINE ("__gmpz_get_ui" MPZ-GET-UI)
; (DEFINE-ALIEN-ROUTINE ("__gmpz_get_ui" MPZ-GET-UI) UNSIGNED-LONG
; (A MPZ-SRCPTR))
; --> PROGN DEFUN PROGN SB-IMPL::%DEFUN SB-IMPL::%DEFUN SB-INT:NAMED-LAMBDA
; --> FUNCTION BLOCK WITH-ALIEN SYMBOL-MACROLET SYMBOL-MACROLET SYMBOL-MACROLET
; --> VALUES PROG1 LET
; ==>
; #:G0
;
; note: doing unsigned word to integer coercion (cost 20) to "<return value>"
; compiling (DECLAIM (INLINE MPZ-SET-UI))
; compiling (DEFINE-ALIEN-ROUTINE ("__gmpz_set_ui" MPZ-SET-UI) ...)
; compiling (DECLAIM (INLINE MPZ-CMP))
; compiling (DEFINE-ALIEN-ROUTINE ("__gmpz_cmp" MPZ-CMP) ...)
; compiling (DECLAIM (INLINE MPZ-ADD))
; compiling (DEFINE-ALIEN-ROUTINE ("__gmpz_add" MPZ-ADD) ...)
; compiling (DECLAIM (INLINE MPZ-MUL-2EXP))
; compiling (DEFINE-ALIEN-ROUTINE ("__gmpz_mul_2exp" MPZ-MUL-2EXP) ...)
; compiling (DECLAIM (INLINE MPZ-FDIV-QR))
; compiling (DEFINE-ALIEN-ROUTINE ("__gmpz_fdiv_qr" MPZ-FDIV-QR) ...)
; compiling (DECLAIM (INLINE MPZ-MUL-UI))
; compiling (DEFINE-ALIEN-ROUTINE ("__gmpz_mul_ui" MPZ-MUL-UI) ...)
; compiling (DECLAIM (INLINE MPZ-SUBMUL-UI))
; compiling (DEFINE-ALIEN-ROUTINE ("__gmpz_submul_ui" MPZ-SUBMUL-UI) ...)
; compiling (DEFVAR *LIBGMP-SO* ...)
; compiling (DEFVAR *TMP1*)
; compiling (DEFVAR *TMP2*)
; compiling (DEFVAR *NUM*)
; compiling (DEFVAR *ACC*)
; compiling (DEFVAR *DEN*)
; compiling (DEFUN INIT ...)
; compiling (DEFUN CLEANUP ...)
; compiling (DEFUN EXTRACT-DIGIT ...)
; file: /home/dunham/benchmarksgame/bench/pidigits/pidigits.sbcl
; in: DEFUN EXTRACT-DIGIT
; (MPZ-GET-UI *TMP1*)
; --> BLOCK WITH-ALIEN SYMBOL-MACROLET SYMBOL-MACROLET SYMBOL-MACROLET VALUES
; --> PROG1 LET
; ==>
; #:G4
;
; note: doing unsigned word to integer coercion (cost 20) to "<return value>"
; compiling (DEFUN NEXT-TERM ...)
; compiling (DEFUN ELIMINATE-DIGIT ...)
; compiling (DEFUN PIDIGITS ...)
; compiling (DEFUN MAIN ...);
; compilation unit finished
; printed 2 notes
; /home/dunham/benchmarksgame_quadcore/pidigits/tmp/pidigits.fasl written
; compilation finished in 0:00:00.123
STYLE-WARNING: Undefined alien: "__gmpz_init"
STYLE-WARNING: Undefined alien: "__gmpz_init_set_ui"
STYLE-WARNING: Undefined alien: "__gmpz_get_ui"
STYLE-WARNING: Undefined alien: "__gmpz_set_ui"
STYLE-WARNING: Undefined alien: "__gmpz_cmp"
STYLE-WARNING: Undefined alien: "__gmpz_add"
STYLE-WARNING: Undefined alien: "__gmpz_mul_2exp"
STYLE-WARNING: Undefined alien: "__gmpz_fdiv_qr"
STYLE-WARNING: Undefined alien: "__gmpz_mul_ui"
STYLE-WARNING: Undefined alien: "__gmpz_submul_ui"
### START pidigits.sbcl_run
(main) (quit)
### END pidigits.sbcl_run
3.63s to complete and log all make actions
COMMAND LINE:
/opt/src/sbcl-1.4.0/bin/sbcl --noinform --core sbcl.core --userinit /dev/null --load pidigits.sbcl_run 2000
UNEXPECTED OUTPUT
1,200c1,200
< 0000000000 :10
< 0000000000 :20
< 0000000000 :30
< 0000000000 :40
< 0000000000 :50
< 0000000000 :60
< 0000000000 :70
< 0000000000 :80
< 0000000000 :90
< 0000000000 :100
< 0000000000 :110
< 0000000000 :120
< 0000000000 :130
< 0000000000 :140
< 0000000000 :150
< 0000000000 :160
< 0000000000 :170
< 0000000000 :180
< 0000000000 :190
< 0000000000 :200
< 0000000000 :210
< 0000000000 :220
< 0000000000 :230
< 0000000000 :240
< 0000000000 :250
< 0000000000 :260
< 0000000000 :270
< 0000000000 :280
< 0000000000 :290
< 0000000000 :300
< 0000000000 :310
< 0000000000 :320
< 0000000000 :330
< 0000000000 :340
< 0000000000 :350
< 0000000000 :360
< 0000000000 :370
< 0000000000 :380
< 0000000000 :390
< 0000000000 :400
< 0000000000 :410
< 0000000000 :420
< 0000000000 :430
< 0000000000 :440
< 0000000000 :450
< 0000000000 :460
< 0000000000 :470
< 0000000000 :480
< 0000000000 :490
< 0000000000 :500
< 0000000000 :510
< 0000000000 :520
< 0000000000 :530
< 0000000000 :540
< 0000000000 :550
< 0000000000 :560
< 0000000000 :570
< 0000000000 :580
< 0000000000 :590
< 0000000000 :600
< 0000000000 :610
< 0000000000 :620
< 0000000000 :630
< 0000000000 :640
< 0000000000 :650
< 0000000000 :660
< 0000000000 :670
< 0000000000 :680
< 0000000000 :690
< 0000000000 :700
< 0000000000 :710
< 0000000000 :720
< 0000000000 :730
< 0000000000 :740
< 0000000000 :750
< 0000000000 :760
< 0000000000 :770
< 0000000000 :780
< 0000000000 :790
< 0000000000 :800
< 0000000000 :810
< 0000000000 :820
< 0000000000 :830
< 0000000000 :840
< 0000000000 :850
< 0000000000 :860
< 0000000000 :870
< 0000000000 :880
< 0000000000 :890
< 0000000000 :900
< 0000000000 :910
< 0000000000 :920
< 0000000000 :930
< 0000000000 :940
< 0000000000 :950
< 0000000000 :960
< 0000000000 :970
< 0000000000 :980
< 0000000000 :990
< 0000000000 :1000
< 0000000000 :1010
< 0000000000 :1020
< 0000000000 :1030
< 0000000000 :1040
< 0000000000 :1050
< 0000000000 :1060
< 0000000000 :1070
< 0000000000 :1080
< 0000000000 :1090
< 0000000000 :1100
< 0000000000 :1110
< 0000000000 :1120
< 0000000000 :1130
< 0000000000 :1140
< 0000000000 :1150
< 0000000000 :1160
< 0000000000 :1170
< 0000000000 :1180
< 0000000000 :1190
< 0000000000 :1200
< 0000000000 :1210
< 0000000000 :1220
< 0000000000 :1230
< 0000000000 :1240
< 0000000000 :1250
< 0000000000 :1260
< 0000000000 :1270
< 0000000000 :1280
< 0000000000 :1290
< 0000000000 :1300
< 0000000000 :1310
< 0000000000 :1320
< 0000000000 :1330
< 0000000000 :1340
< 0000000000 :1350
< 0000000000 :1360
< 0000000000 :1370
< 0000000000 :1380
< 0000000000 :1390
< 0000000000 :1400
< 0000000000 :1410
< 0000000000 :1420
< 0000000000 :1430
< 0000000000 :1440
< 0000000000 :1450
< 0000000000 :1460
< 0000000000 :1470
< 0000000000 :1480
< 0000000000 :1490
< 0000000000 :1500
< 0000000000 :1510
< 0000000000 :1520
< 0000000000 :1530
< 0000000000 :1540
< 0000000000 :1550
< 0000000000 :1560
< 0000000000 :1570
< 0000000000 :1580
< 0000000000 :1590
< 0000000000 :1600
< 0000000000 :1610
< 0000000000 :1620
< 0000000000 :1630
< 0000000000 :1640
< 0000000000 :1650
< 0000000000 :1660
< 0000000000 :1670
< 0000000000 :1680
< 0000000000 :1690
< 0000000000 :1700
< 0000000000 :1710
< 0000000000 :1720
< 0000000000 :1730
< 0000000000 :1740
< 0000000000 :1750
< 0000000000 :1760
< 0000000000 :1770
< 0000000000 :1780
< 0000000000 :1790
< 0000000000 :1800
< 0000000000 :1810
< 0000000000 :1820
< 0000000000 :1830
< 0000000000 :1840
< 0000000000 :1850
< 0000000000 :1860
< 0000000000 :1870
< 0000000000 :1880
< 0000000000 :1890
< 0000000000 :1900
< 0000000000 :1910
< 0000000000 :1920
< 0000000000 :1930
< 0000000000 :1940
< 0000000000 :1950
< 0000000000 :1960
< 0000000000 :1970
< 0000000000 :1980
< 0000000000 :1990
< 0000000000 :2000
---
> 3141592653 :10
> 5897932384 :20
> 6264338327 :30
> 9502884197 :40
> 1693993751 :50
> 0582097494 :60
> 4592307816 :70
> 4062862089 :80
> 9862803482 :90
> 5342117067 :100
> 9821480865 :110
> 1328230664 :120
> 7093844609 :130
> 5505822317 :140
> 2535940812 :150
> 8481117450 :160
> 2841027019 :170
> 3852110555 :180
> 9644622948 :190
> 9549303819 :200
> 6442881097 :210
> 5665933446 :220
> 1284756482 :230
> 3378678316 :240
> 5271201909 :250
> 1456485669 :260
> 2346034861 :270
> 0454326648 :280
> 2133936072 :290
> 6024914127 :300
> 3724587006 :310
> 6063155881 :320
> 7488152092 :330
> 0962829254 :340
> 0917153643 :350
> 6789259036 :360
> 0011330530 :370
> 5488204665 :380
> 2138414695 :390
> 1941511609 :400
> 4330572703 :410
> 6575959195 :420
> 3092186117 :430
> 3819326117 :440
> 9310511854 :450
> 8074462379 :460
> 9627495673 :470
> 5188575272 :480
> 4891227938 :490
> 1830119491 :500
> 2983367336 :510
> 2440656643 :520
> 0860213949 :530
> 4639522473 :540
> 7190702179 :550
> 8609437027 :560
> 7053921717 :570
> 6293176752 :580
> 3846748184 :590
> 6766940513 :600
> 2000568127 :610
> 1452635608 :620
> 2778577134 :630
> 2757789609 :640
> 1736371787 :650
> 2146844090 :660
> 1224953430 :670
> 1465495853 :680
> 7105079227 :690
> 9689258923 :700
> 5420199561 :710
> 1212902196 :720
> 0864034418 :730
> 1598136297 :740
> 7477130996 :750
> 0518707211 :760
> 3499999983 :770
> 7297804995 :780
> 1059731732 :790
> 8160963185 :800
> 9502445945 :810
> 5346908302 :820
> 6425223082 :830
> 5334468503 :840
> 5261931188 :850
> 1710100031 :860
> 3783875288 :870
> 6587533208 :880
> 3814206171 :890
> 7766914730 :900
> 3598253490 :910
> 4287554687 :920
> 3115956286 :930
> 3882353787 :940
> 5937519577 :950
> 8185778053 :960
> 2171226806 :970
> 6130019278 :980
> 7661119590 :990
> 9216420198 :1000
> 9380952572 :1010
> 0106548586 :1020
> 3278865936 :1030
> 1533818279 :1040
> 6823030195 :1050
> 2035301852 :1060
> 9689957736 :1070
> 2259941389 :1080
> 1249721775 :1090
> 2834791315 :1100
> 1557485724 :1110
> 2454150695 :1120
> 9508295331 :1130
> 1686172785 :1140
> 5889075098 :1150
> 3817546374 :1160
> 6493931925 :1170
> 5060400927 :1180
> 7016711390 :1190
> 0984882401 :1200
> 2858361603 :1210
> 5637076601 :1220
> 0471018194 :1230
> 2955596198 :1240
> 9467678374 :1250
> 4944825537 :1260
> 9774726847 :1270
> 1040475346 :1280
> 4620804668 :1290
> 4259069491 :1300
> 2933136770 :1310
> 2898915210 :1320
> 4752162056 :1330
> 9660240580 :1340
> 3815019351 :1350
> 1253382430 :1360
> 0355876402 :1370
> 4749647326 :1380
> 3914199272 :1390
> 6042699227 :1400
> 9678235478 :1410
> 1636009341 :1420
> 7216412199 :1430
> 2458631503 :1440
> 0286182974 :1450
> 5557067498 :1460
> 3850549458 :1470
> 8586926995 :1480
> 6909272107 :1490
> 9750930295 :1500
> 5321165344 :1510
> 9872027559 :1520
> 6023648066 :1530
> 5499119881 :1540
> 8347977535 :1550
> 6636980742 :1560
> 6542527862 :1570
> 5518184175 :1580
> 7467289097 :1590
> 7772793800 :1600
> 0816470600 :1610
> 1614524919 :1620
> 2173217214 :1630
> 7723501414 :1640
> 4197356854 :1650
> 8161361157 :1660
> 3525521334 :1670
> 7574184946 :1680
> 8438523323 :1690
> 9073941433 :1700
> 3454776241 :1710
> 6862518983 :1720
> 5694855620 :1730
> 9921922218 :1740
> 4272550254 :1750
> 2568876717 :1760
> 9049460165 :1770
> 3466804988 :1780
> 6272327917 :1790
> 8608578438 :1800
> 3827967976 :1810
> 6814541009 :1820
> 5388378636 :1830
> 0950680064 :1840
> 2251252051 :1850
> 1739298489 :1860
> 6084128488 :1870
> 6269456042 :1880
> 4196528502 :1890
> 2210661186 :1900
> 3067442786 :1910
> 2203919494 :1920
> 5047123713 :1930
> 7869609563 :1940
> 6437191728 :1950
> 7467764657 :1960
> 5739624138 :1970
> 9086583264 :1980
> 5995813390 :1990
> 4780275900 :2000
PROGRAM OUTPUT:
0000000000 :10
0000000000 :20
0000000000 :30
0000000000 :40
0000000000 :50
0000000000 :60
0000000000 :70
0000000000 :80
0000000000 :90
0000000000 :100
0000000000 :110
0000000000 :120
0000000000 :130
0000000000 :140
0000000000 :150
0000000000 :160
0000000000 :170
0000000000 :180
0000000000 :190
0000000000 :200
0000000000 :210
0000000000 :220
0000000000 :230
0000000000 :240
0000000000 :250
0000000000 :260
0000000000 :270
0000000000 :280
0000000000 :290
0000000000 :300
0000000000 :310
0000000000 :320
0000000000 :330
0000000000 :340
0000000000 :350
0000000000 :360
0000000000 :370
0000000000 :380
0000000000 :390
0000000000 :400
0000000000 :410
0000000000 :420
0000000000 :430
0000000000 :440
0000000000 :450
0000000000 :460
0000000000 :470
0000000000 :480
0000000000 :490
0000000000 :500
0000000000 :510
0000000000 :520
0000000000 :530
0000000000 :540
0000000000 :550
0000000000 :560
0000000000 :570
0000000000 :580
0000000000 :590
0000000000 :600
0000000000 :610
0000000000 :620
0000000000 :630
0000000000 :640
0000000000 :650
0000000000 :660
0000000000 :670
0000000000 :680
0000000000 :690
0000000000 :700
0000000000 :710
0000000000 :720
0000000000 :730
0000000000 :740
0000000000 :750
0000000000 :760
0000000000 :770
0000000000 :780
0000000000 :790
0000000000 :800
0000000000 :810
0000000000 :820
0000000000 :830
0000000000 :840
0000000000 :850
0000000000 :860
0000000000 :870
0000000000 :880
0000000000 :890
0000000000 :900
0000000000 :910
0000000000 :920
0000000000 :930
0000000000 :940
0000000000 :950
0000000000 :960
0000000000 :970
0000000000 :980
0000000000 :990
0000000000 :1000
0000000000 :1010
0000000000 :1020
0000000000 :1030
0000000000 :1040
0000000000 :1050
0000000000 :1060
0000000000 :1070
0000000000 :1080
0000000000 :1090
0000000000 :1100
0000000000 :1110
0000000000 :1120
0000000000 :1130
0000000000 :1140
0000000000 :1150
0000000000 :1160
0000000000 :1170
0000000000 :1180
0000000000 :1190
0000000000 :1200
0000000000 :1210
0000000000 :1220
0000000000 :1230
0000000000 :1240
0000000000 :1250
0000000000 :1260
0000000000 :1270
0000000000 :1280
0000000000 :1290
0000000000 :1300
0000000000 :1310
0000000000 :1320
0000000000 :1330
0000000000 :1340
0000000000 :1350
0000000000 :1360
0000000000 :1370
0000000000 :1380
0000000000 :1390
0000000000 :1400
0000000000 :1410
0000000000 :1420
0000000000 :1430
0000000000 :1440
0000000000 :1450
0000000000 :1460
0000000000 :1470
0000000000 :1480
0000000000 :1490
0000000000 :1500
0000000000 :1510
0000000000 :1520
0000000000 :1530
0000000000 :1540
0000000000 :1550
0000000000 :1560
0000000000 :1570
0000000000 :1580
0000000000 :1590
0000000000 :1600
0000000000 :1610
0000000000 :1620
0000000000 :1630
0000000000 :1640
0000000000 :1650
0000000000 :1660
0000000000 :1670
0000000000 :1680
0000000000 :1690
0000000000 :1700
0000000000 :1710
0000000000 :1720
0000000000 :1730
0000000000 :1740
0000000000 :1750
0000000000 :1760
0000000000 :1770
0000000000 :1780
0000000000 :1790
0000000000 :1800
0000000000 :1810
0000000000 :1820
0000000000 :1830
0000000000 :1840
0000000000 :1850
0000000000 :1860
0000000000 :1870
0000000000 :1880
0000000000 :1890
0000000000 :1900
0000000000 :1910
0000000000 :1920
0000000000 :1930
0000000000 :1940
0000000000 :1950
0000000000 :1960
0000000000 :1970
0000000000 :1980
0000000000 :1990
0000000000 :2000