The Computer Language
Benchmarks Game

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.3.10


Thu, 06 Oct 2016 18:20:40 GMT

MAKE:
cp: 'pidigits.sbcl' and './pidigits.sbcl' are the same file
SBCL built with: /usr/local/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:48:33 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 LET 
; --> SYMBOL-MACROLET VALUES PROG1 LET 
; ==>
;   #:G28
; 
; 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 LET SYMBOL-MACROLET 
; --> VALUES PROG1 LET 
; ==>
;   #:G239
; 
; 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.823
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"
[undoing binding stack and other enclosing state... done]
[saving current Lisp image into sbcl.core:
writing 5024 bytes from the read-only space at 0x20000000
writing 3072 bytes from the static space at 0x20100000
writing 42795008 bytes from the dynamic space at 0x1000000000
done]
### START pidigits.sbcl_run
(main) (quit)
### END pidigits.sbcl_run

3.53s to complete and log all make actions

COMMAND LINE:
/usr/local/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